Support parsing keys that have the group parameter include in the

EC_PrivateKey block. PKCS8's -- PRIVATE KEY -- vs PEM's -- EC PRIVATE KEY --

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@25221 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2009-05-25 23:43:26 +00:00
parent 1eca860a46
commit 6dc1f7bb98

View File

@@ -296,26 +296,41 @@ heim_oid2ecnid(heim_oid *oid)
} }
static int static int
parse_ECParameters(heim_octet_string *parameters, int *nid) parse_ECParameters(hx509_context context,
heim_octet_string *parameters, int *nid)
{ {
ECParameters ecparam; ECParameters ecparam;
size_t size; size_t size;
int ret; int ret;
if (parameters == NULL) {
hx509_set_error_string(context, 0, ret,
"EC parameters missing");
return HX509_PARSING_KEY_FAILED;
}
ret = decode_ECParameters(parameters->data, parameters->length, ret = decode_ECParameters(parameters->data, parameters->length,
&ecparam, &size); &ecparam, &size);
if (ret) if (ret) {
hx509_set_error_string(context, 0, ret,
"Failed to decode EC parameters");
return ret; return ret;
}
if (ecparam.element != choice_ECParameters_namedCurve) { if (ecparam.element != choice_ECParameters_namedCurve) {
free_ECParameters(&ecparam); free_ECParameters(&ecparam);
hx509_set_error_string(context, 0, ret,
"EC parameters is not a named curve");
return HX509_CRYPTO_SIG_INVALID_FORMAT; return HX509_CRYPTO_SIG_INVALID_FORMAT;
} }
*nid = heim_oid2ecnid(&ecparam.u.namedCurve); *nid = heim_oid2ecnid(&ecparam.u.namedCurve);
free_ECParameters(&ecparam); free_ECParameters(&ecparam);
if (*nid == -1) if (*nid == -1) {
hx509_set_error_string(context, 0, ret,
"Failed to find matcing NID for EC curve");
return HX509_CRYPTO_SIG_INVALID_FORMAT; return HX509_CRYPTO_SIG_INVALID_FORMAT;
}
return 0; return 0;
} }
@@ -357,8 +372,7 @@ ecdsa_verify_signature(hx509_context context,
/* set up EC KEY */ /* set up EC KEY */
spi = &signer->tbsCertificate.subjectPublicKeyInfo; spi = &signer->tbsCertificate.subjectPublicKeyInfo;
if (der_heim_oid_cmp(&spi->algorithm.algorithm, &asn1_oid_id_ecPublicKey) != 0 || if (der_heim_oid_cmp(&spi->algorithm.algorithm, &asn1_oid_id_ecPublicKey) != 0)
spi->algorithm.parameters == NULL)
return HX509_CRYPTO_SIG_INVALID_FORMAT; return HX509_CRYPTO_SIG_INVALID_FORMAT;
#ifdef HAVE_OPENSSL #ifdef HAVE_OPENSSL
@@ -366,7 +380,7 @@ ecdsa_verify_signature(hx509_context context,
* Find the group id * Find the group id
*/ */
ret = parse_ECParameters(spi->algorithm.parameters, &groupnid); ret = parse_ECParameters(context, spi->algorithm.parameters, &groupnid);
if (ret) { if (ret) {
der_free_octet_string(&digest); der_free_octet_string(&digest);
return ret; return ret;
@@ -936,37 +950,38 @@ ecdsa_private_key_import(hx509_context context,
hx509_private_key private_key) hx509_private_key private_key)
{ {
const unsigned char *p = data; const unsigned char *p = data;
EC_GROUP *group; EC_KEY **pkey = NULL;
EC_KEY *key;
int groupnid;
int ret;
if (keyai->parameters == NULL) if (keyai->parameters) {
return HX509_PARSING_KEY_FAILED; EC_GROUP *group;
int groupnid;
EC_KEY *key;
int ret;
ret = parse_ECParameters(keyai->parameters, &groupnid); ret = parse_ECParameters(context, keyai->parameters, &groupnid);
if (ret) if (ret)
return ret; return ret;
key = EC_KEY_new(); key = EC_KEY_new();
if (key == NULL) if (key == NULL)
return ENOMEM; return ENOMEM;
group = EC_GROUP_new_by_curve_name(groupnid); group = EC_GROUP_new_by_curve_name(groupnid);
if (group == NULL) { if (group == NULL) {
EC_KEY_free(key); EC_KEY_free(key);
return ENOMEM; return ENOMEM;
} }
EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE); EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE);
if (EC_KEY_set_group(key, group) == 0) { if (EC_KEY_set_group(key, group) == 0) {
EC_KEY_free(key); EC_KEY_free(key);
EC_GROUP_free(group);
return ENOMEM;
}
EC_GROUP_free(group); EC_GROUP_free(group);
return ENOMEM; pkey = &key;
} }
EC_GROUP_free(group);
private_key->private_key.ecdsa = d2i_ECPrivateKey(pkey, &p, len);
private_key->private_key.ecdsa = d2i_ECPrivateKey(&key, &p, len);
if (private_key->private_key.ecdsa == NULL) { if (private_key->private_key.ecdsa == NULL) {
hx509_set_error_string(context, 0, HX509_PARSING_KEY_FAILED, hx509_set_error_string(context, 0, HX509_PARSING_KEY_FAILED,
"Failed to parse EC private key"); "Failed to parse EC private key");