Gitのsha1ハッシュ値計算をC言語で実装してみた

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/sha.h>

char *sha1_to_hex(const unsigned char *sha1)
{
    static int bufno;
    static char hexbuffer[4][50];
    static const char hex[] = "0123456789abcdef";
    char *buffer = hexbuffer[3 & ++bufno], *buf = buffer;
    int i;

    for (i = 0; i < 20; i++) {
	unsigned int val = *sha1++;
	*buf++ = hex[val >> 4];
	*buf++ = hex[val & 0xf];
    }
    *buf = '\0';

    return buffer;
}

void calc_sha1(const char *body)
{
    char *type = "blob";
    int hdrlen;
    char hdr[256];
    unsigned char sha1[41];
    unsigned long len;
    SHA_CTX c;

    len = strlen(body);

    sprintf(hdr, "%s %ld", type, len);
    hdrlen = strlen(hdr) + 1;

    SHA1_Init(&c);
    SHA1_Update(&c, hdr, hdrlen);
    SHA1_Update(&c, body, len);
    SHA1_Final(sha1, &c);

    printf("%s\n", sha1_to_hex(sha1));
}

int main()
{
    char *body = "hello\n";
    calc_sha1(body);
    return 0;
}
ちなみにsha1_to_hex関数の方はgitのソースコードを丸パクリしただけです。:)
私が自分の頭で考えて書いたのはcalc_sha1関数の方です。

実行結果

$ gcc -g -Wall -lssl calc_sha1.c -o calc_sha1
$ ./calc_sha1
ce013625030ba8dba906f756967f9e9ca394464a
で、できた!!
やった~~~~!!!
カテゴリ: