| Index: patches/nss-intel-aes-windows.patch
|
| diff --git a/patches/nss-intel-aes-windows.patch b/patches/nss-intel-aes-windows.patch
|
| deleted file mode 100644
|
| index 67811e79df07ea82f03144030f231ce8d2255848..0000000000000000000000000000000000000000
|
| --- a/patches/nss-intel-aes-windows.patch
|
| +++ /dev/null
|
| @@ -1,272 +0,0 @@
|
| -diff --git a/nss/lib/freebl/ctr.c b/nss/lib/freebl/ctr.c
|
| -index 3a2f1a6..4d26daa 100644
|
| ---- a/nss/lib/freebl/ctr.c
|
| -+++ b/nss/lib/freebl/ctr.c
|
| -@@ -12,6 +12,11 @@
|
| - #include "pkcs11t.h"
|
| - #include "secerr.h"
|
| -
|
| -+#ifdef USE_HW_AES
|
| -+#include "intel-aes.h"
|
| -+#include "rijndael.h"
|
| -+#endif
|
| -+
|
| - SECStatus
|
| - CTR_InitContext(CTRContext *ctr, void *context, freeblCipherFunc cipher,
|
| - const unsigned char *param, unsigned int blocksize)
|
| -@@ -165,3 +170,60 @@ CTR_Update(CTRContext *ctr, unsigned char *outbuf,
|
| - *outlen += inlen;
|
| - return SECSuccess;
|
| - }
|
| -+
|
| -+#if defined(USE_HW_AES) && defined(_MSC_VER)
|
| -+SECStatus
|
| -+CTR_Update_HW_AES(CTRContext *ctr, unsigned char *outbuf,
|
| -+ unsigned int *outlen, unsigned int maxout,
|
| -+ const unsigned char *inbuf, unsigned int inlen,
|
| -+ unsigned int blocksize)
|
| -+{
|
| -+ unsigned int fullblocks;
|
| -+ 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);
|
| -+ }
|
| -+
|
| -+ intel_aes_ctr_worker(((AESContext*)(ctr->context))->Nr)(
|
| -+ ctr, outbuf, outlen, maxout, inbuf, inlen, blocksize);
|
| -+ /* XXX intel_aes_ctr_worker should set *outlen. */
|
| -+ PORT_Assert(*outlen == 0);
|
| -+ fullblocks = (inlen/blocksize)*blocksize;
|
| -+ *outlen += fullblocks;
|
| -+ outbuf += fullblocks;
|
| -+ inbuf += fullblocks;
|
| -+ inlen -= fullblocks;
|
| -+
|
| -+ 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;
|
| -+}
|
| -+#endif
|
| -diff --git a/nss/lib/freebl/ctr.h b/nss/lib/freebl/ctr.h
|
| -index 69ef150..e7645a2 100644
|
| ---- a/nss/lib/freebl/ctr.h
|
| -+++ b/nss/lib/freebl/ctr.h
|
| -@@ -41,4 +41,11 @@ SECStatus CTR_Update(CTRContext *ctr, unsigned char *outbuf,
|
| - const unsigned char *inbuf, unsigned int inlen,
|
| - unsigned int blocksize);
|
| -
|
| -+#ifdef USE_HW_AES
|
| -+SECStatus CTR_Update_HW_AES(CTRContext *ctr, unsigned char *outbuf,
|
| -+ unsigned int *outlen, unsigned int maxout,
|
| -+ const unsigned char *inbuf, unsigned int inlen,
|
| -+ unsigned int blocksize);
|
| -+#endif
|
| -+
|
| - #endif
|
| -diff --git a/nss/lib/freebl/intel-aes.h b/nss/lib/freebl/intel-aes.h
|
| -index 1e18007..3b71e5f 100644
|
| ---- a/nss/lib/freebl/intel-aes.h
|
| -+++ b/nss/lib/freebl/intel-aes.h
|
| -@@ -33,6 +33,12 @@ SECStatus intel_aes_decrypt_cbc_128(AESContext *cx, unsigned char *output,
|
| - const unsigned char *input,
|
| - unsigned int inputLen,
|
| - unsigned int blocksize);
|
| -+SECStatus intel_aes_encrypt_ctr_128(CTRContext *cx, unsigned char *output,
|
| -+ unsigned int *outputLen,
|
| -+ unsigned int maxOutputLen,
|
| -+ const unsigned char *input,
|
| -+ unsigned int inputLen,
|
| -+ unsigned int blocksize);
|
| - SECStatus intel_aes_encrypt_ecb_192(AESContext *cx, unsigned char *output,
|
| - unsigned int *outputLen,
|
| - unsigned int maxOutputLen,
|
| -@@ -57,6 +63,12 @@ SECStatus intel_aes_decrypt_cbc_192(AESContext *cx, unsigned char *output,
|
| - const unsigned char *input,
|
| - unsigned int inputLen,
|
| - unsigned int blocksize);
|
| -+SECStatus intel_aes_encrypt_ctr_192(CTRContext *cx, unsigned char *output,
|
| -+ unsigned int *outputLen,
|
| -+ unsigned int maxOutputLen,
|
| -+ const unsigned char *input,
|
| -+ unsigned int inputLen,
|
| -+ unsigned int blocksize);
|
| - SECStatus intel_aes_encrypt_ecb_256(AESContext *cx, unsigned char *output,
|
| - unsigned int *outputLen,
|
| - unsigned int maxOutputLen,
|
| -@@ -81,6 +93,12 @@ SECStatus intel_aes_decrypt_cbc_256(AESContext *cx, unsigned char *output,
|
| - const unsigned char *input,
|
| - unsigned int inputLen,
|
| - unsigned int blocksize);
|
| -+SECStatus intel_aes_encrypt_ctr_256(CTRContext *cx, unsigned char *output,
|
| -+ unsigned int *outputLen,
|
| -+ unsigned int maxOutputLen,
|
| -+ const unsigned char *input,
|
| -+ unsigned int inputLen,
|
| -+ unsigned int blocksize);
|
| -
|
| -
|
| - #define intel_aes_ecb_worker(encrypt, keysize) \
|
| -@@ -102,6 +120,11 @@ SECStatus intel_aes_decrypt_cbc_256(AESContext *cx, unsigned char *output,
|
| - (keysize) == 24 ? intel_aes_decrypt_cbc_192 : \
|
| - intel_aes_decrypt_cbc_256))
|
| -
|
| -+#define intel_aes_ctr_worker(nr) \
|
| -+ ((nr) == 10 ? intel_aes_encrypt_ctr_128 : \
|
| -+ (nr) == 12 ? intel_aes_encrypt_ctr_192 : \
|
| -+ intel_aes_encrypt_ctr_256)
|
| -+
|
| -
|
| - #define intel_aes_init(encrypt, keysize) \
|
| - do { \
|
| -diff --git a/nss/lib/freebl/intel-gcm-wrap.c b/nss/lib/freebl/intel-gcm-wrap.c
|
| -index b2f6f5e..afd3029 100644
|
| ---- a/nss/lib/freebl/intel-gcm-wrap.c
|
| -+++ b/nss/lib/freebl/intel-gcm-wrap.c
|
| -@@ -3,7 +3,7 @@
|
| - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
| - /* Copyright(c) 2013, Intel Corp. */
|
| -
|
| --/* Wrapper funcions for Intel optimized implementation of AES-GCM */
|
| -+/* Wrapper functions for Intel optimized implementation of AES-GCM */
|
| -
|
| - #ifdef USE_HW_AES
|
| -
|
| -@@ -24,12 +24,8 @@
|
| - #include "intel-gcm.h"
|
| - #include "rijndael.h"
|
| -
|
| --#if defined(__INTEL_COMPILER)
|
| --#include <ia32intrin.h>
|
| --#elif defined(__GNUC__)
|
| - #include <emmintrin.h>
|
| - #include <tmmintrin.h>
|
| --#endif
|
| -
|
| -
|
| - struct intel_AES_GCMContextStr{
|
| -@@ -143,9 +139,9 @@ void intel_AES_GCM_DestroyContext(intel_AES_GCMContext *gcm, PRBool freeit)
|
| -
|
| - SECStatus intel_AES_GCM_EncryptUpdate(intel_AES_GCMContext *gcm,
|
| - unsigned char *outbuf,
|
| -- unsigned int *outlen, unsigned int maxout,
|
| -- const unsigned char *inbuf, unsigned int inlen,
|
| -- unsigned int blocksize)
|
| -+ unsigned int *outlen, unsigned int maxout,
|
| -+ const unsigned char *inbuf, unsigned int inlen,
|
| -+ unsigned int blocksize)
|
| - {
|
| - unsigned int tagBytes;
|
| - unsigned char T[AES_BLOCK_SIZE];
|
| -@@ -189,9 +185,9 @@ SECStatus intel_AES_GCM_EncryptUpdate(intel_AES_GCMContext *gcm,
|
| -
|
| - SECStatus intel_AES_GCM_DecryptUpdate(intel_AES_GCMContext *gcm,
|
| - unsigned char *outbuf,
|
| -- unsigned int *outlen, unsigned int maxout,
|
| -- const unsigned char *inbuf, unsigned int inlen,
|
| -- unsigned int blocksize)
|
| -+ unsigned int *outlen, unsigned int maxout,
|
| -+ const unsigned char *inbuf, unsigned int inlen,
|
| -+ unsigned int blocksize)
|
| - {
|
| - unsigned int tagBytes;
|
| - unsigned char T[AES_BLOCK_SIZE];
|
| -@@ -201,13 +197,19 @@ SECStatus intel_AES_GCM_DecryptUpdate(intel_AES_GCMContext *gcm,
|
| -
|
| - /* get the authentication block */
|
| - if (inlen < tagBytes) {
|
| -- PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| -+ PORT_SetError(SEC_ERROR_INPUT_LEN);
|
| - return SECFailure;
|
| - }
|
| -
|
| - inlen -= tagBytes;
|
| - intag = inbuf + inlen;
|
| -
|
| -+ if (maxout < inlen) {
|
| -+ *outlen = inlen;
|
| -+ PORT_SetError(SEC_ERROR_OUTPUT_LEN);
|
| -+ return SECFailure;
|
| -+ }
|
| -+
|
| - intel_aes_gcmDEC(
|
| - inbuf,
|
| - outbuf,
|
| -@@ -224,6 +226,8 @@ SECStatus intel_AES_GCM_DecryptUpdate(intel_AES_GCMContext *gcm,
|
| - T);
|
| -
|
| - if (NSS_SecureMemcmp(T, intag, tagBytes) != 0) {
|
| -+ memset(outbuf, 0, inlen);
|
| -+ *outlen = 0;
|
| - /* force a CKR_ENCRYPTED_DATA_INVALID error at in softoken */
|
| - PORT_SetError(SEC_ERROR_BAD_DATA);
|
| - return SECFailure;
|
| -diff --git a/nss/lib/freebl/rijndael.c b/nss/lib/freebl/rijndael.c
|
| -index 8bb8905..9703867 100644
|
| ---- a/nss/lib/freebl/rijndael.c
|
| -+++ b/nss/lib/freebl/rijndael.c
|
| -@@ -1063,8 +1063,10 @@ aes_InitContext(AESContext *cx, const unsigned char *key, unsigned int keysize,
|
| - intel_aes_cbc_worker(encrypt, keysize);
|
| - } else
|
| - #endif
|
| -+ {
|
| - cx->worker = (freeblCipherFunc) (encrypt
|
| - ? &rijndael_encryptCBC : &rijndael_decryptCBC);
|
| -+ }
|
| - } else {
|
| - #if USE_HW_AES
|
| - if (use_hw_aes) {
|
| -@@ -1072,8 +1074,10 @@ aes_InitContext(AESContext *cx, const unsigned char *key, unsigned int keysize,
|
| - intel_aes_ecb_worker(encrypt, keysize);
|
| - } else
|
| - #endif
|
| -+ {
|
| - cx->worker = (freeblCipherFunc) (encrypt
|
| - ? &rijndael_encryptECB : &rijndael_decryptECB);
|
| -+ }
|
| - }
|
| - PORT_Assert((cx->Nb * (cx->Nr + 1)) <= RIJNDAEL_MAX_EXP_KEY_SIZE);
|
| - if ((cx->Nb * (cx->Nr + 1)) > RIJNDAEL_MAX_EXP_KEY_SIZE) {
|
| -@@ -1171,7 +1175,14 @@ AES_InitContext(AESContext *cx, const unsigned char *key, unsigned int keysize,
|
| - break;
|
| - case NSS_AES_CTR:
|
| - cx->worker_cx = CTR_CreateContext(cx, cx->worker, iv, blocksize);
|
| -- cx->worker = (freeblCipherFunc) CTR_Update ;
|
| -+#if defined(USE_HW_AES) && defined(_MSC_VER)
|
| -+ if (use_hw_aes) {
|
| -+ cx->worker = (freeblCipherFunc) CTR_Update_HW_AES;
|
| -+ } else
|
| -+#endif
|
| -+ {
|
| -+ cx->worker = (freeblCipherFunc) CTR_Update;
|
| -+ }
|
| - cx->destroy = (freeblDestroyFunc) CTR_DestroyContext;
|
| - cx->isBlock = PR_FALSE;
|
| - break;
|
|
|