| Index: mozilla/security/nss/lib/softoken/lowkey.c
|
| ===================================================================
|
| --- mozilla/security/nss/lib/softoken/lowkey.c (revision 191424)
|
| +++ mozilla/security/nss/lib/softoken/lowkey.c (working copy)
|
| @@ -1,492 +0,0 @@
|
| -/* This Source Code Form is subject to the terms of the Mozilla Public
|
| - * License, v. 2.0. If a copy of the MPL was not distributed with this
|
| - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
| -#include "lowkeyi.h"
|
| -#include "secoid.h"
|
| -#include "secitem.h"
|
| -#include "secder.h"
|
| -#include "base64.h"
|
| -#include "secasn1.h"
|
| -#include "secerr.h"
|
| -
|
| -#ifdef NSS_ENABLE_ECC
|
| -#include "softoken.h"
|
| -#endif
|
| -
|
| -SEC_ASN1_MKSUB(SEC_AnyTemplate)
|
| -SEC_ASN1_MKSUB(SEC_BitStringTemplate)
|
| -SEC_ASN1_MKSUB(SEC_ObjectIDTemplate)
|
| -SEC_ASN1_MKSUB(SECOID_AlgorithmIDTemplate)
|
| -
|
| -const SEC_ASN1Template nsslowkey_AttributeTemplate[] = {
|
| - { SEC_ASN1_SEQUENCE,
|
| - 0, NULL, sizeof(NSSLOWKEYAttribute) },
|
| - { SEC_ASN1_OBJECT_ID, offsetof(NSSLOWKEYAttribute, attrType) },
|
| - { SEC_ASN1_SET_OF | SEC_ASN1_XTRN ,
|
| - offsetof(NSSLOWKEYAttribute, attrValue),
|
| - SEC_ASN1_SUB(SEC_AnyTemplate) },
|
| - { 0 }
|
| -};
|
| -
|
| -const SEC_ASN1Template nsslowkey_SetOfAttributeTemplate[] = {
|
| - { SEC_ASN1_SET_OF, 0, nsslowkey_AttributeTemplate },
|
| -};
|
| -/* ASN1 Templates for new decoder/encoder */
|
| -const SEC_ASN1Template nsslowkey_PrivateKeyInfoTemplate[] = {
|
| - { SEC_ASN1_SEQUENCE,
|
| - 0, NULL, sizeof(NSSLOWKEYPrivateKeyInfo) },
|
| - { SEC_ASN1_INTEGER,
|
| - offsetof(NSSLOWKEYPrivateKeyInfo,version) },
|
| - { SEC_ASN1_INLINE | SEC_ASN1_XTRN,
|
| - offsetof(NSSLOWKEYPrivateKeyInfo,algorithm),
|
| - SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
|
| - { SEC_ASN1_OCTET_STRING,
|
| - offsetof(NSSLOWKEYPrivateKeyInfo,privateKey) },
|
| - { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 0,
|
| - offsetof(NSSLOWKEYPrivateKeyInfo, attributes),
|
| - nsslowkey_SetOfAttributeTemplate },
|
| - { 0 }
|
| -};
|
| -
|
| -const SEC_ASN1Template nsslowkey_PQGParamsTemplate[] = {
|
| - { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(PQGParams) },
|
| - { SEC_ASN1_INTEGER, offsetof(PQGParams,prime) },
|
| - { SEC_ASN1_INTEGER, offsetof(PQGParams,subPrime) },
|
| - { SEC_ASN1_INTEGER, offsetof(PQGParams,base) },
|
| - { 0, }
|
| -};
|
| -
|
| -const SEC_ASN1Template nsslowkey_RSAPrivateKeyTemplate[] = {
|
| - { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSSLOWKEYPrivateKey) },
|
| - { SEC_ASN1_INTEGER, offsetof(NSSLOWKEYPrivateKey,u.rsa.version) },
|
| - { SEC_ASN1_INTEGER, offsetof(NSSLOWKEYPrivateKey,u.rsa.modulus) },
|
| - { SEC_ASN1_INTEGER, offsetof(NSSLOWKEYPrivateKey,u.rsa.publicExponent) },
|
| - { SEC_ASN1_INTEGER, offsetof(NSSLOWKEYPrivateKey,u.rsa.privateExponent) },
|
| - { SEC_ASN1_INTEGER, offsetof(NSSLOWKEYPrivateKey,u.rsa.prime1) },
|
| - { SEC_ASN1_INTEGER, offsetof(NSSLOWKEYPrivateKey,u.rsa.prime2) },
|
| - { SEC_ASN1_INTEGER, offsetof(NSSLOWKEYPrivateKey,u.rsa.exponent1) },
|
| - { SEC_ASN1_INTEGER, offsetof(NSSLOWKEYPrivateKey,u.rsa.exponent2) },
|
| - { SEC_ASN1_INTEGER, offsetof(NSSLOWKEYPrivateKey,u.rsa.coefficient) },
|
| - { 0 }
|
| -};
|
| -
|
| -
|
| -const SEC_ASN1Template nsslowkey_DSAPrivateKeyTemplate[] = {
|
| - { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSSLOWKEYPrivateKey) },
|
| - { SEC_ASN1_INTEGER, offsetof(NSSLOWKEYPrivateKey,u.dsa.publicValue) },
|
| - { SEC_ASN1_INTEGER, offsetof(NSSLOWKEYPrivateKey,u.dsa.privateValue) },
|
| - { 0, }
|
| -};
|
| -
|
| -const SEC_ASN1Template nsslowkey_DSAPrivateKeyExportTemplate[] = {
|
| - { SEC_ASN1_INTEGER, offsetof(NSSLOWKEYPrivateKey,u.dsa.privateValue) },
|
| -};
|
| -
|
| -const SEC_ASN1Template nsslowkey_DHPrivateKeyTemplate[] = {
|
| - { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSSLOWKEYPrivateKey) },
|
| - { SEC_ASN1_INTEGER, offsetof(NSSLOWKEYPrivateKey,u.dh.publicValue) },
|
| - { SEC_ASN1_INTEGER, offsetof(NSSLOWKEYPrivateKey,u.dh.privateValue) },
|
| - { SEC_ASN1_INTEGER, offsetof(NSSLOWKEYPrivateKey,u.dh.base) },
|
| - { SEC_ASN1_INTEGER, offsetof(NSSLOWKEYPrivateKey,u.dh.prime) },
|
| - { 0, }
|
| -};
|
| -
|
| -#ifdef NSS_ENABLE_ECC
|
| -
|
| -/* XXX This is just a placeholder for later when we support
|
| - * generic curves and need full-blown support for parsing EC
|
| - * parameters. For now, we only support named curves in which
|
| - * EC params are simply encoded as an object ID and we don't
|
| - * use nsslowkey_ECParamsTemplate.
|
| - */
|
| -const SEC_ASN1Template nsslowkey_ECParamsTemplate[] = {
|
| - { SEC_ASN1_CHOICE, offsetof(ECParams,type), NULL, sizeof(ECParams) },
|
| - { SEC_ASN1_OBJECT_ID, offsetof(ECParams,curveOID), NULL, ec_params_named },
|
| - { 0, }
|
| -};
|
| -
|
| -
|
| -/* NOTE: The SECG specification allows the private key structure
|
| - * to contain curve parameters but recommends that they be stored
|
| - * in the PrivateKeyAlgorithmIdentifier field of the PrivateKeyInfo
|
| - * instead.
|
| - */
|
| -const SEC_ASN1Template nsslowkey_ECPrivateKeyTemplate[] = {
|
| - { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSSLOWKEYPrivateKey) },
|
| - { SEC_ASN1_INTEGER, offsetof(NSSLOWKEYPrivateKey,u.ec.version) },
|
| - { SEC_ASN1_OCTET_STRING,
|
| - offsetof(NSSLOWKEYPrivateKey,u.ec.privateValue) },
|
| - /* XXX The following template works for now since we only
|
| - * support named curves for which the parameters are
|
| - * encoded as an object ID. When we support generic curves,
|
| - * we'll need to define nsslowkey_ECParamsTemplate
|
| - */
|
| -#if 1
|
| - { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED |
|
| - SEC_ASN1_EXPLICIT | SEC_ASN1_CONTEXT_SPECIFIC |
|
| - SEC_ASN1_XTRN | 0,
|
| - offsetof(NSSLOWKEYPrivateKey,u.ec.ecParams.curveOID),
|
| - SEC_ASN1_SUB(SEC_ObjectIDTemplate) },
|
| -#else
|
| - { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED |
|
| - SEC_ASN1_EXPLICIT | SEC_ASN1_CONTEXT_SPECIFIC | 0,
|
| - offsetof(NSSLOWKEYPrivateKey,u.ec.ecParams),
|
| - nsslowkey_ECParamsTemplate },
|
| -#endif
|
| - { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED |
|
| - SEC_ASN1_EXPLICIT | SEC_ASN1_CONTEXT_SPECIFIC |
|
| - SEC_ASN1_XTRN | 1,
|
| - offsetof(NSSLOWKEYPrivateKey,u.ec.publicValue),
|
| - SEC_ASN1_SUB(SEC_BitStringTemplate) },
|
| - { 0, }
|
| -};
|
| -#endif /* NSS_ENABLE_ECC */
|
| -/*
|
| - * See bugzilla bug 125359
|
| - * Since NSS (via PKCS#11) wants to handle big integers as unsigned ints,
|
| - * all of the templates above that en/decode into integers must be converted
|
| - * from ASN.1's signed integer type. This is done by marking either the
|
| - * source or destination (encoding or decoding, respectively) type as
|
| - * siUnsignedInteger.
|
| - */
|
| -
|
| -void
|
| -prepare_low_rsa_priv_key_for_asn1(NSSLOWKEYPrivateKey *key)
|
| -{
|
| - key->u.rsa.modulus.type = siUnsignedInteger;
|
| - key->u.rsa.publicExponent.type = siUnsignedInteger;
|
| - key->u.rsa.privateExponent.type = siUnsignedInteger;
|
| - key->u.rsa.prime1.type = siUnsignedInteger;
|
| - key->u.rsa.prime2.type = siUnsignedInteger;
|
| - key->u.rsa.exponent1.type = siUnsignedInteger;
|
| - key->u.rsa.exponent2.type = siUnsignedInteger;
|
| - key->u.rsa.coefficient.type = siUnsignedInteger;
|
| -}
|
| -
|
| -void
|
| -prepare_low_pqg_params_for_asn1(PQGParams *params)
|
| -{
|
| - params->prime.type = siUnsignedInteger;
|
| - params->subPrime.type = siUnsignedInteger;
|
| - params->base.type = siUnsignedInteger;
|
| -}
|
| -
|
| -void
|
| -prepare_low_dsa_priv_key_for_asn1(NSSLOWKEYPrivateKey *key)
|
| -{
|
| - key->u.dsa.publicValue.type = siUnsignedInteger;
|
| - key->u.dsa.privateValue.type = siUnsignedInteger;
|
| - key->u.dsa.params.prime.type = siUnsignedInteger;
|
| - key->u.dsa.params.subPrime.type = siUnsignedInteger;
|
| - key->u.dsa.params.base.type = siUnsignedInteger;
|
| -}
|
| -
|
| -void
|
| -prepare_low_dsa_priv_key_export_for_asn1(NSSLOWKEYPrivateKey *key)
|
| -{
|
| - key->u.dsa.privateValue.type = siUnsignedInteger;
|
| -}
|
| -
|
| -void
|
| -prepare_low_dh_priv_key_for_asn1(NSSLOWKEYPrivateKey *key)
|
| -{
|
| - key->u.dh.prime.type = siUnsignedInteger;
|
| - key->u.dh.base.type = siUnsignedInteger;
|
| - key->u.dh.publicValue.type = siUnsignedInteger;
|
| - key->u.dh.privateValue.type = siUnsignedInteger;
|
| -}
|
| -
|
| -#ifdef NSS_ENABLE_ECC
|
| -void
|
| -prepare_low_ecparams_for_asn1(ECParams *params)
|
| -{
|
| - params->DEREncoding.type = siUnsignedInteger;
|
| - params->curveOID.type = siUnsignedInteger;
|
| -}
|
| -
|
| -void
|
| -prepare_low_ec_priv_key_for_asn1(NSSLOWKEYPrivateKey *key)
|
| -{
|
| - key->u.ec.version.type = siUnsignedInteger;
|
| - key->u.ec.ecParams.DEREncoding.type = siUnsignedInteger;
|
| - key->u.ec.ecParams.curveOID.type = siUnsignedInteger;
|
| - key->u.ec.privateValue.type = siUnsignedInteger;
|
| - key->u.ec.publicValue.type = siUnsignedInteger;
|
| -}
|
| -#endif /* NSS_ENABLE_ECC */
|
| -
|
| -void
|
| -nsslowkey_DestroyPrivateKey(NSSLOWKEYPrivateKey *privk)
|
| -{
|
| - if (privk && privk->arena) {
|
| - PORT_FreeArena(privk->arena, PR_TRUE);
|
| - }
|
| -}
|
| -
|
| -void
|
| -nsslowkey_DestroyPublicKey(NSSLOWKEYPublicKey *pubk)
|
| -{
|
| - if (pubk && pubk->arena) {
|
| - PORT_FreeArena(pubk->arena, PR_FALSE);
|
| - }
|
| -}
|
| -unsigned
|
| -nsslowkey_PublicModulusLen(NSSLOWKEYPublicKey *pubk)
|
| -{
|
| - unsigned char b0;
|
| -
|
| - /* interpret modulus length as key strength... in
|
| - * fortezza that's the public key length */
|
| -
|
| - switch (pubk->keyType) {
|
| - case NSSLOWKEYRSAKey:
|
| - b0 = pubk->u.rsa.modulus.data[0];
|
| - return b0 ? pubk->u.rsa.modulus.len : pubk->u.rsa.modulus.len - 1;
|
| - default:
|
| - break;
|
| - }
|
| - return 0;
|
| -}
|
| -
|
| -unsigned
|
| -nsslowkey_PrivateModulusLen(NSSLOWKEYPrivateKey *privk)
|
| -{
|
| -
|
| - unsigned char b0;
|
| -
|
| - switch (privk->keyType) {
|
| - case NSSLOWKEYRSAKey:
|
| - b0 = privk->u.rsa.modulus.data[0];
|
| - return b0 ? privk->u.rsa.modulus.len : privk->u.rsa.modulus.len - 1;
|
| - default:
|
| - break;
|
| - }
|
| - return 0;
|
| -}
|
| -
|
| -NSSLOWKEYPublicKey *
|
| -nsslowkey_ConvertToPublicKey(NSSLOWKEYPrivateKey *privk)
|
| -{
|
| - NSSLOWKEYPublicKey *pubk;
|
| - PLArenaPool *arena;
|
| -
|
| -
|
| - arena = PORT_NewArena (DER_DEFAULT_CHUNKSIZE);
|
| - if (arena == NULL) {
|
| - PORT_SetError (SEC_ERROR_NO_MEMORY);
|
| - return NULL;
|
| - }
|
| -
|
| - switch(privk->keyType) {
|
| - case NSSLOWKEYRSAKey:
|
| - case NSSLOWKEYNullKey:
|
| - pubk = (NSSLOWKEYPublicKey *)PORT_ArenaZAlloc(arena,
|
| - sizeof (NSSLOWKEYPublicKey));
|
| - if (pubk != NULL) {
|
| - SECStatus rv;
|
| -
|
| - pubk->arena = arena;
|
| - pubk->keyType = privk->keyType;
|
| - if (privk->keyType == NSSLOWKEYNullKey) return pubk;
|
| - rv = SECITEM_CopyItem(arena, &pubk->u.rsa.modulus,
|
| - &privk->u.rsa.modulus);
|
| - if (rv == SECSuccess) {
|
| - rv = SECITEM_CopyItem (arena, &pubk->u.rsa.publicExponent,
|
| - &privk->u.rsa.publicExponent);
|
| - if (rv == SECSuccess)
|
| - return pubk;
|
| - }
|
| - } else {
|
| - PORT_SetError (SEC_ERROR_NO_MEMORY);
|
| - }
|
| - break;
|
| - case NSSLOWKEYDSAKey:
|
| - pubk = (NSSLOWKEYPublicKey *)PORT_ArenaZAlloc(arena,
|
| - sizeof(NSSLOWKEYPublicKey));
|
| - if (pubk != NULL) {
|
| - SECStatus rv;
|
| -
|
| - pubk->arena = arena;
|
| - pubk->keyType = privk->keyType;
|
| - rv = SECITEM_CopyItem(arena, &pubk->u.dsa.publicValue,
|
| - &privk->u.dsa.publicValue);
|
| - if (rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(arena, &pubk->u.dsa.params.prime,
|
| - &privk->u.dsa.params.prime);
|
| - if (rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(arena, &pubk->u.dsa.params.subPrime,
|
| - &privk->u.dsa.params.subPrime);
|
| - if (rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(arena, &pubk->u.dsa.params.base,
|
| - &privk->u.dsa.params.base);
|
| - if (rv == SECSuccess) return pubk;
|
| - }
|
| - break;
|
| - case NSSLOWKEYDHKey:
|
| - pubk = (NSSLOWKEYPublicKey *)PORT_ArenaZAlloc(arena,
|
| - sizeof(NSSLOWKEYPublicKey));
|
| - if (pubk != NULL) {
|
| - SECStatus rv;
|
| -
|
| - pubk->arena = arena;
|
| - pubk->keyType = privk->keyType;
|
| - rv = SECITEM_CopyItem(arena, &pubk->u.dh.publicValue,
|
| - &privk->u.dh.publicValue);
|
| - if (rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(arena, &pubk->u.dh.prime,
|
| - &privk->u.dh.prime);
|
| - if (rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(arena, &pubk->u.dh.base,
|
| - &privk->u.dh.base);
|
| - if (rv == SECSuccess) return pubk;
|
| - }
|
| - break;
|
| -#ifdef NSS_ENABLE_ECC
|
| - case NSSLOWKEYECKey:
|
| - pubk = (NSSLOWKEYPublicKey *)PORT_ArenaZAlloc(arena,
|
| - sizeof(NSSLOWKEYPublicKey));
|
| - if (pubk != NULL) {
|
| - SECStatus rv;
|
| -
|
| - pubk->arena = arena;
|
| - pubk->keyType = privk->keyType;
|
| - rv = SECITEM_CopyItem(arena, &pubk->u.ec.publicValue,
|
| - &privk->u.ec.publicValue);
|
| - if (rv != SECSuccess) break;
|
| - pubk->u.ec.ecParams.arena = arena;
|
| - /* Copy the rest of the params */
|
| - rv = EC_CopyParams(arena, &(pubk->u.ec.ecParams),
|
| - &(privk->u.ec.ecParams));
|
| - if (rv == SECSuccess) return pubk;
|
| - }
|
| - break;
|
| -#endif /* NSS_ENABLE_ECC */
|
| - /* No Fortezza in Low Key implementations (Fortezza keys aren't
|
| - * stored in our data base */
|
| - default:
|
| - break;
|
| - }
|
| -
|
| - PORT_FreeArena (arena, PR_FALSE);
|
| - return NULL;
|
| -}
|
| -
|
| -NSSLOWKEYPrivateKey *
|
| -nsslowkey_CopyPrivateKey(NSSLOWKEYPrivateKey *privKey)
|
| -{
|
| - NSSLOWKEYPrivateKey *returnKey = NULL;
|
| - SECStatus rv = SECFailure;
|
| - PLArenaPool *poolp;
|
| -
|
| - if(!privKey) {
|
| - return NULL;
|
| - }
|
| -
|
| - poolp = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
|
| - if(!poolp) {
|
| - return NULL;
|
| - }
|
| -
|
| - returnKey = (NSSLOWKEYPrivateKey*)PORT_ArenaZAlloc(poolp, sizeof(NSSLOWKEYPrivateKey));
|
| - if(!returnKey) {
|
| - rv = SECFailure;
|
| - goto loser;
|
| - }
|
| -
|
| - returnKey->keyType = privKey->keyType;
|
| - returnKey->arena = poolp;
|
| -
|
| - switch(privKey->keyType) {
|
| - case NSSLOWKEYRSAKey:
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.rsa.modulus),
|
| - &(privKey->u.rsa.modulus));
|
| - if(rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.rsa.version),
|
| - &(privKey->u.rsa.version));
|
| - if(rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.rsa.publicExponent),
|
| - &(privKey->u.rsa.publicExponent));
|
| - if(rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.rsa.privateExponent),
|
| - &(privKey->u.rsa.privateExponent));
|
| - if(rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.rsa.prime1),
|
| - &(privKey->u.rsa.prime1));
|
| - if(rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.rsa.prime2),
|
| - &(privKey->u.rsa.prime2));
|
| - if(rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.rsa.exponent1),
|
| - &(privKey->u.rsa.exponent1));
|
| - if(rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.rsa.exponent2),
|
| - &(privKey->u.rsa.exponent2));
|
| - if(rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.rsa.coefficient),
|
| - &(privKey->u.rsa.coefficient));
|
| - if(rv != SECSuccess) break;
|
| - break;
|
| - case NSSLOWKEYDSAKey:
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.dsa.publicValue),
|
| - &(privKey->u.dsa.publicValue));
|
| - if(rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.dsa.privateValue),
|
| - &(privKey->u.dsa.privateValue));
|
| - if(rv != SECSuccess) break;
|
| - returnKey->u.dsa.params.arena = poolp;
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.dsa.params.prime),
|
| - &(privKey->u.dsa.params.prime));
|
| - if(rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.dsa.params.subPrime),
|
| - &(privKey->u.dsa.params.subPrime));
|
| - if(rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.dsa.params.base),
|
| - &(privKey->u.dsa.params.base));
|
| - if(rv != SECSuccess) break;
|
| - break;
|
| - case NSSLOWKEYDHKey:
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.dh.publicValue),
|
| - &(privKey->u.dh.publicValue));
|
| - if(rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.dh.privateValue),
|
| - &(privKey->u.dh.privateValue));
|
| - if(rv != SECSuccess) break;
|
| - returnKey->u.dsa.params.arena = poolp;
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.dh.prime),
|
| - &(privKey->u.dh.prime));
|
| - if(rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.dh.base),
|
| - &(privKey->u.dh.base));
|
| - if(rv != SECSuccess) break;
|
| - break;
|
| -#ifdef NSS_ENABLE_ECC
|
| - case NSSLOWKEYECKey:
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.ec.version),
|
| - &(privKey->u.ec.version));
|
| - if(rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.ec.publicValue),
|
| - &(privKey->u.ec.publicValue));
|
| - if(rv != SECSuccess) break;
|
| - rv = SECITEM_CopyItem(poolp, &(returnKey->u.ec.privateValue),
|
| - &(privKey->u.ec.privateValue));
|
| - if(rv != SECSuccess) break;
|
| - returnKey->u.ec.ecParams.arena = poolp;
|
| - /* Copy the rest of the params */
|
| - rv = EC_CopyParams(poolp, &(returnKey->u.ec.ecParams),
|
| - &(privKey->u.ec.ecParams));
|
| - if (rv != SECSuccess) break;
|
| - break;
|
| -#endif /* NSS_ENABLE_ECC */
|
| - default:
|
| - rv = SECFailure;
|
| - }
|
| -
|
| -loser:
|
| -
|
| - if(rv != SECSuccess) {
|
| - PORT_FreeArena(poolp, PR_TRUE);
|
| - returnKey = NULL;
|
| - }
|
| -
|
| - return returnKey;
|
| -}
|
|
|