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