• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include <stdio.h>
51 #include <stdlib.h>
52 #include <string.h>
53 
54 #include <openssl/poly1305.h>
55 
56 struct poly1305_test
57 	{
58 	const char *inputhex;
59 	const char *keyhex;
60 	const char *outhex;
61 	};
62 
63 static const struct poly1305_test poly1305_tests[] = {
64 	{
65 		"",
66 		"c8afaac331ee372cd6082de134943b174710130e9f6fea8d72293850a667d86c",
67 		"4710130e9f6fea8d72293850a667d86c",
68 	},
69 	{
70 		"48656c6c6f20776f726c6421",
71 		"746869732069732033322d62797465206b657920666f7220506f6c7931333035",
72 		"a6f745008f81c916a20dcc74eef2b2f0",
73 	},
74 	{
75 		"0000000000000000000000000000000000000000000000000000000000000000",
76 		"746869732069732033322d62797465206b657920666f7220506f6c7931333035",
77 		"49ec78090e481ec6c26b33b91ccc0307",
78 	},
79 	{
80 		"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
81 		"746869732069732033322d62797465206b657920666f7220506f6c7931333035",
82 		"da84bcab02676c38cdb015604274c2aa",
83 	},
84 };
85 
hex_digit(char h)86 static unsigned char hex_digit(char h)
87 	{
88 	if (h >= '0' && h <= '9')
89 		return h - '0';
90 	else if (h >= 'a' && h <= 'f')
91 		return h - 'a' + 10;
92 	else if (h >= 'A' && h <= 'F')
93 		return h - 'A' + 10;
94 	else
95 		abort();
96 	}
97 
hex_decode(unsigned char * out,const char * hex)98 static void hex_decode(unsigned char *out, const char* hex)
99 	{
100 	size_t j = 0;
101 
102 	while (*hex != 0)
103 		{
104 		unsigned char v = hex_digit(*hex++);
105 		v <<= 4;
106 		v |= hex_digit(*hex++);
107 		out[j++] = v;
108 		}
109 	}
110 
hexdump(unsigned char * a,size_t len)111 static void hexdump(unsigned char *a, size_t len)
112 	{
113 	size_t i;
114 
115 	for (i = 0; i < len; i++)
116 		printf("%02x", a[i]);
117 	}
118 
main()119 int main()
120 	{
121 	static const unsigned num_tests =
122 		sizeof(poly1305_tests) / sizeof(struct poly1305_test);
123 	unsigned i;
124 	unsigned char key[32], out[16], expected[16];
125 	poly1305_state poly1305;
126 
127 	for (i = 0; i < num_tests; i++)
128 		{
129 		const struct poly1305_test *test = &poly1305_tests[i];
130 		unsigned char *in;
131 		size_t inlen = strlen(test->inputhex);
132 
133 		if (strlen(test->keyhex) != sizeof(key)*2 ||
134 		    strlen(test->outhex) != sizeof(out)*2 ||
135 		    (inlen & 1) == 1)
136 			return 1;
137 
138 		inlen /= 2;
139 
140 		hex_decode(key, test->keyhex);
141 		hex_decode(expected, test->outhex);
142 
143 		in = malloc(inlen);
144 
145 		hex_decode(in, test->inputhex);
146 		CRYPTO_poly1305_init(&poly1305, key);
147 		CRYPTO_poly1305_update(&poly1305, in, inlen);
148 		CRYPTO_poly1305_finish(&poly1305, out);
149 
150 		if (memcmp(out, expected, sizeof(expected)) != 0)
151 			{
152 			printf("Poly1305 test #%d failed.\n", i);
153 			printf("got:      ");
154 			hexdump(out, sizeof(out));
155 			printf("\nexpected: ");
156 			hexdump(expected, sizeof(expected));
157 			printf("\n");
158 			return 1;
159 			}
160 
161 		free(in);
162 		}
163 
164 	printf("PASS\n");
165 	return 0;
166 	}
167