summaryrefslogtreecommitdiff
path: root/usr/src/lib/pkcs11/pkcs11_softtoken/common/softDSA.c
diff options
context:
space:
mode:
authorDina K Nimeh <Dina.Nimeh@Sun.COM>2010-06-07 08:54:25 -0700
committerDina K Nimeh <Dina.Nimeh@Sun.COM>2010-06-07 08:54:25 -0700
commit726fad2a65f16c200a03969c29cb5c86c2d427db (patch)
treeaca280cc44a7b599ab39116a9229a98428f7c9d7 /usr/src/lib/pkcs11/pkcs11_softtoken/common/softDSA.c
parentad559bec55fd74f310399483501e1fa231f65528 (diff)
downloadillumos-joyent-726fad2a65f16c200a03969c29cb5c86c2d427db.tar.gz
6875651 move asymmetric crypto to libsoftcrypto
6816864 collect together padding methods used by PKCS#11 6917508 bignum library needs big random number function 6249983 softtoken based RSA/DSA slow on Niagara 6917506 arcfour lint check missing from usr/src/uts/sun4v/Makefile 6917513 move softFipsDSAUtil.c to common/crypto/fips/fips_dsa_util.c 6834849 dsa_sign() produces invalid signature when pkcs11 engine is used via openssl(1) for certain keys
Diffstat (limited to 'usr/src/lib/pkcs11/pkcs11_softtoken/common/softDSA.c')
-rw-r--r--usr/src/lib/pkcs11/pkcs11_softtoken/common/softDSA.c473
1 files changed, 80 insertions, 393 deletions
diff --git a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softDSA.c b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softDSA.c
index 24e3d1b7f5..b366cc2171 100644
--- a/usr/src/lib/pkcs11/pkcs11_softtoken/common/softDSA.c
+++ b/usr/src/lib/pkcs11/pkcs11_softtoken/common/softDSA.c
@@ -18,9 +18,9 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#include <pthread.h>
@@ -29,12 +29,11 @@
#include <strings.h>
#include <sys/types.h>
#include <security/cryptoki.h>
-#include <bignum.h>
+#include <cryptoutil.h>
#include "softGlobal.h"
#include "softSession.h"
#include "softObject.h"
#include "softDSA.h"
-#include "softRandom.h"
#include "softOps.h"
#include "softMAC.h"
#include "softCrypt.h"
@@ -114,76 +113,11 @@ soft_dsa_sign_verify_init_common(soft_session_t *session_p,
}
-/* size is in bits */
-BIG_ERR_CODE
-DSA_key_init(DSAkey *key, int size)
-{
- BIG_ERR_CODE err;
- int len, len160;
-
- len = BITLEN2BIGNUMLEN(size);
- len160 = BIG_CHUNKS_FOR_160BITS;
- key->size = size;
- if ((err = big_init1(&(key->q), len160, NULL, 0)) != BIG_OK)
- return (err);
- if ((err = big_init1(&(key->p), len, NULL, 0)) != BIG_OK)
- goto ret1;
- if ((err = big_init1(&(key->g), len, NULL, 0)) != BIG_OK)
- goto ret2;
- if ((err = big_init1(&(key->x), len160, NULL, 0)) != BIG_OK)
- goto ret3;
- if ((err = big_init1(&(key->y), len, NULL, 0)) != BIG_OK)
- goto ret4;
- if ((err = big_init1(&(key->k), len160, NULL, 0)) != BIG_OK)
- goto ret5;
- if ((err = big_init1(&(key->r), len160, NULL, 0)) != BIG_OK)
- goto ret6;
- if ((err = big_init1(&(key->s), len160, NULL, 0)) != BIG_OK)
- goto ret7;
- if ((err = big_init1(&(key->v), len160, NULL, 0)) != BIG_OK)
- goto ret8;
-
- return (BIG_OK);
-
-ret8:
- big_finish(&(key->s));
-ret7:
- big_finish(&(key->r));
-ret6:
- big_finish(&(key->k));
-ret5:
- big_finish(&(key->y));
-ret4:
- big_finish(&(key->x));
-ret3:
- big_finish(&(key->g));
-ret2:
- big_finish(&(key->p));
-ret1:
- big_finish(&(key->q));
- return (err);
-}
-
-
-void
-DSA_key_finish(DSAkey *key)
-{
- big_finish(&(key->v));
- big_finish(&(key->s));
- big_finish(&(key->r));
- big_finish(&(key->k));
- big_finish(&(key->y));
- big_finish(&(key->x));
- big_finish(&(key->g));
- big_finish(&(key->p));
- big_finish(&(key->q));
-}
-
-
-CK_RV
-dsa_sign(soft_object_t *key, CK_BYTE_PTR in, CK_ULONG inlen, CK_BYTE_PTR out)
+static CK_RV
+local_dsa_sign(soft_object_t *key, CK_BYTE_PTR in, CK_ULONG inlen,
+ CK_BYTE_PTR out)
{
-
+ CK_RV rv;
uchar_t q[MAX_KEY_ATTR_BUFLEN];
uchar_t p[MAX_KEY_ATTR_BUFLEN];
uchar_t g[MAX_KEY_ATTR_BUFLEN];
@@ -192,22 +126,14 @@ dsa_sign(soft_object_t *key, CK_BYTE_PTR in, CK_ULONG inlen, CK_BYTE_PTR out)
uint_t plen = sizeof (p);
uint_t glen = sizeof (g);
uint_t xlen = sizeof (x);
- DSAkey dsakey;
- BIGNUM msg, tmp, tmp1, tmp2;
- BIG_ERR_CODE err;
- CK_RV rv;
+ DSAbytekey k;
- rv = soft_get_private_value(key, CKA_SUBPRIME, q, &qlen);
+ rv = soft_get_private_value(key, CKA_PRIME, p, &plen);
if (rv != CKR_OK) {
goto clean1;
}
- if (DSA_SUBPRIME_BYTES != qlen) {
- rv = CKR_KEY_SIZE_RANGE;
- goto clean1;
- }
-
- rv = soft_get_private_value(key, CKA_PRIME, p, &plen);
+ rv = soft_get_private_value(key, CKA_SUBPRIME, q, &qlen);
if (rv != CKR_OK) {
goto clean1;
}
@@ -222,103 +148,26 @@ dsa_sign(soft_object_t *key, CK_BYTE_PTR in, CK_ULONG inlen, CK_BYTE_PTR out)
goto clean1;
}
- if (DSA_SUBPRIME_BYTES < xlen) {
- rv = CKR_KEY_SIZE_RANGE;
- goto clean1;
- }
-
- if ((err = DSA_key_init(&dsakey, plen * 8)) != BIG_OK) {
- rv = CKR_HOST_MEMORY;
- goto clean1;
- }
-
- if ((err = big_init(&msg, BIG_CHUNKS_FOR_160BITS)) != BIG_OK) {
- goto clean6;
- }
- if ((err = big_init(&tmp, CHARLEN2BIGNUMLEN(plen) +
- 2 * BIG_CHUNKS_FOR_160BITS + 1)) != BIG_OK) {
- goto clean7;
- }
- if ((err = big_init(&tmp1, 2 * BIG_CHUNKS_FOR_160BITS + 1)) != BIG_OK) {
- goto clean8;
- }
- if ((err = big_init(&tmp2, BIG_CHUNKS_FOR_160BITS)) != BIG_OK) {
- goto clean9;
- }
-
- bytestring2bignum(&(dsakey.g), g, plen);
- bytestring2bignum(&(dsakey.x), x, DSA_SUBPRIME_BYTES);
- bytestring2bignum(&(dsakey.p), p, plen);
- bytestring2bignum(&(dsakey.q), q, DSA_SUBPRIME_BYTES);
- bytestring2bignum(&msg, (uchar_t *)in, inlen);
-
- if ((err = random_bignum(&(dsakey.k), DSA_SUBPRIME_BITS,
- B_FALSE)) != BIG_OK)
- goto clean10;
-
- if ((err = big_div_pos(NULL, &(dsakey.k), &(dsakey.k),
- &(dsakey.q))) != BIG_OK)
- goto clean10;
-
- if ((err = big_modexp(&tmp, &(dsakey.g), &(dsakey.k), &(dsakey.p),
- NULL)) != BIG_OK)
- goto clean10;
-
- if ((err = big_div_pos(NULL, &(dsakey.r), &tmp, &(dsakey.q))) !=
- BIG_OK)
- goto clean10;
+ k.prime = p;
+ k.prime_bits = CRYPTO_BYTES2BITS(plen);
+ k.subprime = q;
+ k.subprime_bits = CRYPTO_BYTES2BITS(qlen);
+ k.base = g;
+ k.base_bytes = glen;
+ k.private_x_bits = CRYPTO_BYTES2BITS(xlen);
+ k.private_x = x;
+ k.rfunc = NULL;
- if ((err = big_ext_gcd_pos(NULL, NULL, &tmp, &(dsakey.q),
- &(dsakey.k))) != BIG_OK)
- goto clean10;
+ rv = dsa_sign(&k, in, inlen, out);
- if (tmp.sign == -1)
- if ((err = big_add(&tmp, &tmp, &(dsakey.q))) != BIG_OK)
- goto clean10; /* tmp <- k^-1 */
-
- if ((err = big_mul(&tmp1, &(dsakey.x), &(dsakey.r))) != BIG_OK)
- goto clean10;
-
- if ((err = big_add(&tmp1, &tmp1, &msg)) != BIG_OK)
- goto clean10;
-
- if ((err = big_mul(&tmp, &tmp1, &tmp)) != BIG_OK)
- goto clean10;
-
- if ((err = big_div_pos(NULL, &(dsakey.s), &tmp, &(dsakey.q))) !=
- BIG_OK)
- goto clean10;
-
- bignum2bytestring((uchar_t *)out, &(dsakey.r), DSA_SUBPRIME_BYTES);
- bignum2bytestring((uchar_t *)out + DSA_SUBPRIME_BYTES, &(dsakey.s),
- DSA_SUBPRIME_BYTES);
-
- err = BIG_OK;
-
-clean10:
- big_finish(&tmp2);
-clean9:
- big_finish(&tmp1);
-clean8:
- big_finish(&tmp);
-clean7:
- big_finish(&msg);
-clean6:
- DSA_key_finish(&dsakey);
- if (err == BIG_OK)
- rv = CKR_OK;
- else if (err == BIG_NO_MEM)
- rv = CKR_HOST_MEMORY;
- else
- rv = CKR_FUNCTION_FAILED;
clean1:
return (rv);
}
-CK_RV
-dsa_verify(soft_object_t *key, CK_BYTE_PTR data, CK_BYTE_PTR sig)
+static CK_RV
+local_dsa_verify(soft_object_t *key, CK_BYTE_PTR data, CK_BYTE_PTR sig)
{
-
+ CK_RV rv;
uchar_t g[MAX_KEY_ATTR_BUFLEN];
uchar_t y[MAX_KEY_ATTR_BUFLEN];
uchar_t p[MAX_KEY_ATTR_BUFLEN];
@@ -327,21 +176,14 @@ dsa_verify(soft_object_t *key, CK_BYTE_PTR data, CK_BYTE_PTR sig)
uint_t ylen = sizeof (y);
uint_t plen = sizeof (p);
uint_t qlen = sizeof (q);
- DSAkey dsakey;
- BIGNUM msg, tmp1, tmp2, tmp3;
- CK_RV rv;
+ DSAbytekey k;
- rv = soft_get_public_value(key, CKA_SUBPRIME, q, &qlen);
+ rv = soft_get_public_value(key, CKA_PRIME, p, &plen);
if (rv != CKR_OK) {
goto clean1;
}
- if (DSA_SUBPRIME_BYTES != qlen) {
- rv = CKR_KEY_SIZE_RANGE;
- goto clean1;
- }
-
- rv = soft_get_public_value(key, CKA_PRIME, p, &plen);
+ rv = soft_get_public_value(key, CKA_SUBPRIME, q, &qlen);
if (rv != CKR_OK) {
goto clean1;
}
@@ -351,99 +193,23 @@ dsa_verify(soft_object_t *key, CK_BYTE_PTR data, CK_BYTE_PTR sig)
goto clean1;
}
- if (plen < glen) {
- rv = CKR_KEY_SIZE_RANGE;
- goto clean1;
- }
-
rv = soft_get_public_value(key, CKA_VALUE, y, &ylen);
if (rv != CKR_OK) {
goto clean1;
}
- if (plen < ylen) {
- rv = CKR_KEY_SIZE_RANGE;
- goto clean1;
- }
-
- if (DSA_key_init(&dsakey, plen * 8) != BIG_OK) {
- rv = CKR_HOST_MEMORY;
- goto clean1;
- }
-
- rv = CKR_HOST_MEMORY;
- if (big_init(&msg, BIG_CHUNKS_FOR_160BITS) != BIG_OK) {
- goto clean6;
- }
- if (big_init(&tmp1, 2 * CHARLEN2BIGNUMLEN(plen)) != BIG_OK) {
- goto clean7;
- }
- if (big_init(&tmp2, CHARLEN2BIGNUMLEN(plen)) != BIG_OK) {
- goto clean8;
- }
- if (big_init(&tmp3, 2 * BIG_CHUNKS_FOR_160BITS) != BIG_OK) {
- goto clean9;
- }
-
- bytestring2bignum(&(dsakey.g), g, glen);
- bytestring2bignum(&(dsakey.y), y, ylen);
- bytestring2bignum(&(dsakey.p), p, plen);
- bytestring2bignum(&(dsakey.q), q, DSA_SUBPRIME_BYTES);
- bytestring2bignum(&(dsakey.r), (uchar_t *)sig, DSA_SUBPRIME_BYTES);
- bytestring2bignum(&(dsakey.s), ((uchar_t *)sig) + DSA_SUBPRIME_BYTES,
- DSA_SUBPRIME_BYTES);
- bytestring2bignum(&msg, (uchar_t *)data, DSA_SUBPRIME_BYTES);
-
- if (big_ext_gcd_pos(NULL, &tmp2, NULL, &(dsakey.s), &(dsakey.q)) !=
- BIG_OK)
- goto clean10;
-
- if (tmp2.sign == -1)
- if (big_add(&tmp2, &tmp2, &(dsakey.q)) != BIG_OK)
- goto clean10; /* tmp2 <- w */
+ k.prime = p;
+ k.prime_bits = CRYPTO_BYTES2BITS(plen);
+ k.subprime = q;
+ k.subprime_bits = CRYPTO_BYTES2BITS(qlen);
+ k.base = g;
+ k.base_bytes = glen;
+ k.public_y_bits = CRYPTO_BYTES2BITS(ylen);
+ k.public_y = y;
+ k.rfunc = NULL;
- if (big_mul(&tmp1, &msg, &tmp2) != BIG_OK)
- goto clean10;
+ rv = dsa_verify(&k, data, sig);
- if (big_div_pos(NULL, &tmp1, &tmp1, &(dsakey.q)) != BIG_OK)
- goto clean10; /* tmp1 <- u_1 */
-
- if (big_mul(&tmp2, &tmp2, &(dsakey.r)) != BIG_OK)
- goto clean10;
-
- if (big_div_pos(NULL, &tmp2, &tmp2, &(dsakey.q)) != BIG_OK)
- goto clean10; /* tmp2 <- u_2 */
-
- if (big_modexp(&tmp1, &(dsakey.g), &tmp1, &(dsakey.p), NULL) != BIG_OK)
- goto clean10;
-
- if (big_modexp(&tmp2, &(dsakey.y), &tmp2, &(dsakey.p), NULL) != BIG_OK)
- goto clean10;
-
- if (big_mul(&tmp1, &tmp1, &tmp2) != BIG_OK)
- goto clean10;
-
- if (big_div_pos(NULL, &tmp1, &tmp1, &(dsakey.p)) != BIG_OK)
- goto clean10;
-
- if (big_div_pos(NULL, &tmp1, &tmp1, &(dsakey.q)) != BIG_OK)
- goto clean10;
-
- if (big_cmp_abs(&tmp1, &(dsakey.r)) == 0)
- rv = CKR_OK;
- else
- rv = CKR_SIGNATURE_INVALID;
-
-clean10:
- big_finish(&tmp3);
-clean9:
- big_finish(&tmp2);
-clean8:
- big_finish(&tmp1);
-clean7:
- big_finish(&msg);
-clean6:
- DSA_key_finish(&dsakey);
clean1:
return (rv);
}
@@ -538,7 +304,7 @@ soft_dsa_sign(soft_session_t *session_p, CK_BYTE_PTR pData,
return (CKR_BUFFER_TOO_SMALL);
}
- rv = dsa_sign(key, pData, ulDataLen, pSigned);
+ rv = local_dsa_sign(key, pData, ulDataLen, pSigned);
if (rv == CKR_OK) {
*pulSignedLen = DSA_SIGNATURE_LENGTH;
}
@@ -569,19 +335,19 @@ soft_dsa_verify(soft_session_t *session_p, CK_BYTE_PTR pData,
goto clean_exit;
}
- /* The signature length is always 40 bytes. */
- if (ulSignatureLen != DSA_SIGNATURE_LENGTH) {
- rv = CKR_SIGNATURE_LEN_RANGE;
- goto clean_exit;
- }
-
/* Input data length needs to be 20 bytes. */
if (ulDataLen != DSA_SUBPRIME_BYTES) {
rv = CKR_DATA_LEN_RANGE;
goto clean_exit;
}
- rv = dsa_verify(key, pData, pSignature);
+ /* The signature length is always 40 bytes. */
+ if (ulSignatureLen != DSA_SIGNATURE_LENGTH) {
+ rv = CKR_SIGNATURE_LEN_RANGE;
+ goto clean_exit;
+ }
+
+ rv = local_dsa_verify(key, pData, pSignature);
clean_exit:
(void) pthread_mutex_lock(&session_p->session_mutex);
@@ -635,7 +401,7 @@ clean_exit:
}
-CK_RV
+static CK_RV
soft_genDSAkey_set_attribute(soft_object_t *key, CK_ATTRIBUTE_TYPE type,
uchar_t *value, uint32_t value_len, boolean_t public)
{
@@ -644,7 +410,6 @@ soft_genDSAkey_set_attribute(soft_object_t *key, CK_ATTRIBUTE_TYPE type,
biginteger_t *dst = NULL;
biginteger_t src;
-
switch (type) {
case CKA_VALUE:
@@ -676,13 +441,14 @@ soft_genDSAkey_set_attribute(soft_object_t *key, CK_ATTRIBUTE_TYPE type,
break;
}
- src.big_value_len = value_len;
+ /* Note: removal of preceding 0x00 imitates similar code in RSA */
+ while (value[0] == 0) { /* remove preceding 0x00 */
+ value++;
+ value_len--;
+ }
- if ((src.big_value = malloc(value_len)) == NULL) {
- rv = CKR_HOST_MEMORY;
+ if ((rv = dup_bigint_attr(&src, value, value_len)) != CKR_OK)
goto cleanexit;
- }
- (void) memcpy(src.big_value, value, value_len);
/* Copy the attribute in the key object. */
copy_bigint_attr(&src, dst);
@@ -695,44 +461,20 @@ cleanexit:
CK_RV
-generate_dsa_key(DSAkey *key, boolean_t token_obj)
-{
- BIG_ERR_CODE err;
-
- do {
- if ((err = random_bignum(&(key->x), DSA_SUBPRIME_BITS,
- token_obj)) != BIG_OK) {
- return (convert_rv(err));
- }
- } while (big_cmp_abs(&(key->x), &(key->q)) > 0);
-
- if ((err = big_modexp(&(key->y), &(key->g), (&key->x),
- (&key->p), NULL)) != BIG_OK)
- return (convert_rv(err));
-
- return (CKR_OK);
-}
-
-
-CK_RV
soft_dsa_genkey_pair(soft_object_t *pubkey, soft_object_t *prikey)
{
- BIG_ERR_CODE brv;
CK_RV rv;
- uchar_t prime[MAX_KEY_ATTR_BUFLEN];
+ uchar_t prime[MAX_KEY_ATTR_BUFLEN];
uint32_t prime_len = sizeof (prime);
uchar_t subprime[MAX_KEY_ATTR_BUFLEN];
uint32_t subprime_len = sizeof (subprime);
uchar_t base[MAX_KEY_ATTR_BUFLEN];
uint32_t base_len = sizeof (base);
- uchar_t *pubvalue;
- uint32_t pubvalue_len;
- uchar_t *privalue;
- uint32_t privalue_len;
- DSAkey dsakey = {0};
-
- pubvalue = NULL;
- privalue = NULL;
+ uchar_t pubvalue[MAX_KEY_ATTR_BUFLEN];
+ uint32_t pubvalue_len = sizeof (pubvalue);
+ uchar_t privalue[DSA_SUBPRIME_BYTES];
+ uint32_t privalue_len = sizeof (privalue);
+ DSAbytekey k;
if ((pubkey == NULL) || (prikey == NULL)) {
return (CKR_ARGUMENTS_BAD);
@@ -745,12 +487,6 @@ soft_dsa_genkey_pair(soft_object_t *pubkey, soft_object_t *prikey)
goto cleanexit;
}
- if ((prime_len < MIN_DSA_KEY_LEN) ||
- (prime_len > MAX_DSA_KEY_LEN)) {
- rv = CKR_ATTRIBUTE_VALUE_INVALID;
- goto cleanexit;
- }
-
rv = soft_get_public_value(pubkey, CKA_SUBPRIME, subprime,
&subprime_len);
if (rv != CKR_OK) {
@@ -758,109 +494,60 @@ soft_dsa_genkey_pair(soft_object_t *pubkey, soft_object_t *prikey)
goto cleanexit;
}
- if (subprime_len != DSA_SUBPRIME_BYTES) {
- rv = CKR_ATTRIBUTE_VALUE_INVALID;
- goto cleanexit;
- }
-
rv = soft_get_public_value(pubkey, CKA_BASE, base, &base_len);
if (rv != CKR_OK) {
rv = CKR_TEMPLATE_INCOMPLETE;
goto cleanexit;
}
- /*
- * initialize the dsa key
- * Note: big_extend takes length in words
- */
- if ((brv = DSA_key_init(&dsakey, prime_len * 8)) != BIG_OK) {
- rv = convert_rv(brv);
- goto cleanexit;
- }
-
- if ((brv = big_extend(&dsakey.p,
- CHARLEN2BIGNUMLEN(prime_len))) != BIG_OK) {
- rv = convert_rv(brv);
- goto cleanexit;
- }
-
- bytestring2bignum(&dsakey.p, prime, prime_len);
-
- if ((brv = big_extend(&dsakey.q, CHARLEN2BIGNUMLEN(subprime_len))) !=
- BIG_OK) {
- rv = convert_rv(brv);
- goto cleanexit;
- }
-
- bytestring2bignum(&dsakey.q, subprime, subprime_len);
+ /* Inputs to DSA key pair generation. */
+ k.prime = prime;
+ k.prime_bits = CRYPTO_BYTES2BITS(prime_len);
+ k.subprime = subprime;
+ k.subprime_bits = CRYPTO_BYTES2BITS(subprime_len);
+ k.base = base;
+ k.base_bytes = base_len;
+ k.rfunc = (IS_TOKEN_OBJECT(pubkey) || IS_TOKEN_OBJECT(prikey)) ?
+ pkcs11_get_random : pkcs11_get_urandom;
- if ((brv = big_extend(&dsakey.g, CHARLEN2BIGNUMLEN(base_len))) !=
- BIG_OK) {
- rv = convert_rv(brv);
- goto cleanexit;
- }
+ /* Outputs from DSA key pair generation. */
+ k.public_y = pubvalue;
+ k.public_y_bits = CRYPTO_BYTES2BITS(pubvalue_len);
+ k.private_x = privalue;
+ k.private_x_bits = CRYPTO_BYTES2BITS(privalue_len);
- bytestring2bignum(&dsakey.g, base, base_len);
+ rv = dsa_genkey_pair(&k);
- /*
- * generate DSA key pair
- * Note: bignum.len is length of value in words
- */
- if ((rv = generate_dsa_key(&dsakey, (IS_TOKEN_OBJECT(pubkey) ||
- IS_TOKEN_OBJECT(prikey)))) != CKR_OK) {
- goto cleanexit;
- }
-
- pubvalue_len = prime_len;
- if ((pubvalue = malloc(pubvalue_len)) == NULL) {
- rv = CKR_HOST_MEMORY;
- goto cleanexit;
- }
- bignum2bytestring(pubvalue, &dsakey.y, pubvalue_len);
-
- privalue_len = DSA_SUBPRIME_BYTES;
- if ((privalue = malloc(privalue_len)) == NULL) {
- rv = CKR_HOST_MEMORY;
+ if (rv != CKR_OK) {
goto cleanexit;
}
- bignum2bytestring(privalue, &dsakey.x, privalue_len);
/* Update attribute in public key. */
if ((rv = soft_genDSAkey_set_attribute(pubkey, CKA_VALUE,
- pubvalue, pubvalue_len, B_TRUE)) != CKR_OK) {
+ pubvalue, CRYPTO_BITS2BYTES(k.public_y_bits), B_TRUE)) != CKR_OK) {
goto cleanexit;
}
/* Update attributes in private key. */
if ((rv = soft_genDSAkey_set_attribute(prikey, CKA_PRIME,
- prime, prime_len, B_FALSE)) != CKR_OK) {
+ prime, CRYPTO_BITS2BYTES(k.prime_bits), B_FALSE)) != CKR_OK) {
goto cleanexit;
}
- if ((rv = soft_genDSAkey_set_attribute(prikey, CKA_SUBPRIME,
- subprime, subprime_len, B_FALSE)) != CKR_OK) {
+ if ((rv = soft_genDSAkey_set_attribute(prikey, CKA_SUBPRIME, subprime,
+ CRYPTO_BITS2BYTES(k.subprime_bits), B_FALSE)) != CKR_OK) {
goto cleanexit;
}
if ((rv = soft_genDSAkey_set_attribute(prikey, CKA_BASE,
- base, base_len, B_FALSE)) != CKR_OK) {
+ base, k.base_bytes, B_FALSE)) != CKR_OK) {
goto cleanexit;
}
- if ((rv = soft_genDSAkey_set_attribute(prikey, CKA_VALUE,
- privalue, privalue_len, B_FALSE)) != CKR_OK) {
+ if ((rv = soft_genDSAkey_set_attribute(prikey, CKA_VALUE, privalue,
+ CRYPTO_BITS2BYTES(k.private_x_bits), B_FALSE)) != CKR_OK) {
goto cleanexit;
}
cleanexit:
- DSA_key_finish(&dsakey);
-
- if (pubvalue != NULL) {
- free(pubvalue);
- }
-
- if (privalue != NULL) {
- free(privalue);
- }
-
return (rv);
}