| Index: mozilla/security/nss/lib/freebl/tlsprfalg.c
|
| ===================================================================
|
| --- mozilla/security/nss/lib/freebl/tlsprfalg.c (revision 191424)
|
| +++ mozilla/security/nss/lib/freebl/tlsprfalg.c (working copy)
|
| @@ -1,137 +0,0 @@
|
| -/* tlsprfalg.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: tlsprfalg.c,v 1.9 2012/06/26 22:27:29 rrelyea%redhat.com Exp $ */
|
| -
|
| -#ifdef FREEBL_NO_DEPEND
|
| -#include "stubs.h"
|
| -#endif
|
| -
|
| -#include "blapi.h"
|
| -#include "hasht.h"
|
| -#include "alghmac.h"
|
| -
|
| -
|
| -#define PHASH_STATE_MAX_LEN HASH_LENGTH_MAX
|
| -
|
| -/* TLS P_hash function */
|
| -SECStatus
|
| -TLS_P_hash(HASH_HashType hashType, const SECItem *secret, const char *label,
|
| - SECItem *seed, SECItem *result, PRBool isFIPS)
|
| -{
|
| - unsigned char state[PHASH_STATE_MAX_LEN];
|
| - unsigned char outbuf[PHASH_STATE_MAX_LEN];
|
| - unsigned int state_len = 0, label_len = 0, outbuf_len = 0, chunk_size;
|
| - unsigned int remaining;
|
| - unsigned char *res;
|
| - SECStatus status;
|
| - HMACContext *cx;
|
| - SECStatus rv = SECFailure;
|
| - const SECHashObject *hashObj = HASH_GetRawHashObject(hashType);
|
| -
|
| - PORT_Assert((secret != NULL) && (secret->data != NULL || !secret->len));
|
| - PORT_Assert((seed != NULL) && (seed->data != NULL));
|
| - PORT_Assert((result != NULL) && (result->data != NULL));
|
| -
|
| - remaining = result->len;
|
| - res = result->data;
|
| -
|
| - if (label != NULL)
|
| - label_len = PORT_Strlen(label);
|
| -
|
| - cx = HMAC_Create(hashObj, secret->data, secret->len, isFIPS);
|
| - if (cx == NULL)
|
| - goto loser;
|
| -
|
| - /* initialize the state = A(1) = HMAC_hash(secret, seed) */
|
| - HMAC_Begin(cx);
|
| - HMAC_Update(cx, (unsigned char *)label, label_len);
|
| - HMAC_Update(cx, seed->data, seed->len);
|
| - status = HMAC_Finish(cx, state, &state_len, sizeof(state));
|
| - if (status != SECSuccess)
|
| - goto loser;
|
| -
|
| - /* generate a block at a time until we're done */
|
| - while (remaining > 0) {
|
| -
|
| - HMAC_Begin(cx);
|
| - HMAC_Update(cx, state, state_len);
|
| - if (label_len)
|
| - HMAC_Update(cx, (unsigned char *)label, label_len);
|
| - HMAC_Update(cx, seed->data, seed->len);
|
| - status = HMAC_Finish(cx, outbuf, &outbuf_len, sizeof(outbuf));
|
| - if (status != SECSuccess)
|
| - goto loser;
|
| -
|
| - /* Update the state = A(i) = HMAC_hash(secret, A(i-1)) */
|
| - HMAC_Begin(cx);
|
| - HMAC_Update(cx, state, state_len);
|
| - status = HMAC_Finish(cx, state, &state_len, sizeof(state));
|
| - if (status != SECSuccess)
|
| - goto loser;
|
| -
|
| - chunk_size = PR_MIN(outbuf_len, remaining);
|
| - PORT_Memcpy(res, &outbuf, chunk_size);
|
| - res += chunk_size;
|
| - remaining -= chunk_size;
|
| - }
|
| -
|
| - rv = SECSuccess;
|
| -
|
| -loser:
|
| - /* clear out state so it's not left on the stack */
|
| - if (cx)
|
| - HMAC_Destroy(cx, PR_TRUE);
|
| - PORT_Memset(state, 0, sizeof(state));
|
| - PORT_Memset(outbuf, 0, sizeof(outbuf));
|
| - return rv;
|
| -}
|
| -
|
| -SECStatus
|
| -TLS_PRF(const SECItem *secret, const char *label, SECItem *seed,
|
| - SECItem *result, PRBool isFIPS)
|
| -{
|
| - SECStatus rv = SECFailure, status;
|
| - unsigned int i;
|
| - SECItem tmp = { siBuffer, NULL, 0};
|
| - SECItem S1;
|
| - SECItem S2;
|
| -
|
| - PORT_Assert((secret != NULL) && (secret->data != NULL || !secret->len));
|
| - PORT_Assert((seed != NULL) && (seed->data != NULL));
|
| - PORT_Assert((result != NULL) && (result->data != NULL));
|
| -
|
| - S1.type = siBuffer;
|
| - S1.len = (secret->len / 2) + (secret->len & 1);
|
| - S1.data = secret->data;
|
| -
|
| - S2.type = siBuffer;
|
| - S2.len = S1.len;
|
| - S2.data = secret->data + (secret->len - S2.len);
|
| -
|
| - tmp.data = (unsigned char*)PORT_Alloc(result->len);
|
| - if (tmp.data == NULL)
|
| - goto loser;
|
| - tmp.len = result->len;
|
| -
|
| - status = TLS_P_hash(HASH_AlgMD5, &S1, label, seed, result, isFIPS);
|
| - if (status != SECSuccess)
|
| - goto loser;
|
| -
|
| - status = TLS_P_hash(HASH_AlgSHA1, &S2, label, seed, &tmp, isFIPS);
|
| - if (status != SECSuccess)
|
| - goto loser;
|
| -
|
| - for (i = 0; i < result->len; i++)
|
| - result->data[i] ^= tmp.data[i];
|
| -
|
| - rv = SECSuccess;
|
| -
|
| -loser:
|
| - if (tmp.data != NULL)
|
| - PORT_ZFree(tmp.data, tmp.len);
|
| - return rv;
|
| -}
|
| -
|
|
|