Blob type and algorithm type sanity checks
authorDr. Stephen Henson <steve@openssl.org>
Fri, 30 May 2008 11:54:51 +0000 (11:54 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Fri, 30 May 2008 11:54:51 +0000 (11:54 +0000)
engines/e_capi.c

index c2ca152351ec2f6d9dc91806a7832dec0ee1be74..86fa204990f665b16687a684bce2ca2660fa8b69 100644 (file)
@@ -492,40 +492,57 @@ static EVP_PKEY *capi_load_privkey(ENGINE *eng, const char *key_id,
                }
 
        bh = (BLOBHEADER *)pubkey;
-       rp = (RSAPUBKEY *)(bh + 1);
-       rsa_modulus = (unsigned char *)(rp + 1);
-       rkey = RSA_new_method(eng);
-       if (!rkey)
-               goto memerr;
+       if (bh->bType != PUBLICKEYBLOB)
+               {
+               /* FIXME */
+               fprintf(stderr, "Invalid public key blob\n");
+               goto err;
+               }
+       if (bh->aiKeyAlg == CALG_RSA_SIGN || bh->aiKeyAlg == CALG_RSA_KEYX)
+               {
+               rp = (RSAPUBKEY *)(bh + 1);
+               rsa_modulus = (unsigned char *)(rp + 1);
+               rkey = RSA_new_method(eng);
+               if (!rkey)
+                       goto memerr;
 
-       rkey->e = BN_new();
-       rkey->n = BN_new();
+               rkey->e = BN_new();
+               rkey->n = BN_new();
 
-       if (!rkey->e || !rkey->n)
-               goto memerr;
+               if (!rkey->e || !rkey->n)
+                       goto memerr;
 
-       if (!BN_set_word(rkey->e, rp->pubexp))
-               goto memerr;
+               if (!BN_set_word(rkey->e, rp->pubexp))
+                       goto memerr;
 
-       rsa_modlen = rp->bitlen / 8;
+               rsa_modlen = rp->bitlen / 8;
 
-       for(i = 0; i < rsa_modlen / 2; i++)
-               {
-               unsigned char c;
-               c = rsa_modulus[i];
-               rsa_modulus[i] = rsa_modulus[rsa_modlen - i - 1];
-               rsa_modulus[rsa_modlen - i - 1] = c;
-               }
+               for(i = 0; i < rsa_modlen / 2; i++)
+                       {
+                       unsigned char c;
+                       c = rsa_modulus[i];
+                       rsa_modulus[i] = rsa_modulus[rsa_modlen - i - 1];
+                       rsa_modulus[rsa_modlen - i - 1] = c;
+                       }
 
-       if (!BN_bin2bn(rsa_modulus, rsa_modlen, rkey->n))
-               goto memerr;
+               if (!BN_bin2bn(rsa_modulus, rsa_modlen, rkey->n))
+                       goto memerr;
 
-       RSA_set_ex_data(rkey, rsa_capi_idx, key);
+               RSA_set_ex_data(rkey, rsa_capi_idx, key);
+
+               if (!(ret = EVP_PKEY_new()))
+                       goto memerr;
+
+               EVP_PKEY_assign_RSA(ret, rkey);
 
-       if (!(ret = EVP_PKEY_new()))
-               goto memerr;
 
-       EVP_PKEY_assign_RSA(ret, rkey);
+               }
+       else
+               {
+               fprintf(stderr, "Unsupported Key Algorithm %x\n",
+                                       bh->aiKeyAlg);
+               goto err;
+               }
 
        err:
        if (pubkey)