Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(760)

Unified Diff: nss/lib/freebl/ctr.c

Issue 214183004: Implement AES in different modes of operation, using AES-NI and (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/nss.git@master
Patch Set: Add a patch file and document it in README.chromium. Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: nss/lib/freebl/ctr.c
diff --git a/nss/lib/freebl/ctr.c b/nss/lib/freebl/ctr.c
index 3a2f1a6b82b7818e6052e400a387ac76ec57848e..78075853376adf8a8c6f95dad9cc48bfe4307e9d 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,56 @@ 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)
Ryan Sleevi 2014/04/23 19:53:34 Alignment?
wtc 2014/04/24 01:04:10 Done. I will also align the parameters of the othe
+{
+ 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);
Ryan Sleevi 2014/04/23 19:53:34 spaces here between ctr->buffer and ctr->bufPtr?
wtc 2014/04/24 01:04:10 I will fix this in the NSS upstream.
+ 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);
+ *outlen += inlen & (-16);
+ outbuf += inlen & (-16);
+ inbuf += inlen & (-16);
+ inlen &= 16 - 1;
Ryan Sleevi 2014/04/23 19:53:34 This style surprises me, if only because it seems
wtc 2014/04/24 01:04:10 Done. This code also assumes |blocksize| is 16. I
+
+ if (inlen == 0) {
+ return SECSuccess;
+ }
+ rv = (*ctr->cipher)(ctr->context, ctr->buffer, &tmp, blocksize,
Ryan Sleevi 2014/04/23 19:53:34 Should we add a PORT_Assert that tmp == blocksize?
wtc 2014/04/24 01:04:10 Done.
+ ctr->counter, blocksize, blocksize);
+ ctr_GetNextCtr(ctr->counter, ctr->counterBits, blocksize);
Ryan Sleevi 2014/04/23 19:53:34 Why does this happen before the rv check?
wtc 2014/04/24 01:04:10 I don't really know. Perhaps the author wanted to
+ if (rv != SECSuccess) {
+ return SECFailure;
+ }
+ ctr_xor(outbuf, inbuf, ctr->buffer, inlen);
+ ctr->bufPtr = inlen;
+ *outlen += inlen;
+ return SECSuccess;
+}
+#endif

Powered by Google App Engine
This is Rietveld 408576698