hmac

Perl

#!/usr/bin/perl use strict;
use warnings;
use Digest::SHA qw(hmac_sha1_hex);
print hmac_sha1_hex("my data", "secret key") . "\n";

C

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <openssl/hmac.h>

int main() {
  char* key = "secret key";
  char* data = "my data";
  char tmp[3];
  unsigned int result_len, i;
  unsigned char* result = malloc(sizeof(unsigned char) * result_len);
  HMAC_CTX ctx;
  HMAC_CTX_init(&ctx);
  HMAC_Init_ex(&ctx, (unsigned char*) key, strlen(key), EVP_sha1(), NULL);
  HMAC_Update(&ctx, (unsigned char*) data, strlen(data));
  HMAC_Final(&ctx, result, &result_len);
  HMAC_CTX_cleanup(&ctx);
  char* output = malloc(sizeof(char) * result_len);

  for (i = 0; i != result_len; i++) {
    //printf("Got %02X at byte %d\n", result[i], i);
    sprintf(tmp, "%02x", result[i]); strcat(output, tmp);
  }
  printf("output : %s\n", output);
  printf("expected: %s\n", "97a62219092f3ddab3707cc9e85e63e926f45c87");
  return 0;
}

Sample Run

$ perl hmac.pl 97a62219092f3ddab3707cc9e85e63e926f45c87
$ gcc -Wall -lcrypto hmac.c -o hmac && ./hmac
output : 97a62219092f3ddab3707cc9e85e63e926f45c87 expected: 97a62219092f3ddab3707cc9e85e63e926f45c87