diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2009-03-11 21:15:51 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2009-03-11 21:15:51 +0000 |
| commit | 98c87f75755c1b53c8bd84f487e4bc7cba359b3e (patch) | |
| tree | 7850459b7323f2f6cf338f0022009eea7c43748f | |
| parent | 54ac03a61885c714b4ef606b0a09129b27f72626 (diff) | |
| download | busybox-w32-98c87f75755c1b53c8bd84f487e4bc7cba359b3e.tar.gz busybox-w32-98c87f75755c1b53c8bd84f487e4bc7cba359b3e.tar.bz2 busybox-w32-98c87f75755c1b53c8bd84f487e4bc7cba359b3e.zip | |
sha256/512: code shrink. Run-tested.
function old new delta
sha512_process_block128 - 1444 +1444
sha1_process_block64 - 542 +542
sha256_process_block64 - 529 +529
K512_lo - 320 +320
K256 - 320 +320
init512_lo - 32 +32
init256 - 32 +32
sha1_hash 99 128 +29
sha256_end 160 135 -25
sha1_end 189 160 -29
sha512_end 237 204 -33
sha256_begin 77 44 -33
sha512_begin 154 88 -66
sha256_hash 338 259 -79
sha512_hash 358 262 -96
sha1_compile 542 - -542
sha256_process_block 594 - -594
static.K 896 - -896
sha512_process_block 1861 - -1861
------------------------------------------------------------------------------
(add/remove: 7/4 grow/shrink: 1/7 up/down: 3248/-4254) Total: -1006 bytes
text data bss dec hex filename
808013 468 7856 816337 c74d1 busybox_old
807007 468 7856 815331 c70e3 busybox_unstripped
| -rw-r--r-- | include/libbb.h | 16 | ||||
| -rw-r--r-- | libbb/sha1.c | 537 |
2 files changed, 261 insertions, 292 deletions
diff --git a/include/libbb.h b/include/libbb.h index 80a1c912c..4c9901027 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
| @@ -1321,27 +1321,27 @@ extern const char bb_uuenc_tbl_std[]; | |||
| 1321 | void bb_uuencode(char *store, const void *s, int length, const char *tbl) FAST_FUNC; | 1321 | void bb_uuencode(char *store, const void *s, int length, const char *tbl) FAST_FUNC; |
| 1322 | 1322 | ||
| 1323 | typedef struct sha1_ctx_t { | 1323 | typedef struct sha1_ctx_t { |
| 1324 | uint32_t count[2]; | 1324 | uint64_t total64; |
| 1325 | uint32_t wbuffer[16]; /* NB: always correctly aligned for uint64_t */ | ||
| 1325 | uint32_t hash[5]; | 1326 | uint32_t hash[5]; |
| 1326 | uint32_t wbuf[16]; | ||
| 1327 | } sha1_ctx_t; | 1327 | } sha1_ctx_t; |
| 1328 | void sha1_begin(sha1_ctx_t *ctx) FAST_FUNC; | 1328 | void sha1_begin(sha1_ctx_t *ctx) FAST_FUNC; |
| 1329 | void sha1_hash(const void *data, size_t length, sha1_ctx_t *ctx) FAST_FUNC; | 1329 | void sha1_hash(const void *data, size_t length, sha1_ctx_t *ctx) FAST_FUNC; |
| 1330 | void sha1_end(void *resbuf, sha1_ctx_t *ctx) FAST_FUNC; | 1330 | void sha1_end(void *resbuf, sha1_ctx_t *ctx) FAST_FUNC; |
| 1331 | typedef struct sha256_ctx_t { | 1331 | typedef struct sha256_ctx_t { |
| 1332 | unsigned wbuflen; | ||
| 1332 | uint32_t H[8]; | 1333 | uint32_t H[8]; |
| 1333 | uint32_t total[2]; /* rename to "count"? */ | 1334 | uint64_t total64; |
| 1334 | uint32_t buflen; | 1335 | char wbuffer[64*2]; /* NB: always correctly aligned for uint64_t */ |
| 1335 | char buffer[128]; /* NB: always correctly aligned for uint32_t */ | ||
| 1336 | } sha256_ctx_t; | 1336 | } sha256_ctx_t; |
| 1337 | void sha256_begin(sha256_ctx_t *ctx) FAST_FUNC; | 1337 | void sha256_begin(sha256_ctx_t *ctx) FAST_FUNC; |
| 1338 | void sha256_hash(const void *buffer, size_t len, sha256_ctx_t *ctx) FAST_FUNC; | 1338 | void sha256_hash(const void *buffer, size_t len, sha256_ctx_t *ctx) FAST_FUNC; |
| 1339 | void sha256_end(void *resbuf, sha256_ctx_t *ctx) FAST_FUNC; | 1339 | void sha256_end(void *resbuf, sha256_ctx_t *ctx) FAST_FUNC; |
| 1340 | typedef struct sha512_ctx_t { | 1340 | typedef struct sha512_ctx_t { |
| 1341 | unsigned wbuflen; | ||
| 1341 | uint64_t H[8]; | 1342 | uint64_t H[8]; |
| 1342 | uint64_t total[2]; | 1343 | uint64_t total64[2]; |
| 1343 | uint64_t buflen; | 1344 | char wbuffer[128*2]; /* NB: always correctly aligned for uint64_t */ |
| 1344 | char buffer[256]; /* NB: always correctly aligned for uint64_t */ | ||
| 1345 | } sha512_ctx_t; | 1345 | } sha512_ctx_t; |
| 1346 | void sha512_begin(sha512_ctx_t *ctx) FAST_FUNC; | 1346 | void sha512_begin(sha512_ctx_t *ctx) FAST_FUNC; |
| 1347 | void sha512_hash(const void *buffer, size_t len, sha512_ctx_t *ctx) FAST_FUNC; | 1347 | void sha512_hash(const void *buffer, size_t len, sha512_ctx_t *ctx) FAST_FUNC; |
diff --git a/libbb/sha1.c b/libbb/sha1.c index 76d5c8fbb..5fc312393 100644 --- a/libbb/sha1.c +++ b/libbb/sha1.c | |||
| @@ -52,7 +52,7 @@ static inline uint64_t hton64(uint64_t v) | |||
| 52 | #define SHA1_HASH_SIZE SHA1_DIGEST_SIZE | 52 | #define SHA1_HASH_SIZE SHA1_DIGEST_SIZE |
| 53 | #define SHA1_MASK (SHA1_BLOCK_SIZE - 1) | 53 | #define SHA1_MASK (SHA1_BLOCK_SIZE - 1) |
| 54 | 54 | ||
| 55 | static void sha1_compile(sha1_ctx_t *ctx) | 55 | static void sha1_process_block64(sha1_ctx_t *ctx) |
| 56 | { | 56 | { |
| 57 | uint32_t w[80], i, a, b, c, d, e, t; | 57 | uint32_t w[80], i, a, b, c, d, e, t; |
| 58 | 58 | ||
| @@ -60,7 +60,7 @@ static void sha1_compile(sha1_ctx_t *ctx) | |||
| 60 | /* words in big-endian order so an order reversal is needed */ | 60 | /* words in big-endian order so an order reversal is needed */ |
| 61 | /* here on little endian machines */ | 61 | /* here on little endian machines */ |
| 62 | for (i = 0; i < SHA1_BLOCK_SIZE / 4; ++i) | 62 | for (i = 0; i < SHA1_BLOCK_SIZE / 4; ++i) |
| 63 | w[i] = ntohl(ctx->wbuf[i]); | 63 | w[i] = ntohl(ctx->wbuffer[i]); |
| 64 | 64 | ||
| 65 | for (/*i = SHA1_BLOCK_SIZE / 4*/; i < 80; ++i) { | 65 | for (/*i = SHA1_BLOCK_SIZE / 4*/; i < 80; ++i) { |
| 66 | t = w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]; | 66 | t = w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]; |
| @@ -108,31 +108,98 @@ static void sha1_compile(sha1_ctx_t *ctx) | |||
| 108 | ctx->hash[4] += e; | 108 | ctx->hash[4] += e; |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | /* Constants for SHA256 from FIPS 180-2:4.2.2. */ | ||
| 112 | static const uint32_t K256[80] = { | ||
| 113 | 0x428a2f98, 0x71374491, | ||
| 114 | 0xb5c0fbcf, 0xe9b5dba5, | ||
| 115 | 0x3956c25b, 0x59f111f1, | ||
| 116 | 0x923f82a4, 0xab1c5ed5, | ||
| 117 | 0xd807aa98, 0x12835b01, | ||
| 118 | 0x243185be, 0x550c7dc3, | ||
| 119 | 0x72be5d74, 0x80deb1fe, | ||
| 120 | 0x9bdc06a7, 0xc19bf174, | ||
| 121 | 0xe49b69c1, 0xefbe4786, | ||
| 122 | 0x0fc19dc6, 0x240ca1cc, | ||
| 123 | 0x2de92c6f, 0x4a7484aa, | ||
| 124 | 0x5cb0a9dc, 0x76f988da, | ||
| 125 | 0x983e5152, 0xa831c66d, | ||
| 126 | 0xb00327c8, 0xbf597fc7, | ||
| 127 | 0xc6e00bf3, 0xd5a79147, | ||
| 128 | 0x06ca6351, 0x14292967, | ||
| 129 | 0x27b70a85, 0x2e1b2138, | ||
| 130 | 0x4d2c6dfc, 0x53380d13, | ||
| 131 | 0x650a7354, 0x766a0abb, | ||
| 132 | 0x81c2c92e, 0x92722c85, | ||
| 133 | 0xa2bfe8a1, 0xa81a664b, | ||
| 134 | 0xc24b8b70, 0xc76c51a3, | ||
| 135 | 0xd192e819, 0xd6990624, | ||
| 136 | 0xf40e3585, 0x106aa070, | ||
| 137 | 0x19a4c116, 0x1e376c08, | ||
| 138 | 0x2748774c, 0x34b0bcb5, | ||
| 139 | 0x391c0cb3, 0x4ed8aa4a, | ||
| 140 | 0x5b9cca4f, 0x682e6ff3, | ||
| 141 | 0x748f82ee, 0x78a5636f, | ||
| 142 | 0x84c87814, 0x8cc70208, | ||
| 143 | 0x90befffa, 0xa4506ceb, | ||
| 144 | 0xbef9a3f7, 0xc67178f2, | ||
| 145 | 0xca273ece, 0xd186b8c7, /* [64]+ are used for sha512 only */ | ||
| 146 | 0xeada7dd6, 0xf57d4f7f, | ||
| 147 | 0x06f067aa, 0x0a637dc5, | ||
| 148 | 0x113f9804, 0x1b710b35, | ||
| 149 | 0x28db77f5, 0x32caab7b, | ||
| 150 | 0x3c9ebe0a, 0x431d67c4, | ||
| 151 | 0x4cc5d4be, 0x597f299c, | ||
| 152 | 0x5fcb6fab, 0x6c44198c | ||
| 153 | }; | ||
| 154 | /* Constants for SHA512 from FIPS 180-2:4.2.3. */ | ||
| 155 | static const uint32_t K512_lo[80] = { | ||
| 156 | 0xd728ae22, 0x23ef65cd, | ||
| 157 | 0xec4d3b2f, 0x8189dbbc, | ||
| 158 | 0xf348b538, 0xb605d019, | ||
| 159 | 0xaf194f9b, 0xda6d8118, | ||
| 160 | 0xa3030242, 0x45706fbe, | ||
| 161 | 0x4ee4b28c, 0xd5ffb4e2, | ||
| 162 | 0xf27b896f, 0x3b1696b1, | ||
| 163 | 0x25c71235, 0xcf692694, | ||
| 164 | 0x9ef14ad2, 0x384f25e3, | ||
| 165 | 0x8b8cd5b5, 0x77ac9c65, | ||
| 166 | 0x592b0275, 0x6ea6e483, | ||
| 167 | 0xbd41fbd4, 0x831153b5, | ||
| 168 | 0xee66dfab, 0x2db43210, | ||
| 169 | 0x98fb213f, 0xbeef0ee4, | ||
| 170 | 0x3da88fc2, 0x930aa725, | ||
| 171 | 0xe003826f, 0x0a0e6e70, | ||
| 172 | 0x46d22ffc, 0x5c26c926, | ||
| 173 | 0x5ac42aed, 0x9d95b3df, | ||
| 174 | 0x8baf63de, 0x3c77b2a8, | ||
| 175 | 0x47edaee6, 0x1482353b, | ||
| 176 | 0x4cf10364, 0xbc423001, | ||
| 177 | 0xd0f89791, 0x0654be30, | ||
| 178 | 0xd6ef5218, 0x5565a910, | ||
| 179 | 0x5771202a, 0x32bbd1b8, | ||
| 180 | 0xb8d2d0c8, 0x5141ab53, | ||
| 181 | 0xdf8eeb99, 0xe19b48a8, | ||
| 182 | 0xc5c95a63, 0xe3418acb, | ||
| 183 | 0x7763e373, 0xd6b2b8a3, | ||
| 184 | 0x5defb2fc, 0x43172f60, | ||
| 185 | 0xa1f0ab72, 0x1a6439ec, | ||
| 186 | 0x23631e28, 0xde82bde9, | ||
| 187 | 0xb2c67915, 0xe372532b, | ||
| 188 | 0xea26619c, 0x21c0c207, | ||
| 189 | 0xcde0eb1e, 0xee6ed178, | ||
| 190 | 0x72176fba, 0xa2c898a6, | ||
| 191 | 0xbef90dae, 0x131c471b, | ||
| 192 | 0x23047d84, 0x40c72493, | ||
| 193 | 0x15c9bebc, 0x9c100d4c, | ||
| 194 | 0xcb3e42b6, 0xfc657e2a, | ||
| 195 | 0x3ad6faec, 0x4a475817 | ||
| 196 | }; | ||
| 197 | |||
| 111 | /* Process LEN bytes of BUFFER, accumulating context into CTX. | 198 | /* Process LEN bytes of BUFFER, accumulating context into CTX. |
| 112 | It is assumed that LEN % 64 == 0. */ | 199 | LEN is rounded _down_ to 64. */ |
| 113 | static void sha256_process_block(const void *buffer, size_t len, sha256_ctx_t *ctx) | 200 | static void sha256_process_block64(const void *buffer, size_t len, sha256_ctx_t *ctx) |
| 114 | { | 201 | { |
| 115 | /* Constants for SHA256 from FIPS 180-2:4.2.2. */ | ||
| 116 | static const uint32_t K[64] = { | ||
| 117 | 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, | ||
| 118 | 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, | ||
| 119 | 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, | ||
| 120 | 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, | ||
| 121 | 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, | ||
| 122 | 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, | ||
| 123 | 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, | ||
| 124 | 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, | ||
| 125 | 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, | ||
| 126 | 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, | ||
| 127 | 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, | ||
| 128 | 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, | ||
| 129 | 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, | ||
| 130 | 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, | ||
| 131 | 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, | ||
| 132 | 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 | ||
| 133 | }; | ||
| 134 | const uint32_t *words = buffer; | 202 | const uint32_t *words = buffer; |
| 135 | size_t nwords = len / sizeof(uint32_t); | ||
| 136 | uint32_t a = ctx->H[0]; | 203 | uint32_t a = ctx->H[0]; |
| 137 | uint32_t b = ctx->H[1]; | 204 | uint32_t b = ctx->H[1]; |
| 138 | uint32_t c = ctx->H[2]; | 205 | uint32_t c = ctx->H[2]; |
| @@ -143,24 +210,17 @@ static void sha256_process_block(const void *buffer, size_t len, sha256_ctx_t *c | |||
| 143 | uint32_t h = ctx->H[7]; | 210 | uint32_t h = ctx->H[7]; |
| 144 | 211 | ||
| 145 | /* First increment the byte count. FIPS 180-2 specifies the possible | 212 | /* First increment the byte count. FIPS 180-2 specifies the possible |
| 146 | length of the file up to 2^64 bits. Here we only compute the | 213 | length of the file up to 2^64 _bits_. |
| 147 | number of bytes. Do a double word increment. */ | 214 | We compute the number of _bytes_ and convert to bits later. */ |
| 148 | ctx->total[0] += len; | 215 | len &= ~(size_t)(sizeof(uint32_t) * 16 - 1); |
| 149 | if (ctx->total[0] < len) | 216 | ctx->total64 += len; |
| 150 | ctx->total[1]++; | ||
| 151 | 217 | ||
| 152 | /* Process all bytes in the buffer with 64 bytes in each round of | 218 | /* Process all bytes in the buffer with 64 bytes in each round of |
| 153 | the loop. */ | 219 | the loop. */ |
| 154 | while (nwords > 0) { | 220 | len /= (sizeof(uint32_t) * 16); |
| 221 | while (len) { | ||
| 222 | unsigned t; | ||
| 155 | uint32_t W[64]; | 223 | uint32_t W[64]; |
| 156 | uint32_t a_save = a; | ||
| 157 | uint32_t b_save = b; | ||
| 158 | uint32_t c_save = c; | ||
| 159 | uint32_t d_save = d; | ||
| 160 | uint32_t e_save = e; | ||
| 161 | uint32_t f_save = f; | ||
| 162 | uint32_t g_save = g; | ||
| 163 | uint32_t h_save = h; | ||
| 164 | 224 | ||
| 165 | /* Operators defined in FIPS 180-2:4.1.2. */ | 225 | /* Operators defined in FIPS 180-2:4.1.2. */ |
| 166 | #define Ch(x, y, z) ((x & y) ^ (~x & z)) | 226 | #define Ch(x, y, z) ((x & y) ^ (~x & z)) |
| @@ -171,16 +231,17 @@ static void sha256_process_block(const void *buffer, size_t len, sha256_ctx_t *c | |||
| 171 | #define R1(x) (rotr32(x, 17) ^ rotr32(x, 19) ^ (x >> 10)) | 231 | #define R1(x) (rotr32(x, 17) ^ rotr32(x, 19) ^ (x >> 10)) |
| 172 | 232 | ||
| 173 | /* Compute the message schedule according to FIPS 180-2:6.2.2 step 2. */ | 233 | /* Compute the message schedule according to FIPS 180-2:6.2.2 step 2. */ |
| 174 | for (unsigned t = 0; t < 16; ++t) { | 234 | for (t = 0; t < 16; ++t) { |
| 175 | W[t] = ntohl(*words); | 235 | W[t] = ntohl(*words); |
| 176 | ++words; | 236 | ++words; |
| 177 | } | 237 | } |
| 178 | for (unsigned t = 16; t < 64; ++t) | 238 | |
| 239 | for (/*t = 16*/; t < 64; ++t) | ||
| 179 | W[t] = R1(W[t - 2]) + W[t - 7] + R0(W[t - 15]) + W[t - 16]; | 240 | W[t] = R1(W[t - 2]) + W[t - 7] + R0(W[t - 15]) + W[t - 16]; |
| 180 | 241 | ||
| 181 | /* The actual computation according to FIPS 180-2:6.2.2 step 3. */ | 242 | /* The actual computation according to FIPS 180-2:6.2.2 step 3. */ |
| 182 | for (unsigned t = 0; t < 64; ++t) { | 243 | for (t = 0; t < 64; ++t) { |
| 183 | uint32_t T1 = h + S1(e) + Ch(e, f, g) + K[t] + W[t]; | 244 | uint32_t T1 = h + S1(e) + Ch(e, f, g) + K256[t] + W[t]; |
| 184 | uint32_t T2 = S0(a) + Maj(a, b, c); | 245 | uint32_t T2 = S0(a) + Maj(a, b, c); |
| 185 | h = g; | 246 | h = g; |
| 186 | g = f; | 247 | g = f; |
| @@ -199,79 +260,24 @@ static void sha256_process_block(const void *buffer, size_t len, sha256_ctx_t *c | |||
| 199 | #undef R1 | 260 | #undef R1 |
| 200 | /* Add the starting values of the context according to FIPS 180-2:6.2.2 | 261 | /* Add the starting values of the context according to FIPS 180-2:6.2.2 |
| 201 | step 4. */ | 262 | step 4. */ |
| 202 | a += a_save; | 263 | ctx->H[0] = a += ctx->H[0]; |
| 203 | b += b_save; | 264 | ctx->H[1] = b += ctx->H[1]; |
| 204 | c += c_save; | 265 | ctx->H[2] = c += ctx->H[2]; |
| 205 | d += d_save; | 266 | ctx->H[3] = d += ctx->H[3]; |
| 206 | e += e_save; | 267 | ctx->H[4] = e += ctx->H[4]; |
| 207 | f += f_save; | 268 | ctx->H[5] = f += ctx->H[5]; |
| 208 | g += g_save; | 269 | ctx->H[6] = g += ctx->H[6]; |
| 209 | h += h_save; | 270 | ctx->H[7] = h += ctx->H[7]; |
| 210 | 271 | ||
| 211 | /* Prepare for the next round. */ | 272 | /* Prepare for the next round. */ |
| 212 | nwords -= 16; | 273 | len--; |
| 213 | } | 274 | } |
| 214 | |||
| 215 | /* Put checksum in context given as argument. */ | ||
| 216 | ctx->H[0] = a; | ||
| 217 | ctx->H[1] = b; | ||
| 218 | ctx->H[2] = c; | ||
| 219 | ctx->H[3] = d; | ||
| 220 | ctx->H[4] = e; | ||
| 221 | ctx->H[5] = f; | ||
| 222 | ctx->H[6] = g; | ||
| 223 | ctx->H[7] = h; | ||
| 224 | } | 275 | } |
| 225 | |||
| 226 | /* Process LEN bytes of BUFFER, accumulating context into CTX. | 276 | /* Process LEN bytes of BUFFER, accumulating context into CTX. |
| 227 | It is assumed that LEN % 128 == 0. */ | 277 | LEN is rounded _down_ to 128. */ |
| 228 | static void sha512_process_block(const void *buffer, size_t len, sha512_ctx_t *ctx) | 278 | static void sha512_process_block128(const void *buffer, size_t len, sha512_ctx_t *ctx) |
| 229 | { | 279 | { |
| 230 | /* Constants for SHA512 from FIPS 180-2:4.2.3. */ | ||
| 231 | static const uint64_t K[80] = { | ||
| 232 | 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, | ||
| 233 | 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, | ||
| 234 | 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, | ||
| 235 | 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, | ||
| 236 | 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, | ||
| 237 | 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, | ||
| 238 | 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, | ||
| 239 | 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, | ||
| 240 | 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, | ||
| 241 | 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, | ||
| 242 | 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, | ||
| 243 | 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, | ||
| 244 | 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, | ||
| 245 | 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, | ||
| 246 | 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, | ||
| 247 | 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, | ||
| 248 | 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, | ||
| 249 | 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, | ||
| 250 | 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, | ||
| 251 | 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, | ||
| 252 | 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, | ||
| 253 | 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, | ||
| 254 | 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, | ||
| 255 | 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, | ||
| 256 | 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, | ||
| 257 | 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, | ||
| 258 | 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, | ||
| 259 | 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, | ||
| 260 | 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, | ||
| 261 | 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, | ||
| 262 | 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, | ||
| 263 | 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, | ||
| 264 | 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, | ||
| 265 | 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, | ||
| 266 | 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, | ||
| 267 | 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, | ||
| 268 | 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, | ||
| 269 | 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, | ||
| 270 | 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, | ||
| 271 | 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL, | ||
| 272 | }; | ||
| 273 | const uint64_t *words = buffer; | 280 | const uint64_t *words = buffer; |
| 274 | size_t nwords = len / sizeof(uint64_t); | ||
| 275 | uint64_t a = ctx->H[0]; | 281 | uint64_t a = ctx->H[0]; |
| 276 | uint64_t b = ctx->H[1]; | 282 | uint64_t b = ctx->H[1]; |
| 277 | uint64_t c = ctx->H[2]; | 283 | uint64_t c = ctx->H[2]; |
| @@ -282,24 +288,17 @@ static void sha512_process_block(const void *buffer, size_t len, sha512_ctx_t *c | |||
| 282 | uint64_t h = ctx->H[7]; | 288 | uint64_t h = ctx->H[7]; |
| 283 | 289 | ||
| 284 | /* First increment the byte count. FIPS 180-2 specifies the possible | 290 | /* First increment the byte count. FIPS 180-2 specifies the possible |
| 285 | length of the file up to 2^128 bits. Here we only compute the | 291 | length of the file up to 2^128 _bits_. |
| 286 | number of bytes. Do a double word increment. */ | 292 | We compute the number of _bytes_ and convert to bits later. */ |
| 287 | ctx->total[0] += len; | 293 | len &= ~(size_t)(sizeof(uint64_t) * 16 - 1); |
| 288 | if (ctx->total[0] < len) | 294 | ctx->total64[0] += len; |
| 289 | ctx->total[1]++; | 295 | if (ctx->total64[0] < len) |
| 290 | 296 | ctx->total64[1]++; | |
| 291 | /* Process all bytes in the buffer with 128 bytes in each round of | 297 | |
| 292 | the loop. */ | 298 | len /= (sizeof(uint64_t) * 16); |
| 293 | while (nwords > 0) { | 299 | while (len) { |
| 300 | unsigned t; | ||
| 294 | uint64_t W[80]; | 301 | uint64_t W[80]; |
| 295 | uint64_t a_save = a; | ||
| 296 | uint64_t b_save = b; | ||
| 297 | uint64_t c_save = c; | ||
| 298 | uint64_t d_save = d; | ||
| 299 | uint64_t e_save = e; | ||
| 300 | uint64_t f_save = f; | ||
| 301 | uint64_t g_save = g; | ||
| 302 | uint64_t h_save = h; | ||
| 303 | 302 | ||
| 304 | /* Operators defined in FIPS 180-2:4.1.2. */ | 303 | /* Operators defined in FIPS 180-2:4.1.2. */ |
| 305 | #define Ch(x, y, z) ((x & y) ^ (~x & z)) | 304 | #define Ch(x, y, z) ((x & y) ^ (~x & z)) |
| @@ -310,16 +309,17 @@ static void sha512_process_block(const void *buffer, size_t len, sha512_ctx_t *c | |||
| 310 | #define R1(x) (rotr64(x, 19) ^ rotr64(x, 61) ^ (x >> 6)) | 309 | #define R1(x) (rotr64(x, 19) ^ rotr64(x, 61) ^ (x >> 6)) |
| 311 | 310 | ||
| 312 | /* Compute the message schedule according to FIPS 180-2:6.3.2 step 2. */ | 311 | /* Compute the message schedule according to FIPS 180-2:6.3.2 step 2. */ |
| 313 | for (unsigned t = 0; t < 16; ++t) { | 312 | for (t = 0; t < 16; ++t) { |
| 314 | W[t] = ntoh64(*words); | 313 | W[t] = ntoh64(*words); |
| 315 | ++words; | 314 | ++words; |
| 316 | } | 315 | } |
| 317 | for (unsigned t = 16; t < 80; ++t) | 316 | for (/*t = 16*/; t < 80; ++t) |
| 318 | W[t] = R1(W[t - 2]) + W[t - 7] + R0(W[t - 15]) + W[t - 16]; | 317 | W[t] = R1(W[t - 2]) + W[t - 7] + R0(W[t - 15]) + W[t - 16]; |
| 319 | 318 | ||
| 320 | /* The actual computation according to FIPS 180-2:6.3.2 step 3. */ | 319 | /* The actual computation according to FIPS 180-2:6.3.2 step 3. */ |
| 321 | for (unsigned t = 0; t < 80; ++t) { | 320 | for (t = 0; t < 80; ++t) { |
| 322 | uint64_t T1 = h + S1(e) + Ch(e, f, g) + K[t] + W[t]; | 321 | uint64_t K512_t = ((uint64_t)(K256[t]) << 32) + K512_lo[t]; |
| 322 | uint64_t T1 = h + S1(e) + Ch(e, f, g) + K512_t + W[t]; | ||
| 323 | uint64_t T2 = S0(a) + Maj(a, b, c); | 323 | uint64_t T2 = S0(a) + Maj(a, b, c); |
| 324 | h = g; | 324 | h = g; |
| 325 | g = f; | 325 | g = f; |
| @@ -338,34 +338,23 @@ static void sha512_process_block(const void *buffer, size_t len, sha512_ctx_t *c | |||
| 338 | #undef R1 | 338 | #undef R1 |
| 339 | /* Add the starting values of the context according to FIPS 180-2:6.3.2 | 339 | /* Add the starting values of the context according to FIPS 180-2:6.3.2 |
| 340 | step 4. */ | 340 | step 4. */ |
| 341 | a += a_save; | 341 | ctx->H[0] = a += ctx->H[0]; |
| 342 | b += b_save; | 342 | ctx->H[1] = b += ctx->H[1]; |
| 343 | c += c_save; | 343 | ctx->H[2] = c += ctx->H[2]; |
| 344 | d += d_save; | 344 | ctx->H[3] = d += ctx->H[3]; |
| 345 | e += e_save; | 345 | ctx->H[4] = e += ctx->H[4]; |
| 346 | f += f_save; | 346 | ctx->H[5] = f += ctx->H[5]; |
| 347 | g += g_save; | 347 | ctx->H[6] = g += ctx->H[6]; |
| 348 | h += h_save; | 348 | ctx->H[7] = h += ctx->H[7]; |
| 349 | 349 | ||
| 350 | /* Prepare for the next round. */ | 350 | len--; |
| 351 | nwords -= 16; | ||
| 352 | } | 351 | } |
| 353 | |||
| 354 | /* Put checksum in context given as argument. */ | ||
| 355 | ctx->H[0] = a; | ||
| 356 | ctx->H[1] = b; | ||
| 357 | ctx->H[2] = c; | ||
| 358 | ctx->H[3] = d; | ||
| 359 | ctx->H[4] = e; | ||
| 360 | ctx->H[5] = f; | ||
| 361 | ctx->H[6] = g; | ||
| 362 | ctx->H[7] = h; | ||
| 363 | } | 352 | } |
| 364 | 353 | ||
| 365 | 354 | ||
| 366 | void FAST_FUNC sha1_begin(sha1_ctx_t *ctx) | 355 | void FAST_FUNC sha1_begin(sha1_ctx_t *ctx) |
| 367 | { | 356 | { |
| 368 | ctx->count[0] = ctx->count[1] = 0; | 357 | ctx->total64 = 0; |
| 369 | ctx->hash[0] = 0x67452301; | 358 | ctx->hash[0] = 0x67452301; |
| 370 | ctx->hash[1] = 0xefcdab89; | 359 | ctx->hash[1] = 0xefcdab89; |
| 371 | ctx->hash[2] = 0x98badcfe; | 360 | ctx->hash[2] = 0x98badcfe; |
| @@ -373,84 +362,92 @@ void FAST_FUNC sha1_begin(sha1_ctx_t *ctx) | |||
| 373 | ctx->hash[4] = 0xc3d2e1f0; | 362 | ctx->hash[4] = 0xc3d2e1f0; |
| 374 | } | 363 | } |
| 375 | 364 | ||
| 365 | static const uint32_t init256[] = { | ||
| 366 | 0x6a09e667, | ||
| 367 | 0xbb67ae85, | ||
| 368 | 0x3c6ef372, | ||
| 369 | 0xa54ff53a, | ||
| 370 | 0x510e527f, | ||
| 371 | 0x9b05688c, | ||
| 372 | 0x1f83d9ab, | ||
| 373 | 0x5be0cd19 | ||
| 374 | }; | ||
| 375 | static const uint32_t init512_lo[] = { | ||
| 376 | 0xf3bcc908, | ||
| 377 | 0x84caa73b, | ||
| 378 | 0xfe94f82b, | ||
| 379 | 0x5f1d36f1, | ||
| 380 | 0xade682d1, | ||
| 381 | 0x2b3e6c1f, | ||
| 382 | 0xfb41bd6b, | ||
| 383 | 0x137e2179 | ||
| 384 | }; | ||
| 376 | /* Initialize structure containing state of computation. | 385 | /* Initialize structure containing state of computation. |
| 377 | (FIPS 180-2:5.3.2) */ | 386 | (FIPS 180-2:5.3.2) */ |
| 378 | void FAST_FUNC sha256_begin(sha256_ctx_t *ctx) | 387 | void FAST_FUNC sha256_begin(sha256_ctx_t *ctx) |
| 379 | { | 388 | { |
| 380 | ctx->H[0] = 0x6a09e667; | 389 | memcpy(ctx->H, init256, sizeof(init256)); |
| 381 | ctx->H[1] = 0xbb67ae85; | 390 | ctx->total64 = 0; |
| 382 | ctx->H[2] = 0x3c6ef372; | 391 | ctx->wbuflen = 0; |
| 383 | ctx->H[3] = 0xa54ff53a; | ||
| 384 | ctx->H[4] = 0x510e527f; | ||
| 385 | ctx->H[5] = 0x9b05688c; | ||
| 386 | ctx->H[6] = 0x1f83d9ab; | ||
| 387 | ctx->H[7] = 0x5be0cd19; | ||
| 388 | ctx->total[0] = ctx->total[1] = 0; | ||
| 389 | ctx->buflen = 0; | ||
| 390 | } | 392 | } |
| 391 | |||
| 392 | /* Initialize structure containing state of computation. | 393 | /* Initialize structure containing state of computation. |
| 393 | (FIPS 180-2:5.3.3) */ | 394 | (FIPS 180-2:5.3.3) */ |
| 394 | void FAST_FUNC sha512_begin(sha512_ctx_t *ctx) | 395 | void FAST_FUNC sha512_begin(sha512_ctx_t *ctx) |
| 395 | { | 396 | { |
| 396 | ctx->H[0] = 0x6a09e667f3bcc908ULL; | 397 | int i; |
| 397 | ctx->H[1] = 0xbb67ae8584caa73bULL; | 398 | for (i = 0; i < 8; i++) |
| 398 | ctx->H[2] = 0x3c6ef372fe94f82bULL; | 399 | ctx->H[i] = ((uint64_t)(init256[i]) << 32) + init512_lo[i]; |
| 399 | ctx->H[3] = 0xa54ff53a5f1d36f1ULL; | 400 | ctx->total64[0] = ctx->total64[1] = 0; |
| 400 | ctx->H[4] = 0x510e527fade682d1ULL; | 401 | ctx->wbuflen = 0; |
| 401 | ctx->H[5] = 0x9b05688c2b3e6c1fULL; | ||
| 402 | ctx->H[6] = 0x1f83d9abfb41bd6bULL; | ||
| 403 | ctx->H[7] = 0x5be0cd19137e2179ULL; | ||
| 404 | ctx->total[0] = ctx->total[1] = 0; | ||
| 405 | ctx->buflen = 0; | ||
| 406 | } | 402 | } |
| 407 | 403 | ||
| 408 | 404 | ||
| 409 | /* SHA1 hash data in an array of bytes into hash buffer and call the */ | 405 | /* SHA1 hash data in an array of bytes into hash buffer and call the */ |
| 410 | /* hash_compile function as required. */ | 406 | /* hash_compile function as required. */ |
| 411 | void FAST_FUNC sha1_hash(const void *data, size_t length, sha1_ctx_t *ctx) | 407 | void FAST_FUNC sha1_hash(const void *buffer, size_t len, sha1_ctx_t *ctx) |
| 412 | { | 408 | { |
| 413 | uint32_t pos = (uint32_t) (ctx->count[0] & SHA1_MASK); | 409 | uint32_t pos = (uint32_t) (ctx->total64 & SHA1_MASK); |
| 414 | uint32_t freeb = SHA1_BLOCK_SIZE - pos; | 410 | uint32_t freeb = SHA1_BLOCK_SIZE - pos; |
| 415 | const unsigned char *sp = data; | 411 | const unsigned char *sp = buffer; |
| 416 | 412 | ||
| 417 | ctx->count[0] += length; | 413 | ctx->total64 += len; |
| 418 | if (ctx->count[0] < length) | ||
| 419 | ctx->count[1]++; | ||
| 420 | 414 | ||
| 421 | while (length >= freeb) { /* transfer whole blocks while possible */ | 415 | while (len >= freeb) { /* transfer whole blocks while possible */ |
| 422 | memcpy(((unsigned char *) ctx->wbuf) + pos, sp, freeb); | 416 | memcpy(((unsigned char *) ctx->wbuffer) + pos, sp, freeb); |
| 423 | sp += freeb; | 417 | sp += freeb; |
| 424 | length -= freeb; | 418 | len -= freeb; |
| 425 | freeb = SHA1_BLOCK_SIZE; | 419 | freeb = SHA1_BLOCK_SIZE; |
| 426 | pos = 0; | 420 | pos = 0; |
| 427 | sha1_compile(ctx); | 421 | sha1_process_block64(ctx); |
| 428 | } | 422 | } |
| 429 | 423 | ||
| 430 | memcpy(((unsigned char *) ctx->wbuf) + pos, sp, length); | 424 | memcpy(((unsigned char *) ctx->wbuffer) + pos, sp, len); |
| 431 | } | 425 | } |
| 432 | 426 | ||
| 433 | void FAST_FUNC sha256_hash(const void *buffer, size_t len, sha256_ctx_t *ctx) | 427 | void FAST_FUNC sha256_hash(const void *buffer, size_t len, sha256_ctx_t *ctx) |
| 434 | { | 428 | { |
| 435 | /* When we already have some bits in our internal buffer concatenate | 429 | /* When we already have some bits in our internal buffer concatenate |
| 436 | both inputs first. */ | 430 | both inputs first. */ |
| 437 | if (ctx->buflen != 0) { | 431 | if (ctx->wbuflen != 0) { |
| 438 | size_t left_over = ctx->buflen; | 432 | unsigned add; |
| 439 | size_t add = 128 - left_over > len ? len : 128 - left_over; | 433 | |
| 440 | 434 | /* NB: 1/2 of wbuffer is used only in sha256_end | |
| 441 | memcpy(&ctx->buffer[left_over], buffer, add); | 435 | * when length field is added and hashed. |
| 442 | ctx->buflen += add; | 436 | * With buffer twice as small, it may happen that |
| 443 | 437 | * we have it almost full and can't add length field. */ | |
| 444 | if (ctx->buflen > 64) { | 438 | |
| 445 | sha256_process_block(ctx->buffer, ctx->buflen & ~63, ctx); | 439 | add = sizeof(ctx->wbuffer)/2 - ctx->wbuflen; |
| 446 | 440 | if (add > len) | |
| 447 | ctx->buflen &= 63; | 441 | add = len; |
| 448 | /* The regions in the following copy operation cannot overlap. */ | 442 | memcpy(&ctx->wbuffer[ctx->wbuflen], buffer, add); |
| 449 | memcpy(ctx->buffer, | 443 | ctx->wbuflen += add; |
| 450 | &ctx->buffer[(left_over + add) & ~63], | 444 | |
| 451 | ctx->buflen); | 445 | /* If we still didn't collect full wbuffer, bail out */ |
| 452 | } | 446 | if (ctx->wbuflen < sizeof(ctx->wbuffer)/2) |
| 453 | 447 | return; | |
| 448 | |||
| 449 | sha256_process_block64(ctx->wbuffer, 64, ctx); | ||
| 450 | ctx->wbuflen = 0; | ||
| 454 | buffer = (const char *)buffer + add; | 451 | buffer = (const char *)buffer + add; |
| 455 | len -= add; | 452 | len -= add; |
| 456 | } | 453 | } |
| @@ -459,13 +456,12 @@ void FAST_FUNC sha256_hash(const void *buffer, size_t len, sha256_ctx_t *ctx) | |||
| 459 | if (len >= 64) { | 456 | if (len >= 64) { |
| 460 | if (UNALIGNED_P(buffer, uint32_t)) { | 457 | if (UNALIGNED_P(buffer, uint32_t)) { |
| 461 | while (len > 64) { | 458 | while (len > 64) { |
| 462 | sha256_process_block(memcpy(ctx->buffer, buffer, 64), | 459 | sha256_process_block64(memcpy(ctx->wbuffer, buffer, 64), 64, ctx); |
| 463 | 64, ctx); | ||
| 464 | buffer = (const char *)buffer + 64; | 460 | buffer = (const char *)buffer + 64; |
| 465 | len -= 64; | 461 | len -= 64; |
| 466 | } | 462 | } |
| 467 | } else { | 463 | } else { |
| 468 | sha256_process_block(buffer, len & ~63, ctx); | 464 | sha256_process_block64(buffer, len /*& ~63*/, ctx); |
| 469 | buffer = (const char *)buffer + (len & ~63); | 465 | buffer = (const char *)buffer + (len & ~63); |
| 470 | len &= 63; | 466 | len &= 63; |
| 471 | } | 467 | } |
| @@ -473,75 +469,48 @@ void FAST_FUNC sha256_hash(const void *buffer, size_t len, sha256_ctx_t *ctx) | |||
| 473 | 469 | ||
| 474 | /* Move remaining bytes into internal buffer. */ | 470 | /* Move remaining bytes into internal buffer. */ |
| 475 | if (len > 0) { | 471 | if (len > 0) { |
| 476 | size_t left_over = ctx->buflen; | 472 | memcpy(ctx->wbuffer, buffer, len); |
| 477 | 473 | ctx->wbuflen = len; | |
| 478 | memcpy(&ctx->buffer[left_over], buffer, len); | ||
| 479 | left_over += len; | ||
| 480 | if (left_over >= 64) { | ||
| 481 | sha256_process_block(ctx->buffer, 64, ctx); | ||
| 482 | left_over -= 64; | ||
| 483 | memcpy(ctx->buffer, &ctx->buffer[64], left_over); | ||
| 484 | } | ||
| 485 | ctx->buflen = left_over; | ||
| 486 | } | 474 | } |
| 487 | } | 475 | } |
| 488 | 476 | ||
| 489 | void FAST_FUNC sha512_hash(const void *buffer, size_t len, sha512_ctx_t *ctx) | 477 | void FAST_FUNC sha512_hash(const void *buffer, size_t len, sha512_ctx_t *ctx) |
| 490 | { | 478 | { |
| 491 | /* When we already have some bits in our internal buffer concatenate | 479 | if (ctx->wbuflen != 0) { |
| 492 | both inputs first. */ | 480 | unsigned add; |
| 493 | if (ctx->buflen != 0) { | ||
| 494 | size_t left_over = ctx->buflen; | ||
| 495 | size_t add = 256 - left_over > len ? len : 256 - left_over; | ||
| 496 | 481 | ||
| 497 | memcpy(&ctx->buffer[left_over], buffer, add); | 482 | add = sizeof(ctx->wbuffer)/2 - ctx->wbuflen; |
| 498 | ctx->buflen += add; | 483 | if (add > len) |
| 484 | add = len; | ||
| 485 | memcpy(&ctx->wbuffer[ctx->wbuflen], buffer, add); | ||
| 486 | ctx->wbuflen += add; | ||
| 499 | 487 | ||
| 500 | if (ctx->buflen > 128) { | 488 | if (ctx->wbuflen < sizeof(ctx->wbuffer)/2) |
| 501 | sha512_process_block(ctx->buffer, ctx->buflen & ~127, ctx); | 489 | return; |
| 502 | |||
| 503 | ctx->buflen &= 127; | ||
| 504 | /* The regions in the following copy operation cannot overlap. */ | ||
| 505 | memcpy(ctx->buffer, | ||
| 506 | &ctx->buffer[(left_over + add) & ~127], | ||
| 507 | ctx->buflen); | ||
| 508 | } | ||
| 509 | 490 | ||
| 491 | sha512_process_block128(ctx->wbuffer, 128, ctx); | ||
| 492 | ctx->wbuflen = 0; | ||
| 510 | buffer = (const char *)buffer + add; | 493 | buffer = (const char *)buffer + add; |
| 511 | len -= add; | 494 | len -= add; |
| 512 | } | 495 | } |
| 513 | 496 | ||
| 514 | /* Process available complete blocks. */ | ||
| 515 | if (len >= 128) { | 497 | if (len >= 128) { |
| 516 | // #if BB_ARCH_REQUIRES_ALIGNMENT | ||
| 517 | if (UNALIGNED_P(buffer, uint64_t)) { | 498 | if (UNALIGNED_P(buffer, uint64_t)) { |
| 518 | while (len > 128) { | 499 | while (len > 128) { |
| 519 | sha512_process_block(memcpy(ctx->buffer, buffer, 128), | 500 | sha512_process_block128(memcpy(ctx->wbuffer, buffer, 128), 128, ctx); |
| 520 | 128, ctx); | ||
| 521 | buffer = (const char *)buffer + 128; | 501 | buffer = (const char *)buffer + 128; |
| 522 | len -= 128; | 502 | len -= 128; |
| 523 | } | 503 | } |
| 524 | } else | 504 | } else { |
| 525 | // #endif | 505 | sha512_process_block128(buffer, len /*& ~127*/, ctx); |
| 526 | { | ||
| 527 | sha512_process_block(buffer, len & ~127, ctx); | ||
| 528 | buffer = (const char *)buffer + (len & ~127); | 506 | buffer = (const char *)buffer + (len & ~127); |
| 529 | len &= 127; | 507 | len &= 127; |
| 530 | } | 508 | } |
| 531 | } | 509 | } |
| 532 | 510 | ||
| 533 | /* Move remaining bytes into internal buffer. */ | ||
| 534 | if (len > 0) { | 511 | if (len > 0) { |
| 535 | size_t left_over = ctx->buflen; | 512 | memcpy(ctx->wbuffer, buffer, len); |
| 536 | 513 | ctx->wbuflen = len; | |
| 537 | memcpy(&ctx->buffer[left_over], buffer, len); | ||
| 538 | left_over += len; | ||
| 539 | if (left_over >= 128) { | ||
| 540 | sha512_process_block(ctx->buffer, 128, ctx); | ||
| 541 | left_over -= 128; | ||
| 542 | memcpy(ctx->buffer, &ctx->buffer[128], left_over); | ||
| 543 | } | ||
| 544 | ctx->buflen = left_over; | ||
| 545 | } | 514 | } |
| 546 | } | 515 | } |
| 547 | 516 | ||
| @@ -558,36 +527,40 @@ void FAST_FUNC sha1_end(void *resbuf, sha1_ctx_t *ctx) | |||
| 558 | #endif | 527 | #endif |
| 559 | 528 | ||
| 560 | uint8_t *hval = resbuf; | 529 | uint8_t *hval = resbuf; |
| 561 | uint32_t i, cnt = (uint32_t) (ctx->count[0] & SHA1_MASK); | 530 | uint32_t i, cnt = (uint32_t) (ctx->total64 & SHA1_MASK); |
| 562 | 531 | ||
| 563 | /* mask out the rest of any partial 32-bit word and then set */ | 532 | /* mask out the rest of any partial 32-bit word and then set */ |
| 564 | /* the next byte to 0x80. On big-endian machines any bytes in */ | 533 | /* the next byte to 0x80. On big-endian machines any bytes in */ |
| 565 | /* the buffer will be at the top end of 32 bit words, on little */ | 534 | /* the buffer will be at the top end of 32 bit words, on little */ |
| 566 | /* endian machines they will be at the bottom. Hence the AND */ | 535 | /* endian machines they will be at the bottom. Hence the AND */ |
| 567 | /* and OR masks above are reversed for little endian systems */ | 536 | /* and OR masks above are reversed for little endian systems */ |
| 568 | ctx->wbuf[cnt >> 2] = | 537 | ctx->wbuffer[cnt >> 2] = |
| 569 | (ctx->wbuf[cnt >> 2] & mask[cnt & 3]) | bits[cnt & 3]; | 538 | (ctx->wbuffer[cnt >> 2] & mask[cnt & 3]) | bits[cnt & 3]; |
| 570 | 539 | ||
| 571 | /* we need 9 or more empty positions, one for the padding byte */ | 540 | /* we need 9 or more empty positions, one for the padding byte */ |
| 572 | /* (above) and eight for the length count. If there is not */ | 541 | /* (above) and eight for the length count. If there is not */ |
| 573 | /* enough space pad and empty the buffer */ | 542 | /* enough space pad and empty the buffer */ |
| 574 | if (cnt > SHA1_BLOCK_SIZE - 9) { | 543 | if (cnt > SHA1_BLOCK_SIZE - 9) { |
| 575 | if (cnt < 60) | 544 | if (cnt < 60) |
| 576 | ctx->wbuf[15] = 0; | 545 | ctx->wbuffer[15] = 0; |
| 577 | sha1_compile(ctx); | 546 | sha1_process_block64(ctx); |
| 578 | cnt = 0; | 547 | cnt = 0; |
| 579 | } else /* compute a word index for the empty buffer positions */ | 548 | } else /* compute a word index for the empty buffer positions */ |
| 580 | cnt = (cnt >> 2) + 1; | 549 | cnt = (cnt >> 2) + 1; |
| 581 | 550 | ||
| 582 | while (cnt < 14) /* and zero pad all but last two positions */ | 551 | while (cnt < 14) /* and zero pad all but last two positions */ |
| 583 | ctx->wbuf[cnt++] = 0; | 552 | ctx->wbuffer[cnt++] = 0; |
| 584 | 553 | ||
| 585 | /* assemble the eight byte counter in the buffer in big-endian */ | 554 | /* assemble the 64-bit counter of bits in the buffer in BE */ |
| 586 | /* format */ | 555 | /* format */ |
| 587 | ctx->wbuf[14] = htonl((ctx->count[1] << 3) | (ctx->count[0] >> 29)); | 556 | { |
| 588 | ctx->wbuf[15] = htonl(ctx->count[0] << 3); | 557 | uint64_t t = ctx->total64 << 3; |
| 558 | t = hton64(t); | ||
| 559 | /* wbuffer is suitably aligned for this */ | ||
| 560 | *(uint64_t *) &ctx->wbuffer[14] = t; | ||
| 561 | } | ||
| 589 | 562 | ||
| 590 | sha1_compile(ctx); | 563 | sha1_process_block64(ctx); |
| 591 | 564 | ||
| 592 | /* extract the hash value as bytes in case the hash buffer is */ | 565 | /* extract the hash value as bytes in case the hash buffer is */ |
| 593 | /* misaligned for 32-bit words */ | 566 | /* misaligned for 32-bit words */ |
| @@ -604,28 +577,29 @@ void FAST_FUNC sha1_end(void *resbuf, sha1_ctx_t *ctx) | |||
| 604 | void FAST_FUNC sha256_end(void *resbuf, sha256_ctx_t *ctx) | 577 | void FAST_FUNC sha256_end(void *resbuf, sha256_ctx_t *ctx) |
| 605 | { | 578 | { |
| 606 | /* Take yet unprocessed bytes into account. */ | 579 | /* Take yet unprocessed bytes into account. */ |
| 607 | uint32_t bytes = ctx->buflen; | 580 | unsigned bytes = ctx->wbuflen; |
| 608 | size_t pad; | 581 | unsigned pad; |
| 609 | 582 | ||
| 610 | /* Now count remaining bytes. */ | 583 | /* Now count remaining bytes. */ |
| 611 | ctx->total[0] += bytes; | 584 | ctx->total64 += bytes; |
| 612 | if (ctx->total[0] < bytes) | ||
| 613 | ctx->total[1]++; | ||
| 614 | 585 | ||
| 615 | /* Pad the buffer to the next 64-byte boundary with 0x80,0,0,0... | 586 | /* Pad the buffer to the next 64-byte boundary with 0x80,0,0,0... |
| 616 | (FIPS 180-2:5.1.1) */ | 587 | (FIPS 180-2:5.1.1) */ |
| 617 | pad = (bytes >= 56 ? 64 + 56 - bytes : 56 - bytes); | 588 | pad = (bytes >= 56 ? 64 + 56 - bytes : 56 - bytes); |
| 618 | memset(&ctx->buffer[bytes], 0, pad); | 589 | memset(&ctx->wbuffer[bytes], 0, pad); |
| 619 | ctx->buffer[bytes] = 0x80; | 590 | ctx->wbuffer[bytes] = 0x80; |
| 620 | 591 | ||
| 621 | /* Put the 64-bit file length in *bits* at the end of the buffer. */ | 592 | /* Put the 64-bit file length in *bits* at the end of the buffer. */ |
| 622 | *(uint32_t *) &ctx->buffer[bytes + pad + 4] = ntohl(ctx->total[0] << 3); | 593 | { |
| 623 | *(uint32_t *) &ctx->buffer[bytes + pad] = ntohl((ctx->total[1] << 3) | (ctx->total[0] >> 29)); | 594 | uint64_t t = ctx->total64 << 3; |
| 595 | t = hton64(t); | ||
| 596 | /* wbuffer is suitably aligned for this */ | ||
| 597 | *(uint64_t *) &ctx->wbuffer[bytes + pad] = t; | ||
| 598 | } | ||
| 624 | 599 | ||
| 625 | /* Process last bytes. */ | 600 | /* Process last bytes. */ |
| 626 | sha256_process_block(ctx->buffer, bytes + pad + 8, ctx); | 601 | sha256_process_block64(ctx->wbuffer, bytes + pad + 8, ctx); |
| 627 | 602 | ||
| 628 | /* Put result from CTX in first 32 bytes following RESBUF. */ | ||
| 629 | for (unsigned i = 0; i < 8; ++i) | 603 | for (unsigned i = 0; i < 8; ++i) |
| 630 | ((uint32_t *) resbuf)[i] = ntohl(ctx->H[i]); | 604 | ((uint32_t *) resbuf)[i] = ntohl(ctx->H[i]); |
| 631 | } | 605 | } |
| @@ -637,29 +611,24 @@ void FAST_FUNC sha256_end(void *resbuf, sha256_ctx_t *ctx) | |||
| 637 | aligned for a 64 bits value. */ | 611 | aligned for a 64 bits value. */ |
| 638 | void FAST_FUNC sha512_end(void *resbuf, sha512_ctx_t *ctx) | 612 | void FAST_FUNC sha512_end(void *resbuf, sha512_ctx_t *ctx) |
| 639 | { | 613 | { |
| 640 | /* Take yet unprocessed bytes into account. */ | 614 | unsigned bytes = ctx->wbuflen; |
| 641 | uint64_t bytes = ctx->buflen; | 615 | unsigned pad; |
| 642 | size_t pad; | ||
| 643 | 616 | ||
| 644 | /* Now count remaining bytes. */ | 617 | ctx->total64[0] += bytes; |
| 645 | ctx->total[0] += bytes; | 618 | if (ctx->total64[0] < bytes) |
| 646 | if (ctx->total[0] < bytes) | 619 | ctx->total64[1]++; |
| 647 | ctx->total[1]++; | ||
| 648 | 620 | ||
| 649 | /* Pad the buffer to the next 128-byte boundary with 0x80,0,0,0... | 621 | /* Pad the buffer to the next 128-byte boundary with 0x80,0,0,0... |
| 650 | (FIPS 180-2:5.1.2) */ | 622 | (FIPS 180-2:5.1.2) */ |
| 651 | pad = bytes >= 112 ? 128 + 112 - bytes : 112 - bytes; | 623 | pad = bytes >= 112 ? 128 + 112 - bytes : 112 - bytes; |
| 652 | memset(&ctx->buffer[bytes], 0, pad); | 624 | memset(&ctx->wbuffer[bytes], 0, pad); |
| 653 | ctx->buffer[bytes] = 0x80; | 625 | ctx->wbuffer[bytes] = 0x80; |
| 654 | 626 | ||
| 655 | /* Put the 128-bit file length in *bits* at the end of the buffer. */ | 627 | *(uint64_t *) &ctx->wbuffer[bytes + pad + 8] = hton64(ctx->total64[0] << 3); |
| 656 | *(uint64_t *) &ctx->buffer[bytes + pad + 8] = hton64(ctx->total[0] << 3); | 628 | *(uint64_t *) &ctx->wbuffer[bytes + pad] = hton64((ctx->total64[1] << 3) | (ctx->total64[0] >> 61)); |
| 657 | *(uint64_t *) &ctx->buffer[bytes + pad] = hton64((ctx->total[1] << 3) | (ctx->total[0] >> 61)); | ||
| 658 | 629 | ||
| 659 | /* Process last bytes. */ | 630 | sha512_process_block128(ctx->wbuffer, bytes + pad + 16, ctx); |
| 660 | sha512_process_block(ctx->buffer, bytes + pad + 16, ctx); | ||
| 661 | 631 | ||
| 662 | /* Put result from CTX in first 64 bytes following RESBUF. */ | ||
| 663 | for (unsigned i = 0; i < 8; ++i) | 632 | for (unsigned i = 0; i < 8; ++i) |
| 664 | ((uint64_t *) resbuf)[i] = hton64(ctx->H[i]); | 633 | ((uint64_t *) resbuf)[i] = hton64(ctx->H[i]); |
| 665 | } | 634 | } |
