|
|
@ -90,8 +90,7 @@ void SHA1ProcessMessageBlock(SHA1Context *);
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
int SHA1Reset(SHA1Context *context)
|
|
|
|
int SHA1Reset(SHA1Context *context)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!context)
|
|
|
|
if (!context) {
|
|
|
|
{
|
|
|
|
|
|
|
|
return shaNull;
|
|
|
|
return shaNull;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -135,34 +134,27 @@ int SHA1Result( SHA1Context *context,
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
|
if (!context || !Message_Digest)
|
|
|
|
if (!context || !Message_Digest) {
|
|
|
|
{
|
|
|
|
|
|
|
|
return shaNull;
|
|
|
|
return shaNull;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (context->Corrupted)
|
|
|
|
if (context->Corrupted) {
|
|
|
|
{
|
|
|
|
|
|
|
|
return context->Corrupted;
|
|
|
|
return context->Corrupted;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!context->Computed)
|
|
|
|
if (!context->Computed) {
|
|
|
|
{
|
|
|
|
|
|
|
|
SHA1PadMessage(context);
|
|
|
|
SHA1PadMessage(context);
|
|
|
|
for(i=0; i<64; ++i)
|
|
|
|
for (i = 0; i < 64; ++i) {
|
|
|
|
{
|
|
|
|
|
|
|
|
/* message may be sensitive, clear it out */
|
|
|
|
/* message may be sensitive, clear it out */
|
|
|
|
context->Message_Block[i] = 0;
|
|
|
|
context->Message_Block[i] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
context->Length_Low = 0; /* and clear length */
|
|
|
|
context->Length_Low = 0; /* and clear length */
|
|
|
|
context->Length_High = 0;
|
|
|
|
context->Length_High = 0;
|
|
|
|
context->Computed = 1;
|
|
|
|
context->Computed = 1;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for(i = 0; i < SHA1HashSize; ++i)
|
|
|
|
for (i = 0; i < SHA1HashSize; ++i) {
|
|
|
|
{
|
|
|
|
Message_Digest[i] = context->Intermediate_Hash[i >> 2] >> 8 * ( 3 - ( i & 0x03 ) );
|
|
|
|
Message_Digest[i] = context->Intermediate_Hash[i>>2]
|
|
|
|
|
|
|
|
>> 8 * ( 3 - ( i & 0x03 ) );
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return shaSuccess;
|
|
|
|
return shaSuccess;
|
|
|
@ -188,48 +180,38 @@ int SHA1Result( SHA1Context *context,
|
|
|
|
* sha Error Code.
|
|
|
|
* sha Error Code.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
int SHA1Input( SHA1Context *context,
|
|
|
|
int SHA1Input(SHA1Context *context, const uint8_t *message_array, unsigned length)
|
|
|
|
const uint8_t *message_array,
|
|
|
|
|
|
|
|
unsigned length)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (!length)
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if (!length) {
|
|
|
|
return shaSuccess;
|
|
|
|
return shaSuccess;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!context || !message_array)
|
|
|
|
if (!context || !message_array) {
|
|
|
|
{
|
|
|
|
|
|
|
|
return shaNull;
|
|
|
|
return shaNull;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (context->Computed)
|
|
|
|
if (context->Computed) {
|
|
|
|
{
|
|
|
|
|
|
|
|
context->Corrupted = shaStateError;
|
|
|
|
context->Corrupted = shaStateError;
|
|
|
|
return shaStateError;
|
|
|
|
return shaStateError;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (context->Corrupted)
|
|
|
|
if (context->Corrupted) {
|
|
|
|
{
|
|
|
|
|
|
|
|
return context->Corrupted;
|
|
|
|
return context->Corrupted;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
while(length-- && !context->Corrupted)
|
|
|
|
|
|
|
|
{
|
|
|
|
while (length-- && !context->Corrupted) {
|
|
|
|
context->Message_Block[context->Message_Block_Index++] =
|
|
|
|
context->Message_Block[context->Message_Block_Index++] = (*message_array & 0xFF);
|
|
|
|
(*message_array & 0xFF);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
context->Length_Low += 8;
|
|
|
|
context->Length_Low += 8;
|
|
|
|
if (context->Length_Low == 0)
|
|
|
|
if (context->Length_Low == 0) {
|
|
|
|
{
|
|
|
|
|
|
|
|
context->Length_High++;
|
|
|
|
context->Length_High++;
|
|
|
|
if (context->Length_High == 0)
|
|
|
|
if (context->Length_High == 0) {
|
|
|
|
{
|
|
|
|
|
|
|
|
/* Message is too long */
|
|
|
|
/* Message is too long */
|
|
|
|
context->Corrupted = 1;
|
|
|
|
context->Corrupted = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (context->Message_Block_Index == 64)
|
|
|
|
if (context->Message_Block_Index == 64) {
|
|
|
|
{
|
|
|
|
|
|
|
|
SHA1ProcessMessageBlock(context);
|
|
|
|
SHA1ProcessMessageBlock(context);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -275,16 +257,14 @@ void SHA1ProcessMessageBlock(SHA1Context *context)
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|
* Initialize the first 16 words in the array W
|
|
|
|
* Initialize the first 16 words in the array W
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
for(t = 0; t < 16; t++)
|
|
|
|
for (t = 0; t < 16; t++) {
|
|
|
|
{
|
|
|
|
|
|
|
|
W[t] = context->Message_Block[t * 4] << 24;
|
|
|
|
W[t] = context->Message_Block[t * 4] << 24;
|
|
|
|
W[t] |= context->Message_Block[t * 4 + 1] << 16;
|
|
|
|
W[t] |= context->Message_Block[t * 4 + 1] << 16;
|
|
|
|
W[t] |= context->Message_Block[t * 4 + 2] << 8;
|
|
|
|
W[t] |= context->Message_Block[t * 4 + 2] << 8;
|
|
|
|
W[t] |= context->Message_Block[t * 4 + 3];
|
|
|
|
W[t] |= context->Message_Block[t * 4 + 3];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for(t = 16; t < 80; t++)
|
|
|
|
for (t = 16; t < 80; t++) {
|
|
|
|
{
|
|
|
|
|
|
|
|
W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]);
|
|
|
|
W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -294,10 +274,8 @@ void SHA1ProcessMessageBlock(SHA1Context *context)
|
|
|
|
D = context->Intermediate_Hash[3];
|
|
|
|
D = context->Intermediate_Hash[3];
|
|
|
|
E = context->Intermediate_Hash[4];
|
|
|
|
E = context->Intermediate_Hash[4];
|
|
|
|
|
|
|
|
|
|
|
|
for(t = 0; t < 20; t++)
|
|
|
|
for (t = 0; t < 20; t++) {
|
|
|
|
{
|
|
|
|
temp = SHA1CircularShift(5,A) + ((B & C) | ((~B) & D)) + E + W[t] + K[0];
|
|
|
|
temp = SHA1CircularShift(5,A) +
|
|
|
|
|
|
|
|
((B & C) | ((~B) & D)) + E + W[t] + K[0];
|
|
|
|
|
|
|
|
E = D;
|
|
|
|
E = D;
|
|
|
|
D = C;
|
|
|
|
D = C;
|
|
|
|
C = SHA1CircularShift(30,B);
|
|
|
|
C = SHA1CircularShift(30,B);
|
|
|
@ -305,8 +283,7 @@ void SHA1ProcessMessageBlock(SHA1Context *context)
|
|
|
|
A = temp;
|
|
|
|
A = temp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for(t = 20; t < 40; t++)
|
|
|
|
for (t = 20; t < 40; t++) {
|
|
|
|
{
|
|
|
|
|
|
|
|
temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1];
|
|
|
|
temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1];
|
|
|
|
E = D;
|
|
|
|
E = D;
|
|
|
|
D = C;
|
|
|
|
D = C;
|
|
|
@ -315,10 +292,8 @@ void SHA1ProcessMessageBlock(SHA1Context *context)
|
|
|
|
A = temp;
|
|
|
|
A = temp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for(t = 40; t < 60; t++)
|
|
|
|
for (t = 40; t < 60; t++) {
|
|
|
|
{
|
|
|
|
temp = SHA1CircularShift(5,A) + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2];
|
|
|
|
temp = SHA1CircularShift(5,A) +
|
|
|
|
|
|
|
|
((B & C) | (B & D) | (C & D)) + E + W[t] + K[2];
|
|
|
|
|
|
|
|
E = D;
|
|
|
|
E = D;
|
|
|
|
D = C;
|
|
|
|
D = C;
|
|
|
|
C = SHA1CircularShift(30,B);
|
|
|
|
C = SHA1CircularShift(30,B);
|
|
|
@ -326,8 +301,7 @@ void SHA1ProcessMessageBlock(SHA1Context *context)
|
|
|
|
A = temp;
|
|
|
|
A = temp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for(t = 60; t < 80; t++)
|
|
|
|
for (t = 60; t < 80; t++) {
|
|
|
|
{
|
|
|
|
|
|
|
|
temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3];
|
|
|
|
temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3];
|
|
|
|
E = D;
|
|
|
|
E = D;
|
|
|
|
D = C;
|
|
|
|
D = C;
|
|
|
@ -377,26 +351,20 @@ void SHA1PadMessage(SHA1Context *context)
|
|
|
|
* block, process it, and then continue padding into a second
|
|
|
|
* block, process it, and then continue padding into a second
|
|
|
|
* block.
|
|
|
|
* block.
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
if (context->Message_Block_Index > 55)
|
|
|
|
if (context->Message_Block_Index > 55) {
|
|
|
|
{
|
|
|
|
|
|
|
|
context->Message_Block[context->Message_Block_Index++] = 0x80;
|
|
|
|
context->Message_Block[context->Message_Block_Index++] = 0x80;
|
|
|
|
while(context->Message_Block_Index < 64)
|
|
|
|
while (context->Message_Block_Index < 64) {
|
|
|
|
{
|
|
|
|
|
|
|
|
context->Message_Block[context->Message_Block_Index++] = 0;
|
|
|
|
context->Message_Block[context->Message_Block_Index++] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SHA1ProcessMessageBlock(context);
|
|
|
|
SHA1ProcessMessageBlock(context);
|
|
|
|
|
|
|
|
|
|
|
|
while(context->Message_Block_Index < 56)
|
|
|
|
while (context->Message_Block_Index < 56) {
|
|
|
|
{
|
|
|
|
|
|
|
|
context->Message_Block[context->Message_Block_Index++] = 0;
|
|
|
|
context->Message_Block[context->Message_Block_Index++] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
context->Message_Block[context->Message_Block_Index++] = 0x80;
|
|
|
|
context->Message_Block[context->Message_Block_Index++] = 0x80;
|
|
|
|
while(context->Message_Block_Index < 56)
|
|
|
|
while (context->Message_Block_Index < 56) {
|
|
|
|
{
|
|
|
|
|
|
|
|
context->Message_Block[context->Message_Block_Index++] = 0;
|
|
|
|
context->Message_Block[context->Message_Block_Index++] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|