1/* ripemd160_check.c Copyright (C) 2004 Pat Thoyts <patthoyts@users.sf.net> 2 * 3 * Generate test data to permit comparison of the tcl implementation of 4 * RIPE-MD160 against the OpenSSL library implementation. 5 * 6 * usage: ripemd_test 7 * 8 * $Id: ripemd160_test.c,v 1.1 2004/12/03 12:03:33 patthoyts Exp $ 9 */ 10 11#include <stdlib.h> 12#include <stdio.h> 13#include <string.h> 14#include <openssl/ripemd.h> 15#include <openssl/hmac.h> 16 17static const char rcsid[] = 18"$Id: ripemd160_test.c,v 1.1 2004/12/03 12:03:33 patthoyts Exp $"; 19 20typedef unsigned char uchar; 21 22typedef struct { 23 size_t len; 24 const uchar *dat; 25} vector_t; 26 27typedef struct { 28 size_t keylen; 29 const uchar *key; 30 size_t len; 31 const uchar *dat; 32} hvector_t; 33 34static const vector_t vectors[] = { 35 { 0, "" }, 36 { 1, "a" }, 37 { 3, "abc" }, 38 { 14, "message digest" }, 39 { 26, "abcdefghijklmnopqrstuvwxyz" }, 40 { 56, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" }, 41 { 62, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, 42 { 1, "-" }, 43 { 6, "-error" } 44}; 45 46static const uchar U0[] = {0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, 47 0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b}; 48static const uchar U1[] = {0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 49 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa}; 50static const uchar U2[] = {0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd, 51 0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd, 52 0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd, 53 0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd, 54 0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd}; 55static const uchar U3[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a, 56 0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14, 57 0x15,0x16,0x17,0x18,0x19}; 58static const uchar U4[] = {0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd, 59 0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd, 60 0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd, 61 0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd, 62 0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd}; 63static const uchar U5[] = {0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, 64 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c}; 65static const uchar U6[] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99, 66 0xaa,0xbb,0xcc,0xdd,0xee,0xff,0x01,0x23,0x45,0x67}; 67static const uchar U7[] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xfe,0xdc, 68 0xba,0x98,0x76,0x54,0x32,0x10,0x00,0x11,0x22,0x33}; 69 70static const hvector_t hvectors[] = { 71 { 20, U0, 8, "Hi There" }, 72 { 4, "Jefe", 28, "what do ya want for nothing?" }, 73 { 20, U1, 50, U2 }, 74 { 25, U3, 50, U4 }, 75 { 20, U5, 20, "Test With Truncation" }, 76}; 77 78static void 79digest(const char *data, size_t len, unsigned char *res) 80{ 81 RIPEMD160_CTX ctx; 82 RIPEMD160_Init(&ctx); 83 RIPEMD160_Update(&ctx, data, len); 84 RIPEMD160_Final(res, &ctx); 85} 86 87static void 88hmac(const unsigned char *data, size_t len, 89 const unsigned char *key, size_t keylen, 90 unsigned char *res, size_t *reslen) 91{ 92 /* 93 HMAC_CTX ctx; 94 HMAC_CTX_init(&ctx); 95 HMAC_Init(&ctx, key, keylen, EVP_ripemd160()); 96 HMAC_Update(&ctx, data, len); 97 HMAC_Final(&ctx, res, reslen); 98 */ 99 HMAC(EVP_ripemd160(), key, keylen, data, len, res, reslen); 100} 101 102static void 103dump(unsigned char *data, size_t len) 104{ 105 char buf[80], *p; 106 size_t cn, n; 107 108 for (cn = 0, p = buf; cn < len; cn++, p += 2) { 109 n = sprintf(p, "%02X", data[cn]); 110 } 111 puts(buf); 112} 113 114int 115main(int argc, char *argv[]) 116{ 117 size_t n; 118 size_t hashlen = 20; 119 unsigned char hash[EVP_MAX_MD_SIZE]; 120 121 puts("RIPEMD-160 digests (tcllib tests)"); 122 for (n = 0; n < sizeof(vectors)/sizeof(vectors[0]); n++) { 123 digest(vectors[n].dat, vectors[n].len, hash); 124 printf("HASH %2u: ", n+1); 125 dump(hash, hashlen); 126 } 127 128 puts("HMAC-RIPEMD-160 digests (tcllib test key 1)"); 129 for (n = 0; n < sizeof(vectors)/sizeof(vectors[0]); n++) { 130 hmac(vectors[n].dat, vectors[n].len, U6, 20, hash, &hashlen); 131 printf("HMAC %2u: ", n+1); 132 dump(hash, hashlen); 133 } 134 135 puts("HMAC-RIPEMD-160 digests (tcllib test key 2)"); 136 for (n = 0; n < sizeof(vectors)/sizeof(vectors[0]); n++) { 137 hmac(vectors[n].dat, vectors[n].len, U7, 20, hash, &hashlen); 138 printf("HMAC %2u: ", n+1); 139 dump(hash, hashlen); 140 } 141 142 puts("RFC2286 HMAC-RIPEMD-160 test vectors"); 143 for (n = 0; n < sizeof(hvectors)/sizeof(hvectors[0]); n++) { 144 hmac(hvectors[n].dat, hvectors[n].len, 145 hvectors[n].key, hvectors[n].keylen, 146 hash, &hashlen); 147 printf("HMAC %2u: ", n+1); 148 dump(hash, hashlen); 149 } 150 151 return 0; 152} 153 154/* 155 * Local variables: 156 * mode: c 157 * indent-tabs-mode: nil 158 * End: 159 */ 160