Index: mozilla/security/nss/lib/freebl/ctr.c |
=================================================================== |
--- mozilla/security/nss/lib/freebl/ctr.c (revision 191424) |
+++ mozilla/security/nss/lib/freebl/ctr.c (working copy) |
@@ -1,167 +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/. */ |
- |
-#ifdef FREEBL_NO_DEPEND |
-#include "stubs.h" |
-#endif |
-#include "prtypes.h" |
-#include "blapit.h" |
-#include "blapii.h" |
-#include "ctr.h" |
-#include "pkcs11t.h" |
-#include "secerr.h" |
- |
-SECStatus |
-CTR_InitContext(CTRContext *ctr, void *context, freeblCipherFunc cipher, |
- const unsigned char *param, unsigned int blocksize) |
-{ |
- const CK_AES_CTR_PARAMS *ctrParams = (const CK_AES_CTR_PARAMS *)param; |
- |
- if (ctrParams->ulCounterBits == 0 || |
- ctrParams->ulCounterBits > blocksize * PR_BITS_PER_BYTE) { |
- PORT_SetError(SEC_ERROR_INVALID_ARGS); |
- return SECFailure; |
- } |
- |
- /* Invariant: 0 < ctr->bufPtr <= blocksize */ |
- ctr->bufPtr = blocksize; /* no unused data in the buffer */ |
- ctr->cipher = cipher; |
- ctr->context = context; |
- ctr->counterBits = ctrParams->ulCounterBits; |
- if (blocksize > sizeof(ctr->counter) || |
- blocksize > sizeof(ctrParams->cb)) { |
- PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); |
- return SECFailure; |
- } |
- PORT_Memcpy(ctr->counter, ctrParams->cb, blocksize); |
- return SECSuccess; |
-} |
- |
-CTRContext * |
-CTR_CreateContext(void *context, freeblCipherFunc cipher, |
- const unsigned char *param, unsigned int blocksize) |
-{ |
- CTRContext *ctr; |
- SECStatus rv; |
- |
- /* first fill in the Counter context */ |
- ctr = PORT_ZNew(CTRContext); |
- if (ctr == NULL) { |
- return NULL; |
- } |
- rv = CTR_InitContext(ctr, context, cipher, param, blocksize); |
- if (rv != SECSuccess) { |
- CTR_DestroyContext(ctr, PR_TRUE); |
- ctr = NULL; |
- } |
- return ctr; |
-} |
- |
-void |
-CTR_DestroyContext(CTRContext *ctr, PRBool freeit) |
-{ |
- PORT_Memset(ctr, 0, sizeof(CTRContext)); |
- if (freeit) { |
- PORT_Free(ctr); |
- } |
-} |
- |
-/* |
- * Used by counter mode. Increment the counter block. Not all bits in the |
- * counter block are part of the counter, counterBits tells how many bits |
- * are part of the counter. The counter block is blocksize long. It's a |
- * big endian value. |
- * |
- * XXX Does not handle counter rollover. |
- */ |
-static void |
-ctr_GetNextCtr(unsigned char *counter, unsigned int counterBits, |
- unsigned int blocksize) |
-{ |
- unsigned char *counterPtr = counter + blocksize - 1; |
- unsigned char mask, count; |
- |
- PORT_Assert(counterBits <= blocksize*PR_BITS_PER_BYTE); |
- while (counterBits >= PR_BITS_PER_BYTE) { |
- if (++(*(counterPtr--))) { |
- return; |
- } |
- counterBits -= PR_BITS_PER_BYTE; |
- } |
- if (counterBits == 0) { |
- return; |
- } |
- /* increment the final partial byte */ |
- mask = (1 << counterBits)-1; |
- count = ++(*counterPtr) & mask; |
- *counterPtr = ((*counterPtr) & ~mask) | count; |
- return; |
-} |
- |
-static void |
-ctr_xor(unsigned char *target, const unsigned char *x, |
- const unsigned char *y, unsigned int count) |
-{ |
- unsigned int i; |
- for (i=0; i < count; i++) { |
- *target++ = *x++ ^ *y++; |
- } |
-} |
- |
-SECStatus |
-CTR_Update(CTRContext *ctr, unsigned char *outbuf, |
- unsigned int *outlen, unsigned int maxout, |
- const unsigned char *inbuf, unsigned int inlen, |
- unsigned int blocksize) |
-{ |
- unsigned int tmp; |
- SECStatus rv; |
- |
- if (maxout < inlen) { |
- *outlen = inlen; |
- PORT_SetError(SEC_ERROR_OUTPUT_LEN); |
- return SECFailure; |
- } |
- *outlen = 0; |
- if (ctr->bufPtr != blocksize) { |
- unsigned int needed = PR_MIN(blocksize-ctr->bufPtr, inlen); |
- ctr_xor(outbuf, inbuf, ctr->buffer+ctr->bufPtr, needed); |
- ctr->bufPtr += needed; |
- outbuf += needed; |
- inbuf += needed; |
- *outlen += needed; |
- inlen -= needed; |
- if (inlen == 0) { |
- return SECSuccess; |
- } |
- PORT_Assert(ctr->bufPtr == blocksize); |
- } |
- |
- while (inlen >= blocksize) { |
- rv = (*ctr->cipher)(ctr->context, ctr->buffer, &tmp, blocksize, |
- ctr->counter, blocksize, blocksize); |
- ctr_GetNextCtr(ctr->counter, ctr->counterBits, blocksize); |
- if (rv != SECSuccess) { |
- return SECFailure; |
- } |
- ctr_xor(outbuf, inbuf, ctr->buffer, blocksize); |
- outbuf += blocksize; |
- inbuf += blocksize; |
- *outlen += blocksize; |
- inlen -= blocksize; |
- } |
- if (inlen == 0) { |
- return SECSuccess; |
- } |
- rv = (*ctr->cipher)(ctr->context, ctr->buffer, &tmp, blocksize, |
- ctr->counter, blocksize, blocksize); |
- ctr_GetNextCtr(ctr->counter, ctr->counterBits, blocksize); |
- if (rv != SECSuccess) { |
- return SECFailure; |
- } |
- ctr_xor(outbuf, inbuf, ctr->buffer, inlen); |
- ctr->bufPtr = inlen; |
- *outlen += inlen; |
- return SECSuccess; |
-} |