| Index: nss/lib/softoken/pkcs11c.c
|
| ===================================================================
|
| --- nss/lib/softoken/pkcs11c.c (revision 251855)
|
| +++ nss/lib/softoken/pkcs11c.c (working copy)
|
| @@ -5782,6 +5782,7 @@
|
| return 0;
|
| }
|
|
|
| +#ifdef NSS_ENABLE_ECC
|
| /* Inputs:
|
| * key_len: Length of derived key to be generated.
|
| * SharedSecret: a shared secret that is the output of a key agreement primitive.
|
| @@ -5800,12 +5801,13 @@
|
| unsigned char *buffer = NULL, *output_buffer = NULL;
|
| PRUint32 buffer_len, max_counter, i;
|
| SECStatus rv;
|
| + CK_RV crv;
|
|
|
| /* Check that key_len isn't too long. The maximum key length could be
|
| * greatly increased if the code below did not limit the 4-byte counter
|
| * to a maximum value of 255. */
|
| if (key_len > 254 * HashLen)
|
| - return SEC_ERROR_INVALID_ARGS;
|
| + return CKR_ARGUMENTS_BAD;
|
|
|
| if (SharedInfo == NULL)
|
| SharedInfoLen = 0;
|
| @@ -5813,7 +5815,7 @@
|
| buffer_len = SharedSecret->len + 4 + SharedInfoLen;
|
| buffer = (CK_BYTE *)PORT_Alloc(buffer_len);
|
| if (buffer == NULL) {
|
| - rv = SEC_ERROR_NO_MEMORY;
|
| + crv = CKR_HOST_MEMORY;
|
| goto loser;
|
| }
|
|
|
| @@ -5823,7 +5825,7 @@
|
|
|
| output_buffer = (CK_BYTE *)PORT_Alloc(max_counter * HashLen);
|
| if (output_buffer == NULL) {
|
| - rv = SEC_ERROR_NO_MEMORY;
|
| + crv = CKR_HOST_MEMORY;
|
| goto loser;
|
| }
|
|
|
| @@ -5840,8 +5842,11 @@
|
|
|
| for(i=0; i < max_counter; i++) {
|
| rv = Hash(&output_buffer[i * HashLen], buffer, buffer_len);
|
| - if (rv != SECSuccess)
|
| + if (rv != SECSuccess) {
|
| + /* 'Hash' should not fail. */
|
| + crv = CKR_FUNCTION_FAILED;
|
| goto loser;
|
| + }
|
|
|
| /* Increment counter (assumes max_counter < 255) */
|
| buffer[SharedSecret->len + 3]++;
|
| @@ -5853,7 +5858,7 @@
|
| }
|
| *key = output_buffer;
|
|
|
| - return SECSuccess;
|
| + return CKR_OK;
|
|
|
| loser:
|
| if (buffer) {
|
| @@ -5862,7 +5867,7 @@
|
| if (output_buffer) {
|
| PORT_ZFree(output_buffer, max_counter * HashLen);
|
| }
|
| - return rv;
|
| + return crv;
|
| }
|
|
|
| static CK_RV sftk_ANSI_X9_63_kdf(CK_BYTE **key, CK_ULONG key_len,
|
| @@ -5886,8 +5891,9 @@
|
| return sftk_compute_ANSI_X9_63_kdf(key, key_len, SharedSecret, SharedInfo,
|
| SharedInfoLen, SHA512_HashBuf, SHA512_LENGTH);
|
| else
|
| - return SEC_ERROR_INVALID_ALGORITHM;
|
| + return CKR_MECHANISM_INVALID;
|
| }
|
| +#endif
|
|
|
| /*
|
| * SSL Key generation given pre master secret
|
| @@ -6939,12 +6945,11 @@
|
| secretlen = tmp.len;
|
| } else {
|
| secretlen = keySize;
|
| - rv = sftk_ANSI_X9_63_kdf(&secret, keySize,
|
| + crv = sftk_ANSI_X9_63_kdf(&secret, keySize,
|
| &tmp, mechParams->pSharedData,
|
| mechParams->ulSharedDataLen, mechParams->kdf);
|
| PORT_ZFree(tmp.data, tmp.len);
|
| - if (rv != SECSuccess) {
|
| - crv = CKR_HOST_MEMORY;
|
| + if (crv != CKR_OK) {
|
| break;
|
| }
|
| tmp.data = secret;
|
|
|