2013年2月24日日曜日

[OpenSSL]HMAC_SHA256_BASE64 を使う

OpenSSL の crypto ライブラリにある hmac と base64 を使って HMAC_SHA256_BASE64 を実行する
Example: hmac_sha256_base64.c
#include <stdio.h>
#include <string.h>
#include <openssl/hmac.h>
#include <openssl/md5.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
/**
 ***********************************************************************
 * @brief バッファの内容を HEX で表示
 *
 * @param[in] buff 表示するバッファのポインタ
 * @param[in] length バッファ長
 ***********************************************************************
 */
static void printDump(const unsigned char *buff, int length)
{
    int i;

    for (i = 0; i < length; i++) {
        printf("%02x", (buff[i] & 0x000000ff));
        if ((i + 1) % 16 == 0) {
            printf("\n");
        }
        else {
            printf(" ");
        }
    }
    printf("\n\n");
}

/**
 ***********************************************************************
 * @brief バッファの内容を文字列で表示
 *
 * @param[in] buff 表示するバッファのポインタ
 * @param[in] length バッファ長
 ***********************************************************************
 */
static void printChar(const unsigned char *buff, int length)
{
    int i;

    for (i = 0; i < length; i++) {
        printf("%c", buff[i]);
    }
    printf("\n\n");
}

/**
 ***********************************************************************
 * @brief BASE64 encode をする
 *
 * @param[in] buff Encode 対象バッファ
 * @param[in] length バッファ長
 ***********************************************************************
 */
static void base64(const unsigned char *input, int length)
{
    BIO *bmem, *b64;
    BUF_MEM *bptr;

    b64 = BIO_new(BIO_f_base64());
    bmem = BIO_new(BIO_s_mem());
    b64 = BIO_push(b64, bmem);
    BIO_write(b64, input, length);
    BIO_flush(b64);
    BIO_get_mem_ptr(b64, &bptr);

    printf("Base64 output:\n");
    printDump(bptr->data, bptr->length);
    printf("Base64 output(char):\n");
    printChar(bptr->data, bptr->length);
    BIO_free_all(b64);
}
/**
 ***********************************************************************
 * @brief hmac_sha256_base64.c のメイン関数
 *
 * @retval 0 正常終了
 ***********************************************************************
 */
int main(void)
{
    const char key[] = "0123456789";
    const char data[] = "abcdefghijklmnopqrstuvwxyz";
    char out[EVP_MAX_MD_SIZE];
    int key_len, data_len, out_len;

    key_len = strlen(key);
    data_len = strlen(data);
    HMAC(EVP_sha256(), key, key_len, data, data_len, out, &out_len);

    printf("hmac_sha256 output:\n");
    printDump(out, out_len);
    base64(out, out_len);

    return 0;
}

crypto ライブラリをリンクするには gdi32 ライブラリが必要となる
Example: Makefile
CC = gcc
CFLAGS = -Wall
# rand_win.c で使われている CreateDCA, GetDeviceCaps などをリンクするために gdi32 ライブラリが必要
LDFLAGS = -lcrypto -lgdi32
TARGET = \
    hmac_sha256_base64.exe

.SUFFIXES: .exe .c .o

.c.o:
    $(CC) $(CFLAGS) -c -o $@ $<

.o.exe:
    $(CC) -o $@ $< $(LDFLAGS)

default: $(TARGET)

clean:
    rm -rf *.o *.exe

実行結果
> hmac_sha256_base64.exe
hmac_sha256 output:
c3 11 d8 1f d6 71 5e 27 b0 e3 87 7e b9 79 13 c3
1b 6a 7f 41 53 ad e5 2c 7a 42 1c d7 5e 7e 7c 65
Base64 output:
77 78 48 59 48 39 5a 78 58 69 65 77 34 34 64 2b
75 58 6b 54 77 78 74 71 66 30 46 54 72 65 55 73
65 6b 49 63 31 31 35 2b 66 47 55 3d 0a
Base64 output(char):
wxHYH9ZxXiew44d+uXkTwxtqf0FTreUsekIc115+fGU=

0 件のコメント:

コメントを投稿