summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pki_crypto.c80
1 files changed, 56 insertions, 24 deletions
diff --git a/src/pki_crypto.c b/src/pki_crypto.c
index 1080a809..85471f94 100644
--- a/src/pki_crypto.c
+++ b/src/pki_crypto.c
@@ -1188,6 +1188,61 @@ ssh_string pki_signature_to_blob(const ssh_signature sig)
return sig_blob;
}
+static ssh_signature pki_signature_from_rsa_blob(const ssh_key pubkey,
+ const ssh_string sig_blob,
+ ssh_signature sig)
+{
+ uint32_t pad_len = 0;
+ char *blob_orig;
+ char *blob_padded_data;
+ ssh_string sig_blob_padded;
+
+ size_t len = ssh_string_len(sig_blob);
+ size_t rsalen= RSA_size(pubkey->rsa);
+
+ if (len > rsalen) {
+ ssh_pki_log("Signature is too big: %lu > %lu",
+ (unsigned long)len, (unsigned long)rsalen);
+ goto errout;
+ }
+
+#ifdef DEBUG_CRYPTO
+ ssh_pki_log("RSA signature len: %lu", (unsigned long)len);
+ ssh_print_hexa("RSA signature", ssh_string_data(sig_blob), len);
+#endif
+
+ if (len == rsalen) {
+ sig->rsa_sig = ssh_string_copy(sig_blob);
+ } else {
+ /* pad the blob to the expected rsalen size */
+ ssh_pki_log("RSA signature len %lu < %lu",
+ (unsigned long)len, (unsigned long)rsalen);
+
+ pad_len = rsalen - len;
+
+ sig_blob_padded = ssh_string_new(rsalen);
+ if (sig_blob_padded == NULL) {
+ goto errout;
+ }
+
+ blob_padded_data = (char *) ssh_string_data(sig_blob_padded);
+ blob_orig = (char *) ssh_string_data(sig_blob);
+
+ /* front-pad the buffer with zeroes */
+ BURN_BUFFER(blob_padded_data, pad_len);
+ /* fill the rest with the actual signature blob */
+ memcpy(blob_padded_data + pad_len, blob_orig, len);
+
+ sig->rsa_sig = sig_blob_padded;
+ }
+
+ return sig;
+
+errout:
+ ssh_signature_free(sig);
+ return NULL;
+}
+
ssh_signature pki_signature_from_blob(const ssh_key pubkey,
const ssh_string sig_blob,
enum ssh_keytypes_e type)
@@ -1196,7 +1251,6 @@ ssh_signature pki_signature_from_blob(const ssh_key pubkey,
ssh_string r;
ssh_string s;
size_t len;
- size_t rsalen;
sig = ssh_signature_new();
if (sig == NULL) {
@@ -1260,29 +1314,7 @@ ssh_signature pki_signature_from_blob(const ssh_key pubkey,
break;
case SSH_KEYTYPE_RSA:
case SSH_KEYTYPE_RSA1:
- rsalen = RSA_size(pubkey->rsa);
-
- if (len > rsalen) {
- ssh_pki_log("Signature is to big size: %lu",
- (unsigned long)len);
- ssh_signature_free(sig);
- return NULL;
- }
-
- if (len < rsalen) {
- ssh_pki_log("RSA signature len %lu < %lu",
- (unsigned long)len, (unsigned long)rsalen);
- }
-
-#ifdef DEBUG_CRYPTO
- ssh_pki_log("RSA signature len: %lu", (unsigned long)len);
- ssh_print_hexa("RSA signature", ssh_string_data(sig_blob), len);
-#endif
- sig->rsa_sig = ssh_string_copy(sig_blob);
- if (sig->rsa_sig == NULL) {
- ssh_signature_free(sig);
- return NULL;
- }
+ sig = pki_signature_from_rsa_blob(pubkey, sig_blob, sig);
break;
case SSH_KEYTYPE_ECDSA:
#ifdef HAVE_OPENSSL_ECC