chacha20poly1305
[openssl.git] / crypto / poly1305 / poly1305test.c
1 /* ====================================================================
2  * Copyright (c) 2011-2013 The OpenSSL Project.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in
13  *    the documentation and/or other materials provided with the
14  *    distribution.
15  *
16  * 3. All advertising materials mentioning features or use of this
17  *    software must display the following acknowledgment:
18  *    "This product includes software developed by the OpenSSL Project
19  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
20  *
21  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
22  *    endorse or promote products derived from this software without
23  *    prior written permission. For written permission, please contact
24  *    licensing@OpenSSL.org.
25  *
26  * 5. Products derived from this software may not be called "OpenSSL"
27  *    nor may "OpenSSL" appear in their names without prior written
28  *    permission of the OpenSSL Project.
29  *
30  * 6. Redistributions of any form whatsoever must retain the following
31  *    acknowledgment:
32  *    "This product includes software developed by the OpenSSL Project
33  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
34  *
35  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
36  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
39  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
44  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
45  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
46  * OF THE POSSIBILITY OF SUCH DAMAGE.
47  * ====================================================================
48  */
49
50 #ifndef OPENSSL_NO_POLY1305
51
52 #include <stdio.h>
53 #include <stdlib.h>
54 #include <string.h>
55
56 #include <openssl/poly1305.h>
57
58 struct poly1305_test
59         {
60         const char *inputhex;
61         const char *keyhex;
62         const char *outhex;
63         };
64
65 static const struct poly1305_test poly1305_tests[] = {
66         {
67                 "",
68                 "c8afaac331ee372cd6082de134943b174710130e9f6fea8d72293850a667d86c",
69                 "4710130e9f6fea8d72293850a667d86c",
70         },
71         {
72                 "48656c6c6f20776f726c6421",
73                 "746869732069732033322d62797465206b657920666f7220506f6c7931333035",
74                 "a6f745008f81c916a20dcc74eef2b2f0",
75         },
76         {
77                 "0000000000000000000000000000000000000000000000000000000000000000",
78                 "746869732069732033322d62797465206b657920666f7220506f6c7931333035",
79                 "49ec78090e481ec6c26b33b91ccc0307",
80         },
81 };
82
83 static unsigned char hex_digit(char h)
84         {
85         if (h >= '0' && h <= '9')
86                 return h - '0';
87         else if (h >= 'a' && h <= 'f')
88                 return h - 'a' + 10;
89         else if (h >= 'A' && h <= 'F')
90                 return h - 'A' + 10;
91         else
92                 abort();
93         }
94
95 static void hex_decode(unsigned char *out, const char* hex)
96         {
97         size_t j = 0;
98
99         while (*hex != 0)
100                 {
101                 unsigned char v = hex_digit(*hex++);
102                 v <<= 4;
103                 v |= hex_digit(*hex++);
104                 out[j++] = v;
105                 }
106         }
107
108 static void hexdump(unsigned char *a, size_t len)
109         {
110         size_t i;
111
112         for (i = 0; i < len; i++)
113                 printf("%02x", a[i]);
114         }
115
116 int main()
117         {
118         static const unsigned num_tests =
119                 sizeof(poly1305_tests) / sizeof(struct poly1305_test);
120         unsigned i;
121         unsigned char key[32], out[16], expected[16];
122         poly1305_state poly1305;
123
124         for (i = 0; i < num_tests; i++)
125                 {
126                 const struct poly1305_test *test = &poly1305_tests[i];
127                 unsigned char *in;
128                 size_t inlen = strlen(test->inputhex);
129
130                 if (strlen(test->keyhex) != sizeof(key)*2 ||
131                     strlen(test->outhex) != sizeof(out)*2 ||
132                     (inlen & 1) == 1)
133                         return 1;
134
135                 inlen /= 2;
136
137                 hex_decode(key, test->keyhex);
138                 hex_decode(expected, test->outhex);
139
140                 in = malloc(inlen);
141
142                 hex_decode(in, test->inputhex);
143                 CRYPTO_poly1305_init(&poly1305, key);
144                 CRYPTO_poly1305_update(&poly1305, in, inlen);
145                 CRYPTO_poly1305_finish(&poly1305, out);
146
147                 if (memcmp(out, expected, sizeof(expected)) != 0)
148                         {
149                         printf("Poly1305 test #%d failed.\n", i);
150                         printf("got:      ");
151                         hexdump(out, sizeof(out));
152                         printf("\nexpected: ");
153                         hexdump(expected, sizeof(expected));
154                         printf("\n");
155                         return 1;
156                         }
157
158                 free(in);
159                 }
160
161         printf("PASS\n");
162         return 0;
163         }
164
165 #else  /* OPENSSL_NO_POLY1305 */
166
167 int main() { return 0; }
168
169 #endif