| OLD | NEW |
| 1 /* This Source Code Form is subject to the terms of the Mozilla Public | 1 /* This Source Code Form is subject to the terms of the Mozilla Public |
| 2 * License, v. 2.0. If a copy of the MPL was not distributed with this | 2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
| 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| 4 | 4 |
| 5 #ifdef FREEBL_NO_DEPEND | 5 #ifdef FREEBL_NO_DEPEND |
| 6 #include "stubs.h" | 6 #include "stubs.h" |
| 7 #endif | 7 #endif |
| 8 | 8 |
| 9 #include "prinit.h" | 9 #include "prinit.h" |
| 10 #include "prenv.h" |
| 10 #include "prerr.h" | 11 #include "prerr.h" |
| 11 #include "secerr.h" | 12 #include "secerr.h" |
| 12 | 13 |
| 13 #include "prtypes.h" | 14 #include "prtypes.h" |
| 14 #include "blapi.h" | 15 #include "blapi.h" |
| 15 #include "rijndael.h" | 16 #include "rijndael.h" |
| 16 | 17 |
| 17 #include "cts.h" | 18 #include "cts.h" |
| 18 #include "ctr.h" | 19 #include "ctr.h" |
| 19 #include "gcm.h" | 20 #include "gcm.h" |
| 20 | 21 |
| 21 #ifdef USE_HW_AES | 22 #ifdef USE_HW_AES |
| 22 #include "intel-aes.h" | 23 #include "intel-aes.h" |
| 23 #include "mpi.h" | 24 #include "mpi.h" |
| 24 | 25 |
| 25 static int has_intel_aes = 0; | 26 static int has_intel_aes = 0; |
| 26 static PRBool use_hw_aes = PR_FALSE; | 27 static PRBool use_hw_aes = PR_FALSE; |
| 27 | 28 |
| 28 #ifdef INTEL_GCM | 29 #ifdef INTEL_GCM |
| 29 #include "intel-gcm.h" | 30 #include "intel-gcm.h" |
| 30 static int has_intel_avx = 0; | 31 static int has_intel_avx = 0; |
| 31 static int has_intel_clmul = 0; | 32 static int has_intel_clmul = 0; |
| 32 static PRBool use_hw_gcm = PR_FALSE; | 33 static PRBool use_hw_gcm = PR_FALSE; |
| 34 #if defined(_MSC_VER) && !defined(_M_IX86) |
| 35 #include <intrin.h> /* for _xgetbv() */ |
| 36 #endif |
| 33 #endif | 37 #endif |
| 34 #endif /* USE_HW_AES */ | 38 #endif /* USE_HW_AES */ |
| 35 | 39 |
| 36 /* | 40 /* |
| 37 * There are currently five ways to build this code, varying in performance | 41 * There are currently five ways to build this code, varying in performance |
| 38 * and code size. | 42 * and code size. |
| 39 * | 43 * |
| 40 * RIJNDAEL_INCLUDE_TABLES Include all tables from rijndael32.tab | 44 * RIJNDAEL_INCLUDE_TABLES Include all tables from rijndael32.tab |
| 41 * RIJNDAEL_GENERATE_TABLES Generate tables on first | 45 * RIJNDAEL_GENERATE_TABLES Generate tables on first |
| 42 * encryption/decryption, then store them; | 46 * encryption/decryption, then store them; |
| (...skipping 988 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1031 PORT_SetError(SEC_ERROR_INVALID_ARGS); | 1035 PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| 1032 return SECFailure; | 1036 return SECFailure; |
| 1033 } | 1037 } |
| 1034 if (!cx) { | 1038 if (!cx) { |
| 1035 PORT_SetError(SEC_ERROR_INVALID_ARGS); | 1039 PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| 1036 return SECFailure; | 1040 return SECFailure; |
| 1037 } | 1041 } |
| 1038 #ifdef USE_HW_AES | 1042 #ifdef USE_HW_AES |
| 1039 if (has_intel_aes == 0) { | 1043 if (has_intel_aes == 0) { |
| 1040 unsigned long eax, ebx, ecx, edx; | 1044 unsigned long eax, ebx, ecx, edx; |
| 1041 » char *disable_hw_aes = getenv("NSS_DISABLE_HW_AES"); | 1045 » char *disable_hw_aes = PR_GetEnvSecure("NSS_DISABLE_HW_AES"); |
| 1042 | 1046 |
| 1043 if (disable_hw_aes == NULL) { | 1047 if (disable_hw_aes == NULL) { |
| 1044 freebl_cpuid(1, &eax, &ebx, &ecx, &edx); | 1048 freebl_cpuid(1, &eax, &ebx, &ecx, &edx); |
| 1045 has_intel_aes = (ecx & (1 << 25)) != 0 ? 1 : -1; | 1049 has_intel_aes = (ecx & (1 << 25)) != 0 ? 1 : -1; |
| 1046 #ifdef INTEL_GCM | 1050 #ifdef INTEL_GCM |
| 1047 has_intel_clmul = (ecx & (1 << 1)) != 0 ? 1 : -1; | 1051 has_intel_clmul = (ecx & (1 << 1)) != 0 ? 1 : -1; |
| 1048 if ((ecx & (1 << 27)) != 0 && (ecx & (1 << 28)) != 0 && | 1052 if ((ecx & (1 << 27)) != 0 && (ecx & (1 << 28)) != 0 && |
| 1049 check_xcr0_ymm()) { | 1053 check_xcr0_ymm()) { |
| 1050 has_intel_avx = 1; | 1054 has_intel_avx = 1; |
| 1051 } else { | 1055 } else { |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1314 return SECFailure; | 1318 return SECFailure; |
| 1315 } | 1319 } |
| 1316 if (maxOutputLen < inputLen) { | 1320 if (maxOutputLen < inputLen) { |
| 1317 PORT_SetError(SEC_ERROR_OUTPUT_LEN); | 1321 PORT_SetError(SEC_ERROR_OUTPUT_LEN); |
| 1318 return SECFailure; | 1322 return SECFailure; |
| 1319 } | 1323 } |
| 1320 *outputLen = inputLen; | 1324 *outputLen = inputLen; |
| 1321 return (*cx->worker)(cx->worker_cx, output, outputLen, maxOutputLen, | 1325 return (*cx->worker)(cx->worker_cx, output, outputLen, maxOutputLen, |
| 1322 input, inputLen, blocksize); | 1326 input, inputLen, blocksize); |
| 1323 } | 1327 } |
| OLD | NEW |