summaryrefslogtreecommitdiff
path: root/usr/src/lib/pkcs11/pkcs11_softtoken/common
diff options
context:
space:
mode:
authorWyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>2010-01-25 13:27:34 -0800
committerWyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>2010-01-25 13:27:34 -0800
commit26b0c1728076c148c498bea54f4b146fac3a4f6f (patch)
treed316a0b7454eb379b638dd71b8fcf019691da58c /usr/src/lib/pkcs11/pkcs11_softtoken/common
parent2c8230b0dc207870ae2a092351f10fe53091275b (diff)
downloadillumos-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.c60
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,