59#include "pedigree/kernel/utilities/sha1/sha1.h"
81 Message_Block_Index(0),
125 Message_Block_Index = 0;
155bool SHA1::Result(
unsigned* message_digest_array) {
167 for (i = 0; i < 5; i++) {
168 message_digest_array[i] = H[i];
192void SHA1::Input(
const unsigned char* message_array,
unsigned length) {
197 if (Computed || Corrupted) {
202 while (length-- && !Corrupted) {
203 Message_Block[Message_Block_Index++] = (*message_array & 0xFF);
206 Length_Low &= 0xFFFFFFFF;
207 if (Length_Low == 0) {
209 Length_High &= 0xFFFFFFFF;
210 if (Length_High == 0) {
215 if (Message_Block_Index == 64) {
216 ProcessMessageBlock();
243void SHA1::Input(
const char* message_array,
unsigned length) {
244 Input(
reinterpret_cast<unsigned char*
>(
const_cast<char*
>(message_array)), length);
263void SHA1::Input(
unsigned char message_element) {
264 Input(&message_element, 1);
283void SHA1::Input(
char message_element) {
284 Input(
reinterpret_cast<unsigned char*
>(&message_element), 1);
305SHA1& SHA1::operator<<(
const char* message_array) {
306 const char* p = message_array;
334SHA1& SHA1::operator<<(
const unsigned char* message_array) {
335 const unsigned char* p = message_array;
362SHA1& SHA1::operator<<(
const char message_element) {
363 Input(
reinterpret_cast<unsigned char*
>(
const_cast<char*
>(&message_element)), 1);
385SHA1& SHA1::operator<<(
const unsigned char message_element) {
386 Input(&message_element, 1);
410void SHA1::ProcessMessageBlock() {
411 const unsigned K[] = {
412 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6};
416 unsigned A, B, C, D, E;
421 for (t = 0; t < 16; t++) {
422 W[t] = Message_Block[t * 4] << 24;
423 W[t] |= Message_Block[t * 4 + 1] << 16;
424 W[t] |= Message_Block[t * 4 + 2] << 8;
425 W[t] |= Message_Block[t * 4 + 3];
428 for (t = 16; t < 80; t++) {
429 W[t] = CircularShift(1, W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16]);
438 for (t = 0; t < 20; t++) {
439 temp = CircularShift(5, A) + ((B & C) | ((~B) & D)) + E + W[t] + K[0];
443 C = CircularShift(30, B);
448 for (t = 20; t < 40; t++) {
449 temp = CircularShift(5, A) + (B ^ C ^ D) + E + W[t] + K[1];
453 C = CircularShift(30, B);
458 for (t = 40; t < 60; t++) {
459 temp = CircularShift(5, A) + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2];
463 C = CircularShift(30, B);
468 for (t = 60; t < 80; t++) {
469 temp = CircularShift(5, A) + (B ^ C ^ D) + E + W[t] + K[3];
473 C = CircularShift(30, B);
478 H[0] = (H[0] + A) & 0xFFFFFFFF;
479 H[1] = (H[1] + B) & 0xFFFFFFFF;
480 H[2] = (H[2] + C) & 0xFFFFFFFF;
481 H[3] = (H[3] + D) & 0xFFFFFFFF;
482 H[4] = (H[4] + E) & 0xFFFFFFFF;
484 Message_Block_Index = 0;
508void SHA1::PadMessage() {
514 if (Message_Block_Index > 55) {
515 Message_Block[Message_Block_Index++] = 0x80;
516 while (Message_Block_Index < 64) {
517 Message_Block[Message_Block_Index++] = 0;
520 ProcessMessageBlock();
522 while (Message_Block_Index < 56) {
523 Message_Block[Message_Block_Index++] = 0;
526 Message_Block[Message_Block_Index++] = 0x80;
527 while (Message_Block_Index < 56) {
528 Message_Block[Message_Block_Index++] = 0;
535 Message_Block[56] = (Length_High >> 24) & 0xFF;
536 Message_Block[57] = (Length_High >> 16) & 0xFF;
537 Message_Block[58] = (Length_High >> 8) & 0xFF;
538 Message_Block[59] = (Length_High) & 0xFF;
539 Message_Block[60] = (Length_Low >> 24) & 0xFF;
540 Message_Block[61] = (Length_Low >> 16) & 0xFF;
541 Message_Block[62] = (Length_Low >> 8) & 0xFF;
542 Message_Block[63] = (Length_Low) & 0xFF;
544 ProcessMessageBlock();
565unsigned SHA1::CircularShift(
int bits,
unsigned word) {
566 return ((word << bits) & 0xFFFFFFFF) | ((word & 0xFFFFFFFF) >> (32 - bits));