Index: TODO ================================================================== --- TODO +++ TODO @@ -1,5 +1,7 @@ +Tests for OFFile. + OFArray OFDictionary OFSortedArray OFSocket OFThread Index: src/OFHashes.m ================================================================== --- src/OFHashes.m +++ src/OFHashes.m @@ -326,10 +326,33 @@ state[1] += b; state[2] += c; state[3] += d; state[4] += e; } + +static inline void +sha1_update(uint8_t buffer, const uint8_t *buf, size_t size) +{ + size_t i, j; + + j = (size_t)((count >> 3) & 63); + count += (size << 3); + + if ((j + size) > 63) { + memcpy(&buffer[j], buf, (i = 64 - j)); + + sha1_transform(state, buffer); + + for (; i + 63 < size; i += 64) + sha1_transform(state, &buf[i]); + + j = 0; + } else + i = 0; + + memcpy(&buffer[j], &buf[i], size - i); +} @implementation OFSHA1Hash - init { if ((self = [super init])) { @@ -345,33 +368,16 @@ } - updateWithBuffer: (const uint8_t*)buf ofSize: (size_t)size { - size_t i, j; - if (calculated) return self; if (size == 0) return self; - j = (size_t)((count >> 3) & 63); - count += (size << 3); - - if ((j + size) > 63) { - memcpy(&buffer[j], buf, (i = 64 - j)); - - sha1_transform(state, buffer); - - for (; i + 63 < size; i += 64) - sha1_transform(state, &buf[i]); - - j = 0; - } else - i = 0; - - memcpy(&buffer[j], &buf[i], size - i); + sha1_update(buffer, buf, size); return self; } - (uint8_t*)digest @@ -383,19 +389,16 @@ return digest; for (i = 0; i < 8; i++) /* Endian independent */ finalcount[i] = (uint8_t)((count >> ((7 - (i & 7)) * 8)) & 255); - [self updateWithBuffer: (const uint8_t*)"\200" - ofSize: 1]; + sha1_update(buffer, (const uint8_t*)"\200", 1); while ((count & 504) != 448) - [self updateWithBuffer: (const uint8_t*)"\0" - ofSize: 1]; + sha1_update(buffer, (const uint8_t*)"\0", 1); /* Should cause a sha1_transform() */ - [self updateWithBuffer: finalcount - ofSize: 8]; + sha1_update(buffer, finalcount, 8); for (i = 0; i < SHA1_DIGEST_SIZE; i++) digest[i] = (uint8_t)((state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);