📄 sha1.h
字号:
//
// f(t;B,C,D) = B XOR C XOR D (60 <= t <= 79).
//
// A sequence of constant words K(0), K(1), ... , K(79) is used in the
// SHA-1. In hex these are given by
//
// K(t) = 5A827999 ( 0 <= t <= 19)
//
// K(t) = 6ED9EBA1 (20 <= t <= 39)
//
// K(t) = 8F1BBCDC (40 <= t <= 59)
//
// K(t) = CA62C1D6 (60 <= t <= 79).
//
// 6. Computing the Message Digest
//
// The methods given in 6.1 and 6.2 below yield the same message digest.
// Although using method 2 saves sixty-four 32-bit words of storage, it
// is likely to lengthen execution time due to the increased complexity
// of the address computations for the { W[t] } in step (c). There are
// other computation methods which give identical results.
//
// 6.1 Method 1
//
// The message digest is computed using the message padded as described
// in section 4. The computation is described using two buffers, each
// consisting of five 32-bit words, and a sequence of eighty 32-bit
// words. The words of the first 5-word buffer are labeled A,B,C,D,E.
// The words of the second 5-word buffer are labeled H0, H1, H2, H3, H4.
// The words of the 80-word sequence are labeled W(0), W(1),..., W(79).
// A single word buffer TEMP is also employed.
//
// To generate the message digest, the 16-word blocks M(1), M(2),...,
// M(n) defined in section 4 are processed in order. The processing of
// each M(i) involves 80 steps.
//
//
//
//
// Eastlake & Jones Informational [Page 6]
//
// RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001
//
//
// Before processing any blocks, the H's are initialized as follows: in
// hex,
//
// H0 = 67452301
//
// H1 = EFCDAB89
//
// H2 = 98BADCFE
//
// H3 = 10325476
//
// H4 = C3D2E1F0.
//
// Now M(1), M(2), ... , M(n) are processed. To process M(i), we
// proceed as follows:
//
// a. Divide M(i) into 16 words W(0), W(1), ... , W(15), where W(0)
// is the left-most word.
//
// b. For t = 16 to 79 let
//
// W(t) = S^1(W(t-3) XOR W(t-8) XOR W(t-14) XOR W(t-16)).
//
// c. Let A = H0, B = H1, C = H2, D = H3, E = H4.
//
// d. For t = 0 to 79 do
//
// TEMP = S^5(A) + f(t;B,C,D) + E + W(t) + K(t);
//
// E = D; D = C; C = S^30(B); B = A; A = TEMP;
//
// e. Let H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4
// + E.
//
// After processing M(n), the message digest is the 160-bit string
// represented by the 5 words
//
// H0 H1 H2 H3 H4.
//
// 6.2 Method 2
//
// The method above assumes that the sequence W(0), ... , W(79) is
// implemented as an array of eighty 32-bit words. This is efficient
// from the standpoint of minimization of execution time, since the
// addresses of W(t-3), ... ,W(t-16) in step (b) are easily computed.
// If space is at a premium, an alternative is to regard { W(t) } as a
//
//
//
//
//
// Eastlake & Jones Informational [Page 7]
//
// RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001
//
//
// circular queue, which may be implemented using an array of sixteen
// 32-bit words W[0], ... W[15]. In this case, in hex let
//
// MASK = 0000000F. Then processing of M(i) is as follows:
//
// a. Divide M(i) into 16 words W[0], ... , W[15], where W[0] is the
// left-most word.
//
// b. Let A = H0, B = H1, C = H2, D = H3, E = H4.
//
// c. For t = 0 to 79 do
//
// s = t AND MASK;
//
// if (t >= 16) W[s] = S^1(W[(s + 13) AND MASK] XOR W[(s + 8) AND
// MASK] XOR W[(s + 2) AND MASK] XOR W[s]);
//
// TEMP = S^5(A) + f(t;B,C,D) + E + W[s] + K(t);
//
// E = D; D = C; C = S^30(B); B = A; A = TEMP;
//
// d. Let H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4
// + E.
//
// 7. C Code
//
// Below is a demonstration implementation of SHA-1 in C. Section 7.1
// contains the header file, 7.2 the C code, and 7.3 a test driver.
//
// 7.1 .h file
//
// /*
// * sha1.h
// *
// * Description:
// * This is the header file for code which implements the Secure
// * Hashing Algorithm 1 as defined in FIPS PUB 180-1 published
// * April 17, 1995.
// *
// * Many of the variable names in this code, especially the
// * single character names, were used because those were the names
// * used in the publication.
// *
// * Please read the file sha1.c for more information.
// *
// */
//
//
//
//
//
// Eastlake & Jones Informational [Page 8]
//
// RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001
//
//
// #ifndef _SHA1_H_
// #define _SHA1_H_
//
// #include <stdint.h>
// /*
// * If you do not have the ISO standard stdint.h header file, then you
// * must typdef the following:
// * name meaning
// * uint32_t unsigned 32 bit integer
// * uint8_t unsigned 8 bit integer (i.e., unsigned char)
// * int_least16_t integer of >= 16 bits
// *
// */
//
// #ifndef _SHA_enum_
// #define _SHA_enum_
// enum
// {
// shaSuccess = 0,
// shaNull, /* Null pointer parameter */
// shaInputTooLong, /* input data too long */
// shaStateError /* called Input after Result */
// };
// #endif
// #define SHA1HashSize 20
//
// /*
// * This structure will hold context information for the SHA-1
// * hashing operation
// */
// typedef struct SHA1Context
// {
// uint32_t Intermediate_Hash[SHA1HashSize/4]; /* Message Digest */
//
// uint32_t Length_Low; /* Message length in bits */
// uint32_t Length_High; /* Message length in bits */
//
// /* Index into message block array */
// int_least16_t Message_Block_Index;
// uint8_t Message_Block[64]; /* 512-bit message blocks */
//
// int Computed; /* Is the digest computed? */
// int Corrupted; /* Is the message digest corrupted? */
// } SHA1Context;
//
// /*
// * Function Prototypes
// */
//
//
//
// Eastlake & Jones Informational [Page 9]
//
// RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001
//
//
// int SHA1Reset( SHA1Context *);
// int SHA1Input( SHA1Context *,
// const uint8_t *,
// unsigned int);
// int SHA1Result( SHA1Context *,
// uint8_t Message_Digest[SHA1HashSize]);
//
// #endif
//
// 7.2 .c file
//
// /*
// * sha1.c
// *
// * Description:
// * This file implements the Secure Hashing Algorithm 1 as
// * defined in FIPS PUB 180-1 published April 17, 1995.
// *
// * The SHA-1, produces a 160-bit message digest for a given
// * data stream. It should take about 2**n steps to find a
// * message with the same digest as a given message and
// * 2**(n/2) to find any two messages with the same digest,
// * when n is the digest size in bits. Therefore, this
// * algorithm can serve as a means of providing a
// * "fingerprint" for a message.
// *
// * Portability Issues:
// * SHA-1 is defined in terms of 32-bit "words". This code
// * uses <stdint.h> (included via "sha1.h" to define 32 and 8
// * bit unsigned integer types. If your C compiler does not
// * support 32 bit unsigned integers, this code is not
// * appropriate.
// *
// * Caveats:
// * SHA-1 is designed to work with messages less than 2^64 bits
// * long. Although SHA-1 allows a message digest to be generated
// * for messages of any number of bits less than 2^64, this
// * implementation only works with messages with a length that is
// * a multiple of the size of an 8-bit character.
// *
// */
//
//
//
//
//
//
//
//
//
//
// Eastlake & Jones Informational [Page 10]
//
// RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001
//
//
// #include "sha1.h"
//
// /*
// * Define the SHA1 circular left shift macro
// */
// #define SHA1CircularShift(bits,word) \
// (((word) << (bits)) | ((word) >> (32-(bits))))
//
// /* Local Function Prototyptes */
// void SHA1PadMessage(SHA1Context *);
// void SHA1ProcessMessageBlock(SHA1Context *);
//
// /*
// * SHA1Reset
// *
// * Description:
// * This function will initialize the SHA1Context in preparation
// * for computing a new SHA1 message digest.
// *
// * Parameters:
// * context: [in/out]
// * The context to reset.
// *
// * Returns:
// * sha Error Code.
// *
// */
// int SHA1Reset(SHA1Context *context)
// {
// if (!context)
// {
// return shaNull;
// }
//
// context->Length_Low = 0;
// context->Length_High = 0;
// context->Message_Block_Index = 0;
//
// context->Intermediate_Hash[0] = 0x67452301;
// context->Intermediate_Hash[1] = 0xEFCDAB89;
// context->Intermediate_Hash[2] = 0x98BADCFE;
// context->Intermediate_Hash[3] = 0x10325476;
// context->Intermediate_Hash[4] = 0xC3D2E1F0;
//
// context->Computed = 0;
// context->Corrupted = 0;
//
//
//
//
//
// Eastlake & Jones Informational [Page 11]
//
// RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001
//
//
// return shaSuccess;
// }
//
// /*
// * SHA1Result
// *
// * Description:
// * This function will return the 160-bit message digest into the
// * Message_Digest array provided by the caller.
// * NOTE: The first octet of hash is stored in the 0th element,
// * the last octet of hash in the 19th element.
// *
// * Parameters:
// * context: [in/out]
// * The context to use to calculate the SHA-1 hash.
// * Message_Digest: [out]
// * Where the digest is returned.
// *
// * Returns:
// * sha Error Code.
// *
// */
// int SHA1Result( SHA1Context *context,
// uint8_t Message_Digest[SHA1HashSize])
// {
// int i;
//
// if (!context || !Message_Digest)
// {
// return shaNull;
// }
//
// if (context->Corrupted)
// {
// return context->Corrupted;
// }
//
// if (!context->Computed)
// {
// SHA1PadMessage(context);
// for(i=0; i<64; ++i)
// {
// /* message may be sensitive, clear it out */
// context->Message_Block[i] = 0;
// }
// context->Length_Low = 0; /* and clear length */
// context->Length_High = 0;
// context->Computed = 1;
//
//
//
// Eastlake & Jones Informational [Page 12]
//
// RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001
//
//
// }
//
// for(i = 0; i < SHA1HashSize; ++i)
// {
// Message_Digest[i] = context->Intermediate_Hash[i>>2]
// >> 8 * ( 3 - ( i & 0x03 ) );
// }
//
// return shaSuccess;
// }
//
// /*
// * SHA1Input
// *
// * Description:
// * This function accepts an array of octets as the next portion
// * of the message.
// *
// * Parameters:
// * context: [in/out]
// * The SHA context to update
// * message_array: [in]
// * An array of characters representing the next portion of
// * the message.
// * length: [in]
// * The length of the message in message_array
// *
// * Returns:
// * sha Error Code.
// *
// */
// int SHA1Input( SHA1Context *context,
// const uint8_t *message_array,
// unsigned length)
// {
// if (!length)
// {
// return shaSuccess;
// }
//
// if (!context || !message_array)
// {
// return shaNull;
// }
//
// if (context->Computed)
// {
// context->Corrupted = shaStateError;
//
//
//
// Eastlake & Jones Informational [Page 13]
//
// RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001
//
//
// return shaStateError;
// }
//
// if (context->Corrupted)
// {
// return context->Corrupted;
// }
// while(length-- && !context->Corrupted)
// {
// context->Message_Block[context->Message_Block_Index++] =
// (*message_array & 0xFF);
//
// context->Length_Low += 8;
// if (context->Length_Low == 0)
// {
// context->Length_High++;
// if (context->Length_High == 0)
// {
// /* Message is too long */
// context->Corrupted = 1;
// }
// }
//
// if (context->Message_Block_Index == 64)
// {
// SHA1ProcessMessageBlock(context);
// }
//
// message_array++;
// }
//
// return shaSuccess;
// }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -