Kalkulasi SHA1 dan HMAC-SHA1 dengan OpenSSL

Berhubung cuma pengen nyatet aja, bagi yang pengen tau caranya langsung aja lihat http://gist.github.com/63888

Tuk ngitung SHA1

char* data = "data";
unsigned long len = (unsigned long)strlen(data);
SHA_CTX sha_ctx;
unsigned char result[SHA_DIGEST_LENGTH];
int i;

SHA1Init(&shactx);
SHA1Update(&shactx, data, len);
SHA1Final(result, &shactx);

Tuk ngitung HMAC-SHA1

char* key = "12345678901234567890";
int key_len = 20;

char* data = "data";
int data_len = strlen(data);

unsigned int result_len;
unsigned char result[EVP_MAX_MD_SIZE];

int i;

HMAC(EVP_sha1(),
  key, key_len,
  data, data_len,
  result, &result_len);

Tuk ngecek, bisa coba langsung panggil openssl dari command line.

$ echo -n "data" | openssl dgst -sha1
$ echo -n "data" | openssl dgst -sha1 -hmac "12345678901234567890"

Nyetak isi array of chars dalam heksadesimal bisa pake cara berikut

inline char tohex(char c)
{
  if ((c >= 0) && (c <= 9)) { return '0' + c; }
  else { return 'a' + (c-10); }
}

...

for (i=0; i<result_len; i++) {
  printf("%c", tohex(result[i] >> 4));
  printf("%c", tohex(result[i] & 0xF));
}