]> pd.if.org Git - zpackage/blob - ocb3_test.c
a3e5062bb60c7d40a8209623267cf73991171a04
[zpackage] / ocb3_test.c
1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
2  *
3  * LibTomCrypt is a library that provides various cryptographic
4  * algorithms in a highly modular and flexible manner.
5  *
6  * The library is free for all purposes without any express
7  * guarantee it works.
8  */
9
10 /**
11    @file ocb3_test.c
12    OCB implementation, self-test by Tom St Denis
13 */
14 #include "tomcrypt.h"
15
16 #ifdef LTC_OCB3_MODE
17
18 /**
19    Test the OCB protocol
20    @return CRYPT_OK if successful
21 */
22 int ocb3_test(void)
23 {
24 #ifndef LTC_TEST
25    return CRYPT_NOP;
26 #else
27    /* test vectors from: http://tools.ietf.org/html/draft-krovetz-ocb-03 */
28    unsigned char key[16]   = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F };
29    unsigned char nonce[12] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B };
30    const struct {
31          int ptlen;
32          int aadlen;
33          unsigned char pt[64], aad[64], ct[64], tag[16];
34    } tests[] = {
35
36    { /* index:0 */
37      0, /* PLAINTEXT length */
38      0, /* AAD length */
39      { 0 }, /* PLAINTEXT */
40      { 0 }, /* AAD */
41      { 0 }, /* CIPHERTEXT */
42      { 0x19,0x7b,0x9c,0x3c,0x44,0x1d,0x3c,0x83,0xea,0xfb,0x2b,0xef,0x63,0x3b,0x91,0x82 }, /* TAG */
43    },
44    { /* index:1 */
45      8, /* PLAINTEXT length */
46      8, /* AAD length */
47      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07 }, /* PLAINTEXT */
48      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07 }, /* AAD */
49      { 0x92,0xb6,0x57,0x13,0x0a,0x74,0xb8,0x5a }, /* CIPHERTEXT */
50      { 0x16,0xdc,0x76,0xa4,0x6d,0x47,0xe1,0xea,0xd5,0x37,0x20,0x9e,0x8a,0x96,0xd1,0x4e }, /* TAG */
51    },
52    { /* index:2 */
53      0, /* PLAINTEXT length */
54      8, /* AAD length */
55      { 0 }, /* PLAINTEXT */
56      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07 }, /* AAD */
57      { 0 }, /* CIPHERTEXT */
58      { 0x98,0xb9,0x15,0x52,0xc8,0xc0,0x09,0x18,0x50,0x44,0xe3,0x0a,0x6e,0xb2,0xfe,0x21 }, /* TAG */
59    },
60    { /* index:3 */
61      8, /* PLAINTEXT length */
62      0, /* AAD length */
63      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07 }, /* PLAINTEXT */
64      { 0 }, /* AAD */
65      { 0x92,0xb6,0x57,0x13,0x0a,0x74,0xb8,0x5a }, /* CIPHERTEXT */
66      { 0x97,0x1e,0xff,0xca,0xe1,0x9a,0xd4,0x71,0x6f,0x88,0xe8,0x7b,0x87,0x1f,0xbe,0xed }, /* TAG */
67    },
68    { /* index:4 */
69      16, /* PLAINTEXT length */
70      16, /* AAD length */
71      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f }, /* PLAINTEXT */
72      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f }, /* AAD */
73      { 0xbe,0xa5,0xe8,0x79,0x8d,0xbe,0x71,0x10,0x03,0x1c,0x14,0x4d,0xa0,0xb2,0x61,0x22 }, /* CIPHERTEXT */
74      { 0x77,0x6c,0x99,0x24,0xd6,0x72,0x3a,0x1f,0xc4,0x52,0x45,0x32,0xac,0x3e,0x5b,0xeb }, /* TAG */
75    },
76    { /* index:5 */
77      0, /* PLAINTEXT length */
78      16, /* AAD length */
79      { 0 }, /* PLAINTEXT */
80      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f }, /* AAD */
81      { 0 }, /* CIPHERTEXT */
82      { 0x7d,0xdb,0x8e,0x6c,0xea,0x68,0x14,0x86,0x62,0x12,0x50,0x96,0x19,0xb1,0x9c,0xc6 }, /* TAG */
83    },
84    { /* index:6 */
85      16, /* PLAINTEXT length */
86      0, /* AAD length */
87      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f }, /* PLAINTEXT */
88      { 0 }, /* AAD */
89      { 0xbe,0xa5,0xe8,0x79,0x8d,0xbe,0x71,0x10,0x03,0x1c,0x14,0x4d,0xa0,0xb2,0x61,0x22 }, /* CIPHERTEXT */
90      { 0x13,0xcc,0x8b,0x74,0x78,0x07,0x12,0x1a,0x4c,0xbb,0x3e,0x4b,0xd6,0xb4,0x56,0xaf }, /* TAG */
91    },
92    { /* index:7 */
93      24, /* PLAINTEXT length */
94      24, /* AAD length */
95      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17 }, /* PLAINTEXT */
96      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17 }, /* AAD */
97      { 0xbe,0xa5,0xe8,0x79,0x8d,0xbe,0x71,0x10,0x03,0x1c,0x14,0x4d,0xa0,0xb2,0x61,0x22,0xfc,0xfc,0xee,0x7a,0x2a,0x8d,0x4d,0x48 }, /* CIPHERTEXT */
98      { 0x5f,0xa9,0x4f,0xc3,0xf3,0x88,0x20,0xf1,0xdc,0x3f,0x3d,0x1f,0xd4,0xe5,0x5e,0x1c }, /* TAG */
99    },
100    { /* index:8 */
101      0, /* PLAINTEXT length */
102      24, /* AAD length */
103      { 0 }, /* PLAINTEXT */
104      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17 }, /* AAD */
105      { 0 }, /* CIPHERTEXT */
106      { 0x28,0x20,0x26,0xda,0x30,0x68,0xbc,0x9f,0xa1,0x18,0x68,0x1d,0x55,0x9f,0x10,0xf6 }, /* TAG */
107    },
108    { /* index:9 */
109      24, /* PLAINTEXT length */
110      0, /* AAD length */
111      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17 }, /* PLAINTEXT */
112      { 0 }, /* AAD */
113      { 0xbe,0xa5,0xe8,0x79,0x8d,0xbe,0x71,0x10,0x03,0x1c,0x14,0x4d,0xa0,0xb2,0x61,0x22,0xfc,0xfc,0xee,0x7a,0x2a,0x8d,0x4d,0x48 }, /* CIPHERTEXT */
114      { 0x6e,0xf2,0xf5,0x25,0x87,0xfd,0xa0,0xed,0x97,0xdc,0x7e,0xed,0xe2,0x41,0xdf,0x68 }, /* TAG */
115    },
116    { /* index:10 */
117      32, /* PLAINTEXT length */
118      32, /* AAD length */
119      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f }, /* PLAINTEXT */
120      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f }, /* AAD */
121      { 0xbe,0xa5,0xe8,0x79,0x8d,0xbe,0x71,0x10,0x03,0x1c,0x14,0x4d,0xa0,0xb2,0x61,0x22,0xce,0xaa,0xb9,0xb0,0x5d,0xf7,0x71,0xa6,0x57,0x14,0x9d,0x53,0x77,0x34,0x63,0xcb }, /* CIPHERTEXT */
122      { 0xb2,0xa0,0x40,0xdd,0x3b,0xd5,0x16,0x43,0x72,0xd7,0x6d,0x7b,0xb6,0x82,0x42,0x40 }, /* TAG */
123    },
124    { /* index:11 */
125      0, /* PLAINTEXT length */
126      32, /* AAD length */
127      { 0 }, /* PLAINTEXT */
128      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f }, /* AAD */
129      { 0 }, /* CIPHERTEXT */
130      { 0xe1,0xe0,0x72,0x63,0x3b,0xad,0xe5,0x1a,0x60,0xe8,0x59,0x51,0xd9,0xc4,0x2a,0x1b }, /* TAG */
131    },
132    { /* index:12 */
133      32, /* PLAINTEXT length */
134      0, /* AAD length */
135      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f }, /* PLAINTEXT */
136      { 0 }, /* AAD */
137      { 0xbe,0xa5,0xe8,0x79,0x8d,0xbe,0x71,0x10,0x03,0x1c,0x14,0x4d,0xa0,0xb2,0x61,0x22,0xce,0xaa,0xb9,0xb0,0x5d,0xf7,0x71,0xa6,0x57,0x14,0x9d,0x53,0x77,0x34,0x63,0xcb }, /* CIPHERTEXT */
138      { 0x4a,0x3b,0xae,0x82,0x44,0x65,0xcf,0xda,0xf8,0xc4,0x1f,0xc5,0x0c,0x7d,0xf9,0xd9 }, /* TAG */
139    },
140    { /* index:13 */
141      40, /* PLAINTEXT length */
142      40, /* AAD length */
143      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27 }, /* PLAINTEXT */
144      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27 }, /* AAD */
145      { 0xbe,0xa5,0xe8,0x79,0x8d,0xbe,0x71,0x10,0x03,0x1c,0x14,0x4d,0xa0,0xb2,0x61,0x22,0xce,0xaa,0xb9,0xb0,0x5d,0xf7,0x71,0xa6,0x57,0x14,0x9d,0x53,0x77,0x34,0x63,0xcb,0x68,0xc6,0x57,0x78,0xb0,0x58,0xa6,0x35 }, /* CIPHERTEXT */
146      { 0x65,0x9c,0x62,0x32,0x11,0xde,0xea,0x0d,0xe3,0x0d,0x2c,0x38,0x18,0x79,0xf4,0xc8 }, /* TAG */
147    },
148    { /* index:14 */
149      0, /* PLAINTEXT length */
150      40, /* AAD length */
151      { 0 }, /* PLAINTEXT */
152      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27 }, /* AAD */
153      { 0 }, /* CIPHERTEXT */
154      { 0x7a,0xeb,0x7a,0x69,0xa1,0x68,0x7d,0xd0,0x82,0xca,0x27,0xb0,0xd9,0xa3,0x70,0x96 }, /* TAG */
155    },
156    { /* index:15 */
157      40, /* PLAINTEXT length */
158      0, /* AAD length */
159      { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27 }, /* PLAINTEXT */
160      { 0 }, /* AAD */
161      { 0xbe,0xa5,0xe8,0x79,0x8d,0xbe,0x71,0x10,0x03,0x1c,0x14,0x4d,0xa0,0xb2,0x61,0x22,0xce,0xaa,0xb9,0xb0,0x5d,0xf7,0x71,0xa6,0x57,0x14,0x9d,0x53,0x77,0x34,0x63,0xcb,0x68,0xc6,0x57,0x78,0xb0,0x58,0xa6,0x35 }, /* CIPHERTEXT */
162      { 0x06,0x0c,0x84,0x67,0xf4,0xab,0xab,0x5e,0x8b,0x3c,0x20,0x67,0xa2,0xe1,0x15,0xdc }, /* TAG */
163    },
164
165 };
166    /* As of RFC 7253 - 'Appendix A.  Sample Results'
167     *    The next tuple shows a result with a tag length of 96 bits and a
168    different key.
169
170      K: 0F0E0D0C0B0A09080706050403020100
171
172      N: BBAA9988776655443322110D
173      A: 000102030405060708090A0B0C0D0E0F1011121314151617
174         18191A1B1C1D1E1F2021222324252627
175      P: 000102030405060708090A0B0C0D0E0F1011121314151617
176         18191A1B1C1D1E1F2021222324252627
177      C: 1792A4E31E0755FB03E31B22116E6C2DDF9EFD6E33D536F1
178         A0124B0A55BAE884ED93481529C76B6AD0C515F4D1CDD4FD
179         AC4F02AA
180
181         The C has been split up in C and T (tag)
182     */
183    const unsigned char K[] = { 0x0F,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,0x08,
184                                0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00 };
185    const unsigned char N[] = { 0xBB,0xAA,0x99,0x88,0x77,0x66,0x55,0x44,
186                                0x33,0x22,0x11,0x0D };
187    const unsigned char A[] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
188                                0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
189                                0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
190                                0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
191                                0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27 };
192    const unsigned char P[] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
193                                0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
194                                0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
195                                0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
196                                0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27 };
197    const unsigned char C[] = { 0x17,0x92,0xA4,0xE3,0x1E,0x07,0x55,0xFB,
198                                0x03,0xE3,0x1B,0x22,0x11,0x6E,0x6C,0x2D,
199                                0xDF,0x9E,0xFD,0x6E,0x33,0xD5,0x36,0xF1,
200                                0xA0,0x12,0x4B,0x0A,0x55,0xBA,0xE8,0x84,
201                                0xED,0x93,0x48,0x15,0x29,0xC7,0x6B,0x6A };
202    const unsigned char T[] = { 0xD0,0xC5,0x15,0xF4,0xD1,0xCD,0xD4,0xFD,
203                                0xAC,0x4F,0x02,0xAA };
204
205    int err, x, idx, res;
206    unsigned long len;
207    unsigned char outct[MAXBLOCKSIZE]  = { 0 };
208    unsigned char outtag[MAXBLOCKSIZE] = { 0 };
209    ocb3_state ocb;
210
211     /* AES can be under rijndael or aes... try to find it */
212     if ((idx = find_cipher("aes")) == -1) {
213        if ((idx = find_cipher("rijndael")) == -1) {
214           return CRYPT_NOP;
215        }
216     }
217
218     for (x = 0; x < (int)(sizeof(tests)/sizeof(tests[0])); x++) {
219         len = 16; /* must be the same as the required taglen */
220         if ((err = ocb3_encrypt_authenticate_memory(idx,
221                                                    key, sizeof(key),
222                                                    nonce, sizeof(nonce),
223                                                    tests[x].aadlen != 0 ? tests[x].aad : NULL, tests[x].aadlen,
224                                                    tests[x].ptlen != 0 ? tests[x].pt : NULL, tests[x].ptlen,
225                                                    tests[x].ptlen != 0 ? outct : NULL, outtag, &len)) != CRYPT_OK) {
226            return err;
227         }
228
229         if (compare_testvector(outtag, len, tests[x].tag, sizeof(tests[x].tag), "OCB3 Tag", x) ||
230               compare_testvector(outct, tests[x].ptlen, tests[x].ct, tests[x].ptlen, "OCB3 CT", x)) {
231            return CRYPT_FAIL_TESTVECTOR;
232         }
233
234         if ((err = ocb3_decrypt_verify_memory(idx,
235                                              key, sizeof(key),
236                                              nonce, sizeof(nonce),
237                                              tests[x].aadlen != 0 ? tests[x].aad : NULL, tests[x].aadlen,
238                                              tests[x].ptlen != 0 ? outct : NULL, tests[x].ptlen,
239                                              tests[x].ptlen != 0 ? outct : NULL, tests[x].tag, len, &res)) != CRYPT_OK) {
240            return err;
241         }
242         if ((res != 1) || compare_testvector(outct, tests[x].ptlen, tests[x].pt, tests[x].ptlen, "OCB3", x)) {
243 #ifdef LTC_TEST_DBG
244            printf("\n\nOCB3: Failure-decrypt - res = %d\n", res);
245 #endif
246            return CRYPT_FAIL_TESTVECTOR;
247         }
248     }
249
250     /* RFC 7253 - test vector with a tag length of 96 bits - part 1 */
251     x = 99;
252     len = 12;
253     if ((err = ocb3_encrypt_authenticate_memory(idx,
254                                                 K, sizeof(K),
255                                                 N, sizeof(N),
256                                                 A, sizeof(A),
257                                                 P, sizeof(P),
258                                                 outct, outtag, &len)) != CRYPT_OK) {
259        return err;
260     }
261
262     if (compare_testvector(outtag, len, T, sizeof(T), "OCB3 Tag", x) ||
263           compare_testvector(outct, sizeof(P), C, sizeof(C), "OCB3 CT", x)) {
264        return CRYPT_FAIL_TESTVECTOR;
265     }
266
267     if ((err = ocb3_decrypt_verify_memory(idx,
268                                           K, sizeof(K),
269                                           N, sizeof(N),
270                                           A, sizeof(A),
271                                           C, sizeof(C),
272                                           outct, T, sizeof(T), &res)) != CRYPT_OK) {
273        return err;
274     }
275     if ((res != 1) || compare_testvector(outct, sizeof(C), P, sizeof(P), "OCB3", x)) {
276 #ifdef LTC_TEST_DBG
277        printf("\n\nOCB3: Failure-decrypt - res = %d\n", res);
278 #endif
279        return CRYPT_FAIL_TESTVECTOR;
280     }
281
282     /* RFC 7253 - test vector with a tag length of 96 bits - part 2 */
283     x = 100;
284     if ((err = ocb3_init(&ocb, idx, K, sizeof(K), N, sizeof(N), 12)) != CRYPT_OK)  return err;
285     if ((err = ocb3_add_aad(&ocb, A, sizeof(A))) != CRYPT_OK)                      return err;
286     if ((err = ocb3_encrypt(&ocb, P, 32, outct)) != CRYPT_OK)                      return err;
287     if ((err = ocb3_encrypt_last(&ocb, P+32, sizeof(P)-32, outct+32)) != CRYPT_OK) return err;
288     len = sizeof(outtag); /* intentionally more than 12 */
289     if ((err = ocb3_done(&ocb, outtag, &len)) != CRYPT_OK)                         return err;
290     if (compare_testvector(outct, sizeof(P), C, sizeof(C), "OCB3 CT", x))          return CRYPT_FAIL_TESTVECTOR;
291     if (compare_testvector(outtag, len, T, sizeof(T), "OCB3 Tag.enc", x))          return CRYPT_FAIL_TESTVECTOR;
292     if ((err = ocb3_init(&ocb, idx, K, sizeof(K), N, sizeof(N), 12)) != CRYPT_OK)  return err;
293     if ((err = ocb3_add_aad(&ocb, A, sizeof(A))) != CRYPT_OK)                      return err;
294     if ((err = ocb3_decrypt(&ocb, C, 32, outct)) != CRYPT_OK)                      return err;
295     if ((err = ocb3_decrypt_last(&ocb, C+32, sizeof(C)-32, outct+32)) != CRYPT_OK) return err;
296     len = sizeof(outtag); /* intentionally more than 12 */
297     if ((err = ocb3_done(&ocb, outtag, &len)) != CRYPT_OK)                         return err;
298     if (compare_testvector(outct, sizeof(C), P, sizeof(P), "OCB3 PT", x))          return CRYPT_FAIL_TESTVECTOR;
299     if (compare_testvector(outtag, len, T, sizeof(T), "OCB3 Tag.dec", x))          return CRYPT_FAIL_TESTVECTOR;
300
301     return CRYPT_OK;
302 #endif /* LTC_TEST */
303 }
304
305 #endif /* LTC_OCB3_MODE */
306
307 /* ref:         $Format:%D$ */
308 /* git commit:  $Format:%H$ */
309 /* commit time: $Format:%ai$ */