Index: mozilla/security/nss/lib/pk11wrap/pk11skey.c |
=================================================================== |
--- mozilla/security/nss/lib/pk11wrap/pk11skey.c (revision 164196) |
+++ mozilla/security/nss/lib/pk11wrap/pk11skey.c (working copy) |
@@ -1677,7 +1677,7 @@ |
keyType = PK11_GetKeyType(target,keySize); |
key_size = keySize; |
if (key_size == 0) { |
- if (pk11_GetPredefinedKeyLength(keyType)) { |
+ if ((key_size = pk11_GetPredefinedKeyLength(keyType))) { |
templateCount --; |
} else { |
/* sigh, some tokens can't figure this out and require |
@@ -1762,7 +1762,9 @@ |
PORT_SetError(SEC_ERROR_BAD_KEY); |
return NULL; |
} |
- if ((kdf < CKD_NULL) || (kdf > CKD_SHA1_KDF)) { |
+ if ((kdf != CKD_NULL) && (kdf != CKD_SHA1_KDF) && |
+ (kdf != CKD_SHA224_KDF) && (kdf != CKD_SHA256_KDF) && |
+ (kdf != CKD_SHA384_KDF) && (kdf != CKD_SHA512_KDF)) { |
PORT_SetError(SEC_ERROR_INVALID_ALGORITHM); |
return NULL; |
} |
@@ -1785,18 +1787,41 @@ |
keyType = PK11_GetKeyType(target,keySize); |
key_size = keySize; |
if (key_size == 0) { |
- if (pk11_GetPredefinedKeyLength(keyType)) { |
+ if ((key_size = pk11_GetPredefinedKeyLength(keyType))) { |
templateCount --; |
} else { |
/* sigh, some tokens can't figure this out and require |
* CKA_VALUE_LEN to be set */ |
switch (kdf) { |
case CKD_NULL: |
- key_size = (pubKey->u.ec.publicValue.len-1)/2; |
+ if (pubKey->u.ec.publicValue.data[0] == 0x04) { |
+ /* key encoded in uncompressed form */ |
+ key_size = (pubKey->u.ec.publicValue.len-1)/2; |
+ } else if ((pubKey->u.ec.publicValue.data[0] == 0x02) || |
+ (pubKey->u.ec.publicValue.data[0] == 0x03)) { |
+ /* key encoded in compressed form */ |
+ key_size = pubKey->u.ec.publicValue.len-1; |
+ } else { |
+ /* key encoding not recognized */ |
+ PK11_FreeSymKey(symKey); |
+ return NULL; |
wtc
2012/11/07 22:12:33
We should call PORT_SetError(SEC_ERROR_UNSUPPORTED
|
+ } |
break; |
case CKD_SHA1_KDF: |
key_size = SHA1_LENGTH; |
break; |
+ case CKD_SHA224_KDF: |
+ key_size = SHA224_LENGTH; |
+ break; |
+ case CKD_SHA256_KDF: |
+ key_size = SHA256_LENGTH; |
+ break; |
+ case CKD_SHA384_KDF: |
+ key_size = SHA384_LENGTH; |
+ break; |
+ case CKD_SHA512_KDF: |
+ key_size = SHA512_LENGTH; |
+ break; |
default: |
PORT_Assert(!"Invalid CKD"); |
PORT_SetError(SEC_ERROR_INVALID_ALGORITHM); |
wtc
2012/11/07 22:12:33
We should call PK11_FreeSymKey(symKey) here.
|