diff options
Diffstat (limited to 'libbb/hash_md5_sha.c')
-rw-r--r-- | libbb/hash_md5_sha.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/libbb/hash_md5_sha.c b/libbb/hash_md5_sha.c index ee19c1cb7..a23db5152 100644 --- a/libbb/hash_md5_sha.c +++ b/libbb/hash_md5_sha.c | |||
@@ -699,7 +699,7 @@ static void FAST_FUNC sha1_process_block64(sha1_ctx_t *ctx UNUSED_PARAM) | |||
699 | 699 | ||
700 | /* in hash_md5_sha_x86-64.S */ | 700 | /* in hash_md5_sha_x86-64.S */ |
701 | struct ASM_expects_80 { char t[1 - 2*(offsetof(sha1_ctx_t, hash) != 80)]; }; | 701 | struct ASM_expects_80 { char t[1 - 2*(offsetof(sha1_ctx_t, hash) != 80)]; }; |
702 | void FAST_FUNC sha1_process_block64(sha1_ctx_t *ctx UNUSED_PARAM); | 702 | void FAST_FUNC sha1_process_block64(sha1_ctx_t *ctx); |
703 | 703 | ||
704 | # else | 704 | # else |
705 | /* Fast, fully-unrolled SHA1. +3800 bytes of code on x86. | 705 | /* Fast, fully-unrolled SHA1. +3800 bytes of code on x86. |
@@ -1142,6 +1142,25 @@ static void FAST_FUNC sha512_process_block128(sha512_ctx_t *ctx) | |||
1142 | } | 1142 | } |
1143 | #endif /* NEED_SHA512 */ | 1143 | #endif /* NEED_SHA512 */ |
1144 | 1144 | ||
1145 | #if ENABLE_SHA1_HWACCEL | ||
1146 | # if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) | ||
1147 | static void cpuid(unsigned *eax, unsigned *ebx, unsigned *ecx, unsigned *edx) | ||
1148 | { | ||
1149 | asm ("cpuid" | ||
1150 | : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) | ||
1151 | : "0"(*eax), "1"(*ebx), "2"(*ecx), "3"(*edx) | ||
1152 | ); | ||
1153 | } | ||
1154 | void FAST_FUNC sha1_process_block64_shaNI(sha1_ctx_t *ctx); | ||
1155 | # if defined(__i386__) | ||
1156 | struct ASM_expects_76_shaNI { char t[1 - 2*(offsetof(sha1_ctx_t, hash) != 76)]; }; | ||
1157 | # endif | ||
1158 | # if defined(__x86_64__) | ||
1159 | struct ASM_expects_80_shaNI { char t[1 - 2*(offsetof(sha1_ctx_t, hash) != 80)]; }; | ||
1160 | # endif | ||
1161 | # endif | ||
1162 | #endif | ||
1163 | |||
1145 | void FAST_FUNC sha1_begin(sha1_ctx_t *ctx) | 1164 | void FAST_FUNC sha1_begin(sha1_ctx_t *ctx) |
1146 | { | 1165 | { |
1147 | ctx->hash[0] = 0x67452301; | 1166 | ctx->hash[0] = 0x67452301; |
@@ -1151,6 +1170,20 @@ void FAST_FUNC sha1_begin(sha1_ctx_t *ctx) | |||
1151 | ctx->hash[4] = 0xc3d2e1f0; | 1170 | ctx->hash[4] = 0xc3d2e1f0; |
1152 | ctx->total64 = 0; | 1171 | ctx->total64 = 0; |
1153 | ctx->process_block = sha1_process_block64; | 1172 | ctx->process_block = sha1_process_block64; |
1173 | #if ENABLE_SHA1_HWACCEL | ||
1174 | # if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) | ||
1175 | { | ||
1176 | static smallint shaNI; | ||
1177 | if (!shaNI) { | ||
1178 | unsigned eax = 7, ebx = ebx, ecx = 0, edx = edx; | ||
1179 | cpuid(&eax, &ebx, &ecx, &edx); | ||
1180 | shaNI = ((ebx >> 29) << 1) - 1; | ||
1181 | } | ||
1182 | if (shaNI > 0) | ||
1183 | ctx->process_block = sha1_process_block64_shaNI; | ||
1184 | } | ||
1185 | # endif | ||
1186 | #endif | ||
1154 | } | 1187 | } |
1155 | 1188 | ||
1156 | static const uint32_t init256[] ALIGN4 = { | 1189 | static const uint32_t init256[] ALIGN4 = { |