diff options
author | Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM> | 2010-01-25 13:27:34 -0800 |
---|---|---|
committer | Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM> | 2010-01-25 13:27:34 -0800 |
commit | 26b0c1728076c148c498bea54f4b146fac3a4f6f (patch) | |
tree | d316a0b7454eb379b638dd71b8fcf019691da58c /usr/src/lib/pkcs11/pkcs11_softtoken/common | |
parent | 2c8230b0dc207870ae2a092351f10fe53091275b (diff) | |
download | illumos-gate-26b0c1728076c148c498bea54f4b146fac3a4f6f.tar.gz |
6918510 softtoken does not save EC key data correctly
Diffstat (limited to 'usr/src/lib/pkcs11/pkcs11_softtoken/common')
-rw-r--r-- | usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeystore.c | 60 |
1 files changed, 58 insertions, 2 deletions
diff --git a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeystore.c b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeystore.c index 8edfbedb7f..a2356b0afb 100644 --- a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeystore.c +++ b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softKeystore.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. + * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -592,7 +592,13 @@ soft_pack_object_size(soft_object_t *objp) ROUNDUP(((biginteger_t *) OBJ_PUB_DSA_VALUE(objp))->big_value_len, 8) + 4 * sizeof (uint64_t)); - + case CKK_EC: + /* + * ec_point_len + ec_point + */ + return (ROUNDUP(((biginteger_t *) + OBJ_PUB_EC_POINT(objp))->big_value_len, 8) + + sizeof (uint64_t)); case CKK_DH: /* * prime_len + prime + base_len + base + @@ -679,6 +685,14 @@ soft_pack_object_size(soft_object_t *objp) OBJ_PRI_DH_VALUE(objp))->big_value_len, 8) + 4 * sizeof (uint64_t)); + case CKK_EC: + /* + * value_len + value + */ + return (ROUNDUP(((biginteger_t *) + OBJ_PRI_EC_VALUE(objp))->big_value_len, 8) + + sizeof (uint64_t)); + case CKK_X9_42_DH: /* * prime_len + prime + base_len + base + @@ -835,6 +849,18 @@ soft_pack_object(soft_object_t *objp, uchar_t *buf) OBJ_PUB_DSA_VALUE(objp))->big_value_len); break; + case CKK_EC: + /* point_len + point */ + tmp_val = SWAP64((uint64_t)((biginteger_t *) + OBJ_PUB_EC_POINT(objp))->big_value_len); + (void) memcpy(buf, (char *)&tmp_val, sizeof (uint64_t)); + buf = buf + sizeof (uint64_t); + + (void) memcpy(buf, (char *)((biginteger_t *) + OBJ_PUB_EC_POINT(objp))->big_value, + ((biginteger_t *) + OBJ_PUB_EC_POINT(objp))->big_value_len); + break; case CKK_DH: /* prime_len + prime */ @@ -1093,6 +1119,18 @@ soft_pack_object(soft_object_t *objp, uchar_t *buf) OBJ_PRI_DSA_VALUE(objp))->big_value_len); break; + case CKK_EC: + /* value_len + value */ + tmp_val = SWAP64((uint64_t)((biginteger_t *) + OBJ_PRI_EC_VALUE(objp))->big_value_len); + (void) memcpy(buf, (char *)&tmp_val, sizeof (uint64_t)); + buf = buf + sizeof (uint64_t); + + (void) memcpy(buf, (char *)((biginteger_t *) + OBJ_PRI_EC_VALUE(objp))->big_value, + ((biginteger_t *) + OBJ_PRI_EC_VALUE(objp))->big_value_len); + break; case CKK_DH: /* value_bits */ @@ -1423,6 +1461,15 @@ soft_unpack_object(soft_object_t *objp, uchar_t *buf) break; + case CKK_EC: + /* ec_point */ + if ((rv = soft_unpack_obj_attribute(buf, &value, + NULL, &offset, B_FALSE)) != CKR_OK) + goto pri_cleanup; + + copy_bigint_attr(&value, KEY_PUB_EC_POINT(pbk)); + break; + case CKK_X9_42_DH: /* prime */ if ((rv = soft_unpack_obj_attribute(buf, &prime, @@ -1618,6 +1665,15 @@ soft_unpack_object(soft_object_t *objp, uchar_t *buf) break; + case CKK_EC: + /* value */ + if ((rv = soft_unpack_obj_attribute(buf, &value, + NULL, &offset, B_FALSE)) != CKR_OK) + goto pri_cleanup; + + copy_bigint_attr(&value, KEY_PRI_EC_VALUE(pvk)); + break; + case CKK_X9_42_DH: /* prime */ if ((rv = soft_unpack_obj_attribute(buf, &prime, |