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 |