| 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; | 
| -} | 
|  |