ipsec: add support for chained buffers
[vpp.git] / src / plugins / unittest / crypto / rfc2202_hmac_md5.c
1 /*
2  * Copyright (c) 2019 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 /* Test vectors published in RFC2202 */
17
18 #include <vppinfra/clib.h>
19 #include <vnet/crypto/crypto.h>
20 #include <unittest/crypto/crypto.h>
21
22 static u8 md5_tc1_key[16] = {
23   0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
24   0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b
25 };
26
27 static char md5_tc1_data[8] = "Hi There";
28
29 static u8 md5_tc1_digest[] = {
30   0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c,
31   0x13, 0xf4, 0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d
32 };
33
34 /* *INDENT-OFF* */
35 UNITTEST_REGISTER_CRYPTO_TEST (rfc_2202_md5_tc1) = {
36   .name = "RFC2202 HMAC-MD5 TC1",
37   .alg = VNET_CRYPTO_ALG_HMAC_MD5,
38   .key = TEST_DATA (md5_tc1_key),
39   .plaintext = TEST_DATA (md5_tc1_data),
40   .digest = TEST_DATA (md5_tc1_digest),
41 };
42 /* *INDENT-ON* */
43
44 static char md5_tc2_key[4] = "Jefe";
45
46 static char md5_tc2_data[28] = "what do ya want for nothing?";
47
48 static u8 md5_tc2_digest[] = {
49   0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03,
50   0xea, 0xa8, 0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38,
51 };
52
53 /* *INDENT-OFF* */
54 UNITTEST_REGISTER_CRYPTO_TEST (rfc_2202_md5_tc2) = {
55   .name = "RFC2202 HMAC-MD5 TC2",
56   .alg = VNET_CRYPTO_ALG_HMAC_MD5,
57   .key = TEST_DATA (md5_tc2_key),
58   .plaintext = TEST_DATA (md5_tc2_data),
59   .digest = TEST_DATA (md5_tc2_digest),
60 };
61 /* *INDENT-ON* */
62
63 static char md5_tc3_key[16] = {
64   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
65   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
66 };
67
68 static char md5_tc3_data[50] = {
69   0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
70   0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
71   0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
72   0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
73   0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
74   0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
75   0xdd, 0xdd
76 };
77
78 static u8 md5_tc3_digest[] = {
79   0x56, 0xbe, 0x34, 0x52, 0x1d, 0x14, 0x4c, 0x88,
80   0xdb, 0xb8, 0xc7, 0x33, 0xf0, 0xe8, 0xb3, 0xf6,
81 };
82
83 /* *INDENT-OFF* */
84 UNITTEST_REGISTER_CRYPTO_TEST (rfc_2202_md5_tc3) = {
85   .name = "RFC2202 HMAC-MD5 TC3",
86   .alg = VNET_CRYPTO_ALG_HMAC_MD5,
87   .key = TEST_DATA (md5_tc3_key),
88   .plaintext = TEST_DATA (md5_tc3_data),
89   .digest = TEST_DATA (md5_tc3_digest),
90 };
91 /* *INDENT-ON* */
92
93 static u8 md5_tc4_key[25] = {
94   0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
95   0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
96   0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
97   0x19,
98 };
99
100 static u8 md5_tc4_data[50] = {
101   0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
102   0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
103   0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
104   0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
105   0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
106   0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
107   0xcd, 0xcd,
108 };
109
110 static u8 md5_tc4_digest[] = {
111   0x69, 0x7e, 0xaf, 0x0a, 0xca, 0x3a, 0x3a, 0xea,
112   0x3a, 0x75, 0x16, 0x47, 0x46, 0xff, 0xaa, 0x79,
113 };
114
115 /* *INDENT-OFF* */
116 UNITTEST_REGISTER_CRYPTO_TEST (rfc_2202_md5_tc4) = {
117   .name = "RFC2202 HMAC-MD5 TC4",
118   .alg = VNET_CRYPTO_ALG_HMAC_MD5,
119   .key = TEST_DATA (md5_tc4_key),
120   .plaintext = TEST_DATA (md5_tc4_data),
121   .digest = TEST_DATA (md5_tc4_digest),
122 };
123 /* *INDENT-ON* */
124
125 static u8 md5_tc5_key[16] = {
126   0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
127   0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
128 };
129
130 static char md5_tc5_data[20] = "Test With Truncation";
131
132 static u8 md5_tc5_digest[] = {
133   0x56, 0x46, 0x1e, 0xf2, 0x34, 0x2e, 0xdc, 0x00,
134   0xf9, 0xba, 0xb9, 0x95, 0x69, 0x0e, 0xfd, 0x4c,
135 };
136
137 /* *INDENT-OFF* */
138 UNITTEST_REGISTER_CRYPTO_TEST (rfc_2202_md5_tc5) = {
139   .name = "RFC2202 HMAC-MD5 TC5",
140   .alg = VNET_CRYPTO_ALG_HMAC_MD5,
141   .key = TEST_DATA (md5_tc5_key),
142   .plaintext = TEST_DATA (md5_tc5_data),
143   .digest = TEST_DATA (md5_tc5_digest),
144 };
145 /* *INDENT-ON* */
146
147 static u8 md5_tc6_key[80] = {
148   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
149   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
150   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
151   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
152   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
153   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
154   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
155   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
156   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
157   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
158 };
159
160 static char md5_tc6_data[54] =
161   "Test Using Larger Than Block-Size Key - Hash Key First";
162
163 static u8 md5_tc6_digest[] = {
164   0x6b, 0x1a, 0xb7, 0xfe, 0x4b, 0xd7, 0xbf, 0x8f,
165   0x0b, 0x62, 0xe6, 0xce, 0x61, 0xb9, 0xd0, 0xcd,
166 };
167
168 /* *INDENT-OFF* */
169 UNITTEST_REGISTER_CRYPTO_TEST (rfc_2202_md5_tc6) = {
170   .name = "RFC2202 HMAC-MD5 TC6",
171   .alg = VNET_CRYPTO_ALG_HMAC_MD5,
172   .key = TEST_DATA (md5_tc6_key),
173   .plaintext = TEST_DATA (md5_tc6_data),
174   .digest = TEST_DATA (md5_tc6_digest),
175 };
176 /* *INDENT-ON* */
177
178 static char md5_tc7_data[73] =
179   "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data";
180
181 static u8 md5_tc7_digest[] = {
182   0x6f, 0x63, 0x0f, 0xad, 0x67, 0xcd, 0xa0, 0xee,
183   0x1f, 0xb1, 0xf5, 0x62, 0xdb, 0x3a, 0xa5, 0x3e,
184 };
185
186 /* *INDENT-OFF* */
187 UNITTEST_REGISTER_CRYPTO_TEST (rfc_2202_md5_tc7) = {
188   .name = "RFC2202 HMAC-MD5 TC7",
189   .alg = VNET_CRYPTO_ALG_HMAC_MD5,
190   .key = TEST_DATA (md5_tc6_key),
191   .plaintext = TEST_DATA (md5_tc7_data),
192   .digest = TEST_DATA (md5_tc7_digest),
193 };
194
195 UNITTEST_REGISTER_CRYPTO_TEST (rfc_2202_md5_tc7_chained) = {
196   .name = "RFC2202 HMAC-MD5 TC7 [chained]",
197   .alg = VNET_CRYPTO_ALG_HMAC_MD5,
198   .key = TEST_DATA (md5_tc6_key),
199   .digest = TEST_DATA (md5_tc7_digest),
200   .is_chained = 1,
201   .pt_chunks = {
202     TEST_DATA_CHUNK (md5_tc7_data, 0, 40),
203     TEST_DATA_CHUNK (md5_tc7_data, 40, 33)
204   },
205 };
206 /* *INDENT-ON* */
207
208 /*
209  * fd.io coding-style-patch-verification: ON
210  *
211  * Local Variables:
212  * eval: (c-set-style "gnu")
213  * End:
214  */