| Index: mozilla/security/nss/lib/softoken/tlsprf.c
|
| ===================================================================
|
| --- mozilla/security/nss/lib/softoken/tlsprf.c (revision 191424)
|
| +++ mozilla/security/nss/lib/softoken/tlsprf.c (working copy)
|
| @@ -1,183 +0,0 @@
|
| -/* tlsprf.c - TLS Pseudo Random Function (PRF) implementation
|
| - *
|
| - * 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/. */
|
| -/* $Id: tlsprf.c,v 1.7 2012/04/25 14:50:10 gerv%gerv.net Exp $ */
|
| -
|
| -#include "pkcs11i.h"
|
| -#include "blapi.h"
|
| -
|
| -#define SFTK_OFFSETOF(str, memb) ((PRPtrdiff)(&(((str *)0)->memb)))
|
| -
|
| -static void sftk_TLSPRFNull(void *data, PRBool freeit)
|
| -{
|
| - return;
|
| -}
|
| -
|
| -typedef struct {
|
| - PRUint32 cxSize; /* size of allocated block, in bytes. */
|
| - PRUint32 cxBufSize; /* sizeof buffer at cxBufPtr. */
|
| - unsigned char *cxBufPtr; /* points to real buffer, may be cxBuf. */
|
| - PRUint32 cxKeyLen; /* bytes of cxBufPtr containing key. */
|
| - PRUint32 cxDataLen; /* bytes of cxBufPtr containing data. */
|
| - SECStatus cxRv; /* records failure of void functions. */
|
| - PRBool cxIsFIPS; /* true if conforming to FIPS 198. */
|
| - unsigned char cxBuf[512]; /* actual size may be larger than 512. */
|
| -} TLSPRFContext;
|
| -
|
| -static void
|
| -sftk_TLSPRFHashUpdate(TLSPRFContext *cx, const unsigned char *data,
|
| - unsigned int data_len)
|
| -{
|
| - PRUint32 bytesUsed = cx->cxKeyLen + cx->cxDataLen;
|
| -
|
| - if (cx->cxRv != SECSuccess) /* function has previously failed. */
|
| - return;
|
| - if (bytesUsed + data_len > cx->cxBufSize) {
|
| - /* We don't use realloc here because
|
| - ** (a) realloc doesn't zero out the old block, and
|
| - ** (b) if realloc fails, we lose the old block.
|
| - */
|
| - PRUint32 newBufSize = bytesUsed + data_len + 512;
|
| - unsigned char * newBuf = (unsigned char *)PORT_Alloc(newBufSize);
|
| - if (!newBuf) {
|
| - cx->cxRv = SECFailure;
|
| - return;
|
| - }
|
| - PORT_Memcpy(newBuf, cx->cxBufPtr, bytesUsed);
|
| - if (cx->cxBufPtr != cx->cxBuf) {
|
| - PORT_ZFree(cx->cxBufPtr, bytesUsed);
|
| - }
|
| - cx->cxBufPtr = newBuf;
|
| - cx->cxBufSize = newBufSize;
|
| - }
|
| - PORT_Memcpy(cx->cxBufPtr + bytesUsed, data, data_len);
|
| - cx->cxDataLen += data_len;
|
| -}
|
| -
|
| -static void
|
| -sftk_TLSPRFEnd(TLSPRFContext *ctx, unsigned char *hashout,
|
| - unsigned int *pDigestLen, unsigned int maxDigestLen)
|
| -{
|
| - *pDigestLen = 0; /* tells Verify that no data has been input yet. */
|
| -}
|
| -
|
| -/* Compute the PRF values from the data previously input. */
|
| -static SECStatus
|
| -sftk_TLSPRFUpdate(TLSPRFContext *cx,
|
| - unsigned char *sig, /* output goes here. */
|
| - unsigned int * sigLen, /* how much output. */
|
| - unsigned int maxLen, /* output buffer size */
|
| - unsigned char *hash, /* unused. */
|
| - unsigned int hashLen) /* unused. */
|
| -{
|
| - SECStatus rv;
|
| - SECItem sigItem;
|
| - SECItem seedItem;
|
| - SECItem secretItem;
|
| -
|
| - if (cx->cxRv != SECSuccess)
|
| - return cx->cxRv;
|
| -
|
| - secretItem.data = cx->cxBufPtr;
|
| - secretItem.len = cx->cxKeyLen;
|
| -
|
| - seedItem.data = cx->cxBufPtr + cx->cxKeyLen;
|
| - seedItem.len = cx->cxDataLen;
|
| -
|
| - sigItem.data = sig;
|
| - sigItem.len = maxLen;
|
| -
|
| - rv = TLS_PRF(&secretItem, NULL, &seedItem, &sigItem, cx->cxIsFIPS);
|
| - if (rv == SECSuccess && sigLen != NULL)
|
| - *sigLen = sigItem.len;
|
| - return rv;
|
| -
|
| -}
|
| -
|
| -static SECStatus
|
| -sftk_TLSPRFVerify(TLSPRFContext *cx,
|
| - unsigned char *sig, /* input, for comparison. */
|
| - unsigned int sigLen, /* length of sig. */
|
| - unsigned char *hash, /* data to be verified. */
|
| - unsigned int hashLen) /* size of hash data. */
|
| -{
|
| - unsigned char * tmp = (unsigned char *)PORT_Alloc(sigLen);
|
| - unsigned int tmpLen = sigLen;
|
| - SECStatus rv;
|
| -
|
| - if (!tmp)
|
| - return SECFailure;
|
| - if (hashLen) {
|
| - /* hashLen is non-zero when the user does a one-step verify.
|
| - ** In this case, none of the data has been input yet.
|
| - */
|
| - sftk_TLSPRFHashUpdate(cx, hash, hashLen);
|
| - }
|
| - rv = sftk_TLSPRFUpdate(cx, tmp, &tmpLen, sigLen, NULL, 0);
|
| - if (rv == SECSuccess) {
|
| - rv = (SECStatus)(1 - !PORT_Memcmp(tmp, sig, sigLen));
|
| - }
|
| - PORT_ZFree(tmp, sigLen);
|
| - return rv;
|
| -}
|
| -
|
| -static void
|
| -sftk_TLSPRFHashDestroy(TLSPRFContext *cx, PRBool freeit)
|
| -{
|
| - if (freeit) {
|
| - if (cx->cxBufPtr != cx->cxBuf)
|
| - PORT_ZFree(cx->cxBufPtr, cx->cxBufSize);
|
| - PORT_ZFree(cx, cx->cxSize);
|
| - }
|
| -}
|
| -
|
| -CK_RV
|
| -sftk_TLSPRFInit(SFTKSessionContext *context,
|
| - SFTKObject * key,
|
| - CK_KEY_TYPE key_type)
|
| -{
|
| - SFTKAttribute * keyVal;
|
| - TLSPRFContext * prf_cx;
|
| - CK_RV crv = CKR_HOST_MEMORY;
|
| - PRUint32 keySize;
|
| - PRUint32 blockSize;
|
| -
|
| - if (key_type != CKK_GENERIC_SECRET)
|
| - return CKR_KEY_TYPE_INCONSISTENT; /* CKR_KEY_FUNCTION_NOT_PERMITTED */
|
| -
|
| - context->multi = PR_TRUE;
|
| -
|
| - keyVal = sftk_FindAttribute(key, CKA_VALUE);
|
| - keySize = (!keyVal) ? 0 : keyVal->attrib.ulValueLen;
|
| - blockSize = keySize + sizeof(TLSPRFContext);
|
| - prf_cx = (TLSPRFContext *)PORT_Alloc(blockSize);
|
| - if (!prf_cx)
|
| - goto done;
|
| - prf_cx->cxSize = blockSize;
|
| - prf_cx->cxKeyLen = keySize;
|
| - prf_cx->cxDataLen = 0;
|
| - prf_cx->cxBufSize = blockSize - SFTK_OFFSETOF(TLSPRFContext, cxBuf);
|
| - prf_cx->cxRv = SECSuccess;
|
| - prf_cx->cxIsFIPS = (key->slot->slotID == FIPS_SLOT_ID);
|
| - prf_cx->cxBufPtr = prf_cx->cxBuf;
|
| - if (keySize)
|
| - PORT_Memcpy(prf_cx->cxBufPtr, keyVal->attrib.pValue, keySize);
|
| -
|
| - context->hashInfo = (void *) prf_cx;
|
| - context->cipherInfo = (void *) prf_cx;
|
| - context->hashUpdate = (SFTKHash) sftk_TLSPRFHashUpdate;
|
| - context->end = (SFTKEnd) sftk_TLSPRFEnd;
|
| - context->update = (SFTKCipher) sftk_TLSPRFUpdate;
|
| - context->verify = (SFTKVerify) sftk_TLSPRFVerify;
|
| - context->destroy = (SFTKDestroy) sftk_TLSPRFNull;
|
| - context->hashdestroy = (SFTKDestroy) sftk_TLSPRFHashDestroy;
|
| - crv = CKR_OK;
|
| -
|
| -done:
|
| - if (keyVal)
|
| - sftk_FreeAttribute(keyVal);
|
| - return crv;
|
| -}
|
| -
|
|
|