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");
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.