📄 hash.cpp
字号:
/*
borZoi - An ELLiptic Curve Cryptography Library
Copyright (C) 2001 Anthony Mulcahy
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it wiLL be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
\You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <iomanip>
#include "borzoi.h"
// return a padded vector
std::vector<unsigned int> pad (OCTETSTR& in) {
unsigned long l = in.size()*8;
unsigned long k = (448-(l+1))%512;
std::vector<unsigned int> out((l+1+k+64)/32);
unsigned long i = 0;
unsigned long j = 0;
unsigned int shift = 0x1000000;
out[i] = 0L;
while (j<in.size ()) {
out[i] |= in[j]*shift;
shift /=0x100;
if (!shift) {
i++;
shift = 0x1000000;
out[i] = 0L;
}
j++;
}
out[i] |= 0x80L*shift;
while (i<out.size ()-1) {
i++;
out[i] = 0;
}
out[i] |= in.size()*8;
return out;
}
unsigned int f (unsigned int B, unsigned int C, unsigned int D, int t) {
unsigned int f;
if (t < 20) {
f = (B & C) | (~B & D);
} else if (t<40) {
f = B ^ C ^D;
}else if (t<60) {
f = (B & C) | (B & D) | (C & D);
} else {
f = B ^ C ^D;
}
return f;
}
unsigned int K (int t) {
unsigned int k;
if (t < 20) {
k = 0x5a827999;
} else if (t<40) {
k = 0x6ed9eba1;
}else if (t<60) {
k = 0x8f1bbcdc;
} else {
k = 0xca62c1d6;
}
return k;
}
unsigned int S (unsigned int X, int n) {
return (((X<<n) | (X>>(32-n))&0xffffffff));
}
// return the SHA1 hash of octet string x in OCTETSTR form
// Based on FIPS PUB 180-1
OCTETSTR SHA1 (const OCTETSTR& x) {
OCTETSTR str = x;
OCTETSTR hashstr(20);
std::vector<unsigned int> M = pad (str);
std::vector<unsigned int> W (80);
unsigned int H0=0x67452301;
unsigned int H1=0xefcdab89;
unsigned int H2=0x98badcfe;
unsigned int H3=0x10325476;
unsigned int H4=0xc3d2e1f0;
int t;
unsigned int A;
unsigned int B;
unsigned int C;
unsigned int D;
unsigned int E;
unsigned int TEMP;
for (int n=0; n<M.size (); n+=16) {
for (t=0; t<16; t++) {
W[t] = M[t+n];
}
for (t=16; t<80; t++) {
W[t] = S (W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1);
}
A=H0; B=H1; C=H2; D=H3; E=H4;
for (t=0; t<80; t++) {
TEMP = S(A,5) + f (B, C, D, t) + E + W[t] +K(t);
E=D; D=C; C=S(B,30); B=A; A=TEMP;
}
H0+=A; H1+=B; H2+=C; H3+=D; H4+=E;
}
hashstr[0] = H4&0xff; hashstr[1] = (H4>>8)&0xff; hashstr[2] = (H4>>16)&0xff; hashstr[3] = (H4>>24)&0xff;
hashstr[4] = H3&0xff; hashstr[5] = (H3>>8)&0xff; hashstr[6] = (H3>>16)&0xff; hashstr[7] = (H3>>24)&0xff;
hashstr[8] = H2&0xff; hashstr[9] = (H2>>8)&0xff; hashstr[10] = (H2>>16)&0xff; hashstr[11] = (H2>>24)&0xff;
hashstr[12] = H1&0xff; hashstr[13] = (H1>>8)&0xff; hashstr[14] = (H1>>16)&0xff; hashstr[15] = (H1>>24)&0xff;
hashstr[16] = H0&0xff; hashstr[17] = (H0>>8)&0xff; hashstr[18] = (H0>>16)&0xff; hashstr[19] = (H0>>24)&0xff;
//BigInt hash = OS2IP (hashstr);
return hashstr;
}
// return the SHA1 hash of string x in OCTETSTR form
// Based on FIPS PUB 180-1
OCTETSTR SHA1 (const std::string& x) {
OCTETSTR os(x.size ());
for (int i=0; i<x.size (); i++) {
os[i] = x[i];
}
return SHA1 (os);
}
// return the SHA1 hash of BigInt x in OCTETSTR form
// Based on FIPS PUB 180-1
OCTETSTR SHA1 (BigInt x) {
return SHA1 (I2OSP(x));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -