static void sha1_result(sha1_ctxt * ctxt, uint8_t *digest0) { uint8_t *digest; digest = (uint8_t *) digest0; sha1_pad(ctxt); #ifdef BIG_ENDIAN_ORDER memmove(digest, &ctxt->h.b8[0], 20); #else digest[0] = ctxt->h.b8[3]; digest[1] = ctxt->h.b8[2]; digest[2] = ctxt->h.b8[1]; digest[3] = ctxt->h.b8[0]; digest[4] = ctxt->h.b8[7]; digest[5] = ctxt->h.b8[6]; digest[6] = ctxt->h.b8[5]; digest[7] = ctxt->h.b8[4]; digest[8] = ctxt->h.b8[11]; digest[9] = ctxt->h.b8[10]; digest[10] = ctxt->h.b8[9]; digest[11] = ctxt->h.b8[8]; digest[12] = ctxt->h.b8[15]; digest[13] = ctxt->h.b8[14]; digest[14] = ctxt->h.b8[13]; digest[15] = ctxt->h.b8[12]; digest[16] = ctxt->h.b8[19]; digest[17] = ctxt->h.b8[18]; digest[18] = ctxt->h.b8[17]; digest[19] = ctxt->h.b8[16]; #endif }
void SHA1Final(os_byte *digest0, SHA1_CTXT* ctxt) { os_byte *digest; digest = (os_byte *) digest0; sha1_pad(ctxt); #ifdef WORDS_BIGENDIAN memmove(digest, &ctxt->h.b8[0], 20); #else digest[0] = ctxt->h.b8[3]; digest[1] = ctxt->h.b8[2]; digest[2] = ctxt->h.b8[1]; digest[3] = ctxt->h.b8[0]; digest[4] = ctxt->h.b8[7]; digest[5] = ctxt->h.b8[6]; digest[6] = ctxt->h.b8[5]; digest[7] = ctxt->h.b8[4]; digest[8] = ctxt->h.b8[11]; digest[9] = ctxt->h.b8[10]; digest[10] = ctxt->h.b8[9]; digest[11] = ctxt->h.b8[8]; digest[12] = ctxt->h.b8[15]; digest[13] = ctxt->h.b8[14]; digest[14] = ctxt->h.b8[13]; digest[15] = ctxt->h.b8[12]; digest[16] = ctxt->h.b8[19]; digest[17] = ctxt->h.b8[18]; digest[18] = ctxt->h.b8[17]; digest[19] = ctxt->h.b8[16]; #endif }
static void sha1_result( struct sha1_ctxt *ctxt, caddr_t digest0) { u_int8_t *digest; digest = (u_int8_t *)digest0; sha1_pad(ctxt); #if BYTE_ORDER == BIG_ENDIAN bcopy(&ctxt->h.b8[0], digest, 20); #else digest[0] = ctxt->h.b8[3]; digest[1] = ctxt->h.b8[2]; digest[2] = ctxt->h.b8[1]; digest[3] = ctxt->h.b8[0]; digest[4] = ctxt->h.b8[7]; digest[5] = ctxt->h.b8[6]; digest[6] = ctxt->h.b8[5]; digest[7] = ctxt->h.b8[4]; digest[8] = ctxt->h.b8[11]; digest[9] = ctxt->h.b8[10]; digest[10] = ctxt->h.b8[9]; digest[11] = ctxt->h.b8[8]; digest[12] = ctxt->h.b8[15]; digest[13] = ctxt->h.b8[14]; digest[14] = ctxt->h.b8[13]; digest[15] = ctxt->h.b8[12]; digest[16] = ctxt->h.b8[19]; digest[17] = ctxt->h.b8[18]; digest[18] = ctxt->h.b8[17]; digest[19] = ctxt->h.b8[16]; #endif // TODO should we bzero() the context ? the SHA2 routines do. }
void sha1_result(struct sha1_ctxt *ctxt,unsigned char *digest0) { uint8_t *digest; digest = (uint8_t *)digest0; sha1_pad(ctxt); #if BIG_ENDIAN memcpy(digest, &ctxt->h.b8[0],20); #else digest[0] = ctxt->h.b8[3]; digest[1] = ctxt->h.b8[2]; digest[2] = ctxt->h.b8[1]; digest[3] = ctxt->h.b8[0]; digest[4] = ctxt->h.b8[7]; digest[5] = ctxt->h.b8[6]; digest[6] = ctxt->h.b8[5]; digest[7] = ctxt->h.b8[4]; digest[8] = ctxt->h.b8[11]; digest[9] = ctxt->h.b8[10]; digest[10] = ctxt->h.b8[9]; digest[11] = ctxt->h.b8[8]; digest[12] = ctxt->h.b8[15]; digest[13] = ctxt->h.b8[14]; digest[14] = ctxt->h.b8[13]; digest[15] = ctxt->h.b8[12]; digest[16] = ctxt->h.b8[19]; digest[17] = ctxt->h.b8[18]; digest[18] = ctxt->h.b8[17]; digest[19] = ctxt->h.b8[16]; #endif }
void challenge_29() { unsigned char message[128] = "comment1=cooking%20MCs;userdata=foo;" "comment2=%20like%20a%20pound%20of%20bacon"; int mlen = 77, plen; unsigned char padded_message[256] = {0}; memcpy(padded_message, message, 128); unsigned char append[16] = ";admin=true"; int alen = 11; unsigned char mac[20], forged_mac[20], test_mac[20]; print_str("Base MAC"); sha1_keyed_mac(message, strlen((char *) message), (unsigned char *) get_static_word(), strlen(get_static_word()), mac); print_hex(mac, 20); print_str("\nForged MAC"); // Assumes secret length 8, but will be the same for any // secret length that doesn't increase or decrease the // number of 64 byte blocks in the hash input + padding sha1_length_extension(mac, mlen + 8 + sha1_pad_length(mlen + 8), append, alen, forged_mac); print_hex(forged_mac, 20); print_str("\nPlaintext verified by server: "); int i; for (i = 0; i < 16; ++i) { plen = sha1_pad(padded_message, mlen, i); memcpy(padded_message + plen, append, alen); plen += alen; sha1_keyed_mac(padded_message, plen, (unsigned char *) get_static_word(), strlen(get_static_word()), test_mac); if (memcmp(forged_mac, test_mac, 20) == 0) { print_hex(test_mac, 20); print_binary(padded_message, plen); } } }
void sha1_result(struct sha1_ctxt *ctxt, void *digest0) { uint8_t *digest; digest = (uint8_t *)digest0; sha1_pad(ctxt); #if WORDS_BIGENDIAN memmove(digest, &ctxt->h.b8[0], 20); #else digest[0] = ctxt->h.b8[3]; digest[1] = ctxt->h.b8[2]; digest[2] = ctxt->h.b8[1]; digest[3] = ctxt->h.b8[0]; digest[4] = ctxt->h.b8[7]; digest[5] = ctxt->h.b8[6]; digest[6] = ctxt->h.b8[5]; digest[7] = ctxt->h.b8[4]; digest[8] = ctxt->h.b8[11]; digest[9] = ctxt->h.b8[10]; digest[10] = ctxt->h.b8[9]; digest[11] = ctxt->h.b8[8]; digest[12] = ctxt->h.b8[15]; digest[13] = ctxt->h.b8[14]; digest[14] = ctxt->h.b8[13]; digest[15] = ctxt->h.b8[12]; digest[16] = ctxt->h.b8[19]; digest[17] = ctxt->h.b8[18]; digest[18] = ctxt->h.b8[17]; digest[19] = ctxt->h.b8[16]; #endif safe_memset(ctxt, 0, sizeof(struct sha1_ctxt)); }