programming advice, calculating a sha256 hash
Nathan Coulson <[email protected]>
| Newsgroups | gmane.linux.lfs.general |
|---|---|
| Message-ID | <CAFvYhDB1GuPWC5LzOYscfLn6NJX2kCno6TKwHdkVv9w80PD5KA@mail.gmail.com> |
Probably not the normal use for this channel, but *shrug*, can't hurt. I was attempting to code a sha256 hash function, for hashing a password before sending it over the open net. (Sounds like it's better then md5 for this) getting started, I found some psedocode at http://en.wikipedia.org/wiki/SHA2 and went to work. decided a blank string would be the best, It gives me 74525b2e06b6cfebaa347250d2a6c6c9a5438fbbd4b44ffefe68dcdd7b1d1206 but according to wikipedia above, it should be e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 -- Nathan Coulson (conathan) ------ Location: British Columbia, Canada Timezone: PST (-8) Webpage: http://www.nathancoulson.com -- http://linuxfromscratch.org/mailman/listinfo/lfs-chat FAQ: http://www.linuxfromscratch.org/faq/ Unsubscribe: See the above information page
sha256.c
(text/x-csrc, 3.3 KB)
#include <stdio.h>
#include <string.h>
#include <stdint.h>
//created from http://en.wikipedia.org/wiki/SHA2
unsigned int k[64]={
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2};
unsigned int rRt(unsigned int i, unsigned char j) {
return (i>>j) | (i << (32-j));
}
void endianFlip(unsigned int *w) {
unsigned char c[4];
int i;
for(i=0; i<64; i++) {
*(int*)c=w[i];
w[i]= c[0]<<24 | c[1]<<16 | c[2]<<8 | c[3];
}
}
void sha256S(unsigned int hsh[8], char *str, int length) {
int i;
unsigned int a,b,c,d,e,f,g,h;
unsigned int s0, s1, maj, t1,t2,ch;
unsigned int w[64];
uint64_t tl=length;
hsh[0]=0x6a09e667; hsh[1]=0xbb67ae85; hsh[2]=0x3c6ef372; hsh[3]=0xa54ff53a;
hsh[4]=0x510e527f; hsh[5]=0x9b05688c; hsh[6]=0x1f83d9ab; hsh[7]=0x5be0cd19;
while(length>=-1) {
if(length>=64) {
memcpy(w, str, 64);
length-=64;
} else if (length>56) {
*(length+(char*)w)=0x80;
memset(length+1+(char*)w, 0, 64-length-1);
memcpy(w, str, length);
length=-1;
} else {
if(length>=0)
*(length+(char*)w)=0x1;
//*(length+(char*)w)=0x80;
memset(length+1+(char*)w, 0, 56-length-1);
memcpy(w, str, length);
memcpy(56+(char*)w, &tl, 8);
length=-2;
for(i=0; i<64; i++) fprintf(stderr, "%2x", ((unsigned char*)w)[i]);
fprintf(stderr, "\n");
}
//extend to 64 32bit words
for(i=16; i<64; i++) {
s0= rRt(w[i-15], 7) ^ rRt(w[i-15],18) ^ (w[i-15]>>3);
s1= rRt(w[i-2], 17) ^ rRt(w[i-2],19) ^ (w[i-2]>>10);
w[i]=w[i-16]+s0+w[i-7]+s1;
}
a=hsh[0]; b=hsh[1]; c=hsh[2]; d=hsh[3];
e=hsh[4]; f=hsh[5]; g=hsh[6]; h=hsh[7];
//main loop
for(i=0; i<64; i++) {
s0=rRt(a,2) ^ rRt(a,13) ^ rRt(a,22);
maj=(a&b) ^ (a&c) ^ (b&c);
t2=s0+maj;
s1=rRt(e,6) ^ rRt(e,11) ^ rRt(e, 25);
ch=(e&f) ^ ((~e)&g);
t1=h+s1+ch+k[i]+w[i];
h=g;
g=f;
f=e;
e=d+t1;
d=c;
c=b;
b=a;
a=t1+t2;
hsh[0]=a;
hsh[1]=b;
hsh[2]=c;
hsh[3]=d;
hsh[4]=e;
hsh[5]=f;
hsh[6]=g;
hsh[7]=h;
}
}
}
int main() {
int i;
//char *str="The quick brown fox jumps over the lazy dog";
char *str="";
unsigned int z=0x98765432;
unsigned int h[8];
//fprintf(stderr, "%x %x %x %x\n", ((uint8_t*)&z)[0], ((uint8_t*)&z)[1], ((uint8_t*)&z)[2], ((uint8_t*)&z)[3]);
//endianFlip(&z);
//fprintf(stderr, "%x %x %x %x\n", ((uint8_t*)&z)[0], ((uint8_t*)&z)[1], ((uint8_t*)&z)[2], ((uint8_t*)&z)[3]);
sha256S(h, str, strlen(str));
fprintf(stderr, "%s\n", str);
for(i=0; i<8; i++) {
fprintf(stderr, "%8x", h[i]);
}
fprintf(stderr, "\n");
}