5 * SPDX-License-Identifier: BSD-4-Clause
7 * Copyright (c) 2009 David McCullough <david.mccullough@securecomputing.com>
9 * Copyright (c) 2003-2007 Cavium Networks (support@cavium.com). All rights
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions are met:
14 * 1. Redistributions of source code must retain the above copyright notice,
15 * this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright notice,
17 * this list of conditions and the following disclaimer in the documentation
18 * and/or other materials provided with the distribution.
19 * 3. All advertising materials mentioning features or use of this software
20 * must display the following acknowledgement:
21 * This product includes software developed by Cavium Networks
22 * 4. Cavium Networks' name may not be used to endorse or promote products
23 * derived from this software without specific prior written permission.
25 * This Software, including technical data, may be subject to U.S. export
26 * control laws, including the U.S. Export Administration Act and its
27 * associated regulations, and may be subject to export or import regulations
28 * in other countries. You warrant that You will comply strictly in all
29 * respects with all such regulations and acknowledge that you have the
30 * responsibility to obtain licenses to export, re-export or import the
33 * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" AND
34 * WITH ALL FAULTS AND CAVIUM MAKES NO PROMISES, REPRESENTATIONS OR WARRANTIES,
35 * EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO THE
36 * SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR
37 * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM
38 * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE,
39 * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF
40 * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR
41 * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR
42 * PERFORMANCE OF THE SOFTWARE LIES WITH YOU.
44 /****************************************************************************/
46 #include <sys/cdefs.h>
47 __FBSDID("$FreeBSD$");
49 #include <sys/param.h>
50 #include <sys/systm.h>
51 #include <sys/kernel.h>
52 #include <sys/module.h>
53 #include <sys/malloc.h>
56 #include <opencrypto/cryptodev.h>
58 #include <contrib/octeon-sdk/cvmx.h>
60 #include <mips/cavium/cryptocteon/cryptocteonvar.h>
62 /****************************************************************************/
64 #define IOV_INIT(iov, ptr, idx, len) \
67 (ptr) = (iov)[(idx)].iov_base; \
68 (len) = (iov)[(idx)].iov_len; \
73 * It would be better if this were an IOV_READ/IOV_WRITE macro instead so
74 * that we could detect overflow before it happens rather than right after,
75 * which is especially bad since there is usually no IOV_CONSUME after the
76 * final read or write.
78 #define IOV_CONSUME(iov, ptr, idx, len) \
80 if ((len) > sizeof *(ptr)) { \
81 (len) -= sizeof *(ptr); \
84 if ((len) != sizeof *(ptr)) \
85 panic("%s: went past end of iovec.", __func__); \
87 (ptr) = (iov)[(idx)].iov_base; \
88 (len) = (iov)[(idx)].iov_len; \
92 #define ESP_HEADER_LENGTH 8
93 #define DES_CBC_IV_LENGTH 8
94 #define AES_CBC_IV_LENGTH 16
95 #define ESP_HMAC_LEN 12
97 #define ESP_HEADER_LENGTH 8
98 #define DES_CBC_IV_LENGTH 8
100 /****************************************************************************/
102 #define CVM_LOAD_SHA_UNIT(dat, next) { \
105 CVMX_MT_HSH_DAT (dat, 0); \
106 } else if (next == 1) { \
108 CVMX_MT_HSH_DAT (dat, 1); \
109 } else if (next == 2) { \
111 CVMX_MT_HSH_DAT (dat, 2); \
112 } else if (next == 3) { \
114 CVMX_MT_HSH_DAT (dat, 3); \
115 } else if (next == 4) { \
117 CVMX_MT_HSH_DAT (dat, 4); \
118 } else if (next == 5) { \
120 CVMX_MT_HSH_DAT (dat, 5); \
121 } else if (next == 6) { \
123 CVMX_MT_HSH_DAT (dat, 6); \
125 CVMX_MT_HSH_STARTSHA (dat); \
130 #define CVM_LOAD2_SHA_UNIT(dat1, dat2, next) { \
132 CVMX_MT_HSH_DAT (dat1, 0); \
133 CVMX_MT_HSH_DAT (dat2, 1); \
135 } else if (next == 1) { \
136 CVMX_MT_HSH_DAT (dat1, 1); \
137 CVMX_MT_HSH_DAT (dat2, 2); \
139 } else if (next == 2) { \
140 CVMX_MT_HSH_DAT (dat1, 2); \
141 CVMX_MT_HSH_DAT (dat2, 3); \
143 } else if (next == 3) { \
144 CVMX_MT_HSH_DAT (dat1, 3); \
145 CVMX_MT_HSH_DAT (dat2, 4); \
147 } else if (next == 4) { \
148 CVMX_MT_HSH_DAT (dat1, 4); \
149 CVMX_MT_HSH_DAT (dat2, 5); \
151 } else if (next == 5) { \
152 CVMX_MT_HSH_DAT (dat1, 5); \
153 CVMX_MT_HSH_DAT (dat2, 6); \
155 } else if (next == 6) { \
156 CVMX_MT_HSH_DAT (dat1, 6); \
157 CVMX_MT_HSH_STARTSHA (dat2); \
160 CVMX_MT_HSH_STARTSHA (dat1); \
161 CVMX_MT_HSH_DAT (dat2, 0); \
166 /****************************************************************************/
168 #define CVM_LOAD_MD5_UNIT(dat, next) { \
171 CVMX_MT_HSH_DAT (dat, 0); \
172 } else if (next == 1) { \
174 CVMX_MT_HSH_DAT (dat, 1); \
175 } else if (next == 2) { \
177 CVMX_MT_HSH_DAT (dat, 2); \
178 } else if (next == 3) { \
180 CVMX_MT_HSH_DAT (dat, 3); \
181 } else if (next == 4) { \
183 CVMX_MT_HSH_DAT (dat, 4); \
184 } else if (next == 5) { \
186 CVMX_MT_HSH_DAT (dat, 5); \
187 } else if (next == 6) { \
189 CVMX_MT_HSH_DAT (dat, 6); \
191 CVMX_MT_HSH_STARTMD5 (dat); \
196 #define CVM_LOAD2_MD5_UNIT(dat1, dat2, next) { \
198 CVMX_MT_HSH_DAT (dat1, 0); \
199 CVMX_MT_HSH_DAT (dat2, 1); \
201 } else if (next == 1) { \
202 CVMX_MT_HSH_DAT (dat1, 1); \
203 CVMX_MT_HSH_DAT (dat2, 2); \
205 } else if (next == 2) { \
206 CVMX_MT_HSH_DAT (dat1, 2); \
207 CVMX_MT_HSH_DAT (dat2, 3); \
209 } else if (next == 3) { \
210 CVMX_MT_HSH_DAT (dat1, 3); \
211 CVMX_MT_HSH_DAT (dat2, 4); \
213 } else if (next == 4) { \
214 CVMX_MT_HSH_DAT (dat1, 4); \
215 CVMX_MT_HSH_DAT (dat2, 5); \
217 } else if (next == 5) { \
218 CVMX_MT_HSH_DAT (dat1, 5); \
219 CVMX_MT_HSH_DAT (dat2, 6); \
221 } else if (next == 6) { \
222 CVMX_MT_HSH_DAT (dat1, 6); \
223 CVMX_MT_HSH_STARTMD5 (dat2); \
226 CVMX_MT_HSH_STARTMD5 (dat1); \
227 CVMX_MT_HSH_DAT (dat2, 0); \
232 /****************************************************************************/
235 octo_calc_hash(uint8_t auth, unsigned char *key, uint64_t *inner, uint64_t *outer)
237 uint8_t hash_key[64];
239 register uint64_t xor1 = 0x3636363636363636ULL;
240 register uint64_t xor2 = 0x5c5c5c5c5c5c5c5cULL;
242 dprintf("%s()\n", __func__);
244 memset(hash_key, 0, sizeof(hash_key));
245 memcpy(hash_key, (uint8_t *) key, (auth ? 20 : 16));
246 key1 = (uint64_t *) hash_key;
248 CVMX_MT_HSH_IV(0x67452301EFCDAB89ULL, 0);
249 CVMX_MT_HSH_IV(0x98BADCFE10325476ULL, 1);
250 CVMX_MT_HSH_IV(0xC3D2E1F000000000ULL, 2);
252 CVMX_MT_HSH_IV(0x0123456789ABCDEFULL, 0);
253 CVMX_MT_HSH_IV(0xFEDCBA9876543210ULL, 1);
256 CVMX_MT_HSH_DAT((*key1 ^ xor1), 0);
258 CVMX_MT_HSH_DAT((*key1 ^ xor1), 1);
260 CVMX_MT_HSH_DAT((*key1 ^ xor1), 2);
262 CVMX_MT_HSH_DAT((*key1 ^ xor1), 3);
264 CVMX_MT_HSH_DAT((*key1 ^ xor1), 4);
266 CVMX_MT_HSH_DAT((*key1 ^ xor1), 5);
268 CVMX_MT_HSH_DAT((*key1 ^ xor1), 6);
271 CVMX_MT_HSH_STARTSHA((*key1 ^ xor1));
273 CVMX_MT_HSH_STARTMD5((*key1 ^ xor1));
275 CVMX_MF_HSH_IV(inner[0], 0);
276 CVMX_MF_HSH_IV(inner[1], 1);
279 CVMX_MF_HSH_IV(((uint64_t *) inner)[2], 2);
282 memset(hash_key, 0, sizeof(hash_key));
283 memcpy(hash_key, (uint8_t *) key, (auth ? 20 : 16));
284 key1 = (uint64_t *) hash_key;
286 CVMX_MT_HSH_IV(0x67452301EFCDAB89ULL, 0);
287 CVMX_MT_HSH_IV(0x98BADCFE10325476ULL, 1);
288 CVMX_MT_HSH_IV(0xC3D2E1F000000000ULL, 2);
290 CVMX_MT_HSH_IV(0x0123456789ABCDEFULL, 0);
291 CVMX_MT_HSH_IV(0xFEDCBA9876543210ULL, 1);
294 CVMX_MT_HSH_DAT((*key1 ^ xor2), 0);
296 CVMX_MT_HSH_DAT((*key1 ^ xor2), 1);
298 CVMX_MT_HSH_DAT((*key1 ^ xor2), 2);
300 CVMX_MT_HSH_DAT((*key1 ^ xor2), 3);
302 CVMX_MT_HSH_DAT((*key1 ^ xor2), 4);
304 CVMX_MT_HSH_DAT((*key1 ^ xor2), 5);
306 CVMX_MT_HSH_DAT((*key1 ^ xor2), 6);
309 CVMX_MT_HSH_STARTSHA((*key1 ^ xor2));
311 CVMX_MT_HSH_STARTMD5((*key1 ^ xor2));
313 CVMX_MF_HSH_IV(outer[0], 0);
314 CVMX_MF_HSH_IV(outer[1], 1);
317 CVMX_MF_HSH_IV(outer[2], 2);
322 /****************************************************************************/
326 octo_des_cbc_encrypt(
327 struct octo_sess *od,
328 struct iovec *iov, size_t iovcnt, size_t iovlen,
329 int auth_off, int auth_len,
330 int crypt_off, int crypt_len,
331 int icv_off, uint8_t *ivp)
336 dprintf("%s()\n", __func__);
338 if (__predict_false(od == NULL || iov==NULL || iovlen==0 || ivp==NULL ||
339 (crypt_off & 0x7) || (crypt_off + crypt_len > iovlen))) {
340 dprintf("%s: Bad parameters od=%p iov=%p iovlen=%jd "
341 "auth_off=%d auth_len=%d crypt_off=%d crypt_len=%d "
342 "icv_off=%d ivp=%p\n", __func__, od, iov, iovlen,
343 auth_off, auth_len, crypt_off, crypt_len, icv_off, ivp);
347 IOV_INIT(iov, data, data_i, data_l);
350 CVMX_PREFETCH0(od->octo_enckey);
354 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
355 if (od->octo_encklen == 24) {
356 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
357 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
358 } else if (od->octo_encklen == 8) {
359 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 1);
360 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 2);
362 dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
366 CVMX_MT_3DES_IV(* (uint64_t *) ivp);
368 while (crypt_off > 0) {
369 IOV_CONSUME(iov, data, data_i, data_l);
373 while (crypt_len > 0) {
374 CVMX_MT_3DES_ENC_CBC(*data);
375 CVMX_MF_3DES_RESULT(*data);
376 IOV_CONSUME(iov, data, data_i, data_l);
385 octo_des_cbc_decrypt(
386 struct octo_sess *od,
387 struct iovec *iov, size_t iovcnt, size_t iovlen,
388 int auth_off, int auth_len,
389 int crypt_off, int crypt_len,
390 int icv_off, uint8_t *ivp)
395 dprintf("%s()\n", __func__);
397 if (__predict_false(od == NULL || iov==NULL || iovlen==0 || ivp==NULL ||
398 (crypt_off & 0x7) || (crypt_off + crypt_len > iovlen))) {
399 dprintf("%s: Bad parameters od=%p iov=%p iovlen=%jd "
400 "auth_off=%d auth_len=%d crypt_off=%d crypt_len=%d "
401 "icv_off=%d ivp=%p\n", __func__, od, iov, iovlen,
402 auth_off, auth_len, crypt_off, crypt_len, icv_off, ivp);
406 IOV_INIT(iov, data, data_i, data_l);
409 CVMX_PREFETCH0(od->octo_enckey);
412 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
413 if (od->octo_encklen == 24) {
414 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
415 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
416 } else if (od->octo_encklen == 8) {
417 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 1);
418 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 2);
420 dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
424 CVMX_MT_3DES_IV(* (uint64_t *) ivp);
426 while (crypt_off > 0) {
427 IOV_CONSUME(iov, data, data_i, data_l);
431 while (crypt_len > 0) {
432 CVMX_MT_3DES_DEC_CBC(*data);
433 CVMX_MF_3DES_RESULT(*data);
434 IOV_CONSUME(iov, data, data_i, data_l);
441 /****************************************************************************/
445 octo_aes_cbc_encrypt(
446 struct octo_sess *od,
447 struct iovec *iov, size_t iovcnt, size_t iovlen,
448 int auth_off, int auth_len,
449 int crypt_off, int crypt_len,
450 int icv_off, uint8_t *ivp)
452 uint64_t *data, *pdata;
455 dprintf("%s()\n", __func__);
457 if (__predict_false(od == NULL || iov==NULL || iovlen==0 || ivp==NULL ||
458 (crypt_off & 0x7) || (crypt_off + crypt_len > iovlen))) {
459 dprintf("%s: Bad parameters od=%p iov=%p iovlen=%jd "
460 "auth_off=%d auth_len=%d crypt_off=%d crypt_len=%d "
461 "icv_off=%d ivp=%p\n", __func__, od, iov, iovlen,
462 auth_off, auth_len, crypt_off, crypt_len, icv_off, ivp);
466 IOV_INIT(iov, data, data_i, data_l);
469 CVMX_PREFETCH0(od->octo_enckey);
472 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
473 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
475 if (od->octo_encklen == 16) {
476 CVMX_MT_AES_KEY(0x0, 2);
477 CVMX_MT_AES_KEY(0x0, 3);
478 } else if (od->octo_encklen == 24) {
479 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
480 CVMX_MT_AES_KEY(0x0, 3);
481 } else if (od->octo_encklen == 32) {
482 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
483 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[3], 3);
485 dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
488 CVMX_MT_AES_KEYLENGTH(od->octo_encklen / 8 - 1);
490 CVMX_MT_AES_IV(((uint64_t *) ivp)[0], 0);
491 CVMX_MT_AES_IV(((uint64_t *) ivp)[1], 1);
493 while (crypt_off > 0) {
494 IOV_CONSUME(iov, data, data_i, data_l);
498 while (crypt_len > 0) {
500 CVMX_MT_AES_ENC_CBC0(*data);
501 IOV_CONSUME(iov, data, data_i, data_l);
502 CVMX_MT_AES_ENC_CBC1(*data);
503 CVMX_MF_AES_RESULT(*pdata, 0);
504 CVMX_MF_AES_RESULT(*data, 1);
505 IOV_CONSUME(iov, data, data_i, data_l);
514 octo_aes_cbc_decrypt(
515 struct octo_sess *od,
516 struct iovec *iov, size_t iovcnt, size_t iovlen,
517 int auth_off, int auth_len,
518 int crypt_off, int crypt_len,
519 int icv_off, uint8_t *ivp)
521 uint64_t *data, *pdata;
524 dprintf("%s()\n", __func__);
526 if (__predict_false(od == NULL || iov==NULL || iovlen==0 || ivp==NULL ||
527 (crypt_off & 0x7) || (crypt_off + crypt_len > iovlen))) {
528 dprintf("%s: Bad parameters od=%p iov=%p iovlen=%jd "
529 "auth_off=%d auth_len=%d crypt_off=%d crypt_len=%d "
530 "icv_off=%d ivp=%p\n", __func__, od, iov, iovlen,
531 auth_off, auth_len, crypt_off, crypt_len, icv_off, ivp);
535 IOV_INIT(iov, data, data_i, data_l);
538 CVMX_PREFETCH0(od->octo_enckey);
541 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
542 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
544 if (od->octo_encklen == 16) {
545 CVMX_MT_AES_KEY(0x0, 2);
546 CVMX_MT_AES_KEY(0x0, 3);
547 } else if (od->octo_encklen == 24) {
548 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
549 CVMX_MT_AES_KEY(0x0, 3);
550 } else if (od->octo_encklen == 32) {
551 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
552 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[3], 3);
554 dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
557 CVMX_MT_AES_KEYLENGTH(od->octo_encklen / 8 - 1);
559 CVMX_MT_AES_IV(((uint64_t *) ivp)[0], 0);
560 CVMX_MT_AES_IV(((uint64_t *) ivp)[1], 1);
562 while (crypt_off > 0) {
563 IOV_CONSUME(iov, data, data_i, data_l);
567 while (crypt_len > 0) {
569 CVMX_MT_AES_DEC_CBC0(*data);
570 IOV_CONSUME(iov, data, data_i, data_l);
571 CVMX_MT_AES_DEC_CBC1(*data);
572 CVMX_MF_AES_RESULT(*pdata, 0);
573 CVMX_MF_AES_RESULT(*data, 1);
574 IOV_CONSUME(iov, data, data_i, data_l);
581 /****************************************************************************/
585 octo_null_md5_encrypt(
586 struct octo_sess *od,
587 struct iovec *iov, size_t iovcnt, size_t iovlen,
588 int auth_off, int auth_len,
589 int crypt_off, int crypt_len,
590 int icv_off, uint8_t *ivp)
595 int data_i, data_l, alen = auth_len;
597 dprintf("%s()\n", __func__);
599 if (__predict_false(od == NULL || iov==NULL || iovlen==0 ||
600 (auth_off & 0x7) || (auth_off + auth_len > iovlen))) {
601 dprintf("%s: Bad parameters od=%p iov=%p iovlen=%jd "
602 "auth_off=%d auth_len=%d crypt_off=%d crypt_len=%d "
603 "icv_off=%d ivp=%p\n", __func__, od, iov, iovlen,
604 auth_off, auth_len, crypt_off, crypt_len, icv_off, ivp);
608 IOV_INIT(iov, data, data_i, data_l);
611 CVMX_MT_HSH_IV(od->octo_hminner[0], 0);
612 CVMX_MT_HSH_IV(od->octo_hminner[1], 1);
614 while (auth_off > 0) {
615 IOV_CONSUME(iov, data, data_i, data_l);
619 while (auth_len > 0) {
620 CVM_LOAD_MD5_UNIT(*data, next);
622 IOV_CONSUME(iov, data, data_i, data_l);
625 /* finish the hash */
626 CVMX_PREFETCH0(od->octo_hmouter);
628 if (__predict_false(inplen)) {
630 uint8_t *p = (uint8_t *) & tmp;
634 p[inplen] = ((uint8_t *) data)[inplen];
636 CVM_LOAD_MD5_UNIT(tmp, next);
638 CVM_LOAD_MD5_UNIT(0x8000000000000000ULL, next);
641 CVM_LOAD_MD5_UNIT(0x8000000000000000ULL, next);
644 /* Finish Inner hash */
646 CVM_LOAD_MD5_UNIT(((uint64_t) 0x0ULL), next);
648 CVMX_ES64(tmp1, ((alen + 64) << 3));
649 CVM_LOAD_MD5_UNIT(tmp1, next);
651 /* Get the inner hash of HMAC */
652 CVMX_MF_HSH_IV(tmp1, 0);
653 CVMX_MF_HSH_IV(tmp2, 1);
655 /* Initialize hash unit */
656 CVMX_MT_HSH_IV(od->octo_hmouter[0], 0);
657 CVMX_MT_HSH_IV(od->octo_hmouter[1], 1);
659 CVMX_MT_HSH_DAT(tmp1, 0);
660 CVMX_MT_HSH_DAT(tmp2, 1);
661 CVMX_MT_HSH_DAT(0x8000000000000000ULL, 2);
666 CVMX_ES64(tmp1, ((64 + 16) << 3));
667 CVMX_MT_HSH_STARTMD5(tmp1);
670 IOV_INIT(iov, data, data_i, data_l);
671 while (icv_off > 0) {
672 IOV_CONSUME(iov, data, data_i, data_l);
675 CVMX_MF_HSH_IV(*data, 0);
676 IOV_CONSUME(iov, data, data_i, data_l);
677 CVMX_MF_HSH_IV(tmp1, 1);
678 *(uint32_t *)data = (uint32_t) (tmp1 >> 32);
683 /****************************************************************************/
687 octo_null_sha1_encrypt(
688 struct octo_sess *od,
689 struct iovec *iov, size_t iovcnt, size_t iovlen,
690 int auth_off, int auth_len,
691 int crypt_off, int crypt_len,
692 int icv_off, uint8_t *ivp)
696 uint64_t tmp1, tmp2, tmp3;
697 int data_i, data_l, alen = auth_len;
699 dprintf("%s()\n", __func__);
701 if (__predict_false(od == NULL || iov==NULL || iovlen==0 ||
702 (auth_off & 0x7) || (auth_off + auth_len > iovlen))) {
703 dprintf("%s: Bad parameters od=%p iov=%p iovlen=%jd "
704 "auth_off=%d auth_len=%d crypt_off=%d crypt_len=%d "
705 "icv_off=%d ivp=%p\n", __func__, od, iov, iovlen,
706 auth_off, auth_len, crypt_off, crypt_len, icv_off, ivp);
710 IOV_INIT(iov, data, data_i, data_l);
713 CVMX_MT_HSH_IV(od->octo_hminner[0], 0);
714 CVMX_MT_HSH_IV(od->octo_hminner[1], 1);
715 CVMX_MT_HSH_IV(od->octo_hminner[2], 2);
717 while (auth_off > 0) {
718 IOV_CONSUME(iov, data, data_i, data_l);
722 while (auth_len > 0) {
723 CVM_LOAD_SHA_UNIT(*data, next);
725 IOV_CONSUME(iov, data, data_i, data_l);
728 /* finish the hash */
729 CVMX_PREFETCH0(od->octo_hmouter);
731 if (__predict_false(inplen)) {
733 uint8_t *p = (uint8_t *) & tmp;
737 p[inplen] = ((uint8_t *) data)[inplen];
739 CVM_LOAD_MD5_UNIT(tmp, next);
741 CVM_LOAD_MD5_UNIT(0x8000000000000000ULL, next);
744 CVM_LOAD_SHA_UNIT(0x8000000000000000ULL, next);
747 /* Finish Inner hash */
749 CVM_LOAD_SHA_UNIT(((uint64_t) 0x0ULL), next);
751 CVM_LOAD_SHA_UNIT((uint64_t) ((alen + 64) << 3), next);
753 /* Get the inner hash of HMAC */
754 CVMX_MF_HSH_IV(tmp1, 0);
755 CVMX_MF_HSH_IV(tmp2, 1);
757 CVMX_MF_HSH_IV(tmp3, 2);
759 /* Initialize hash unit */
760 CVMX_MT_HSH_IV(od->octo_hmouter[0], 0);
761 CVMX_MT_HSH_IV(od->octo_hmouter[1], 1);
762 CVMX_MT_HSH_IV(od->octo_hmouter[2], 2);
764 CVMX_MT_HSH_DAT(tmp1, 0);
765 CVMX_MT_HSH_DAT(tmp2, 1);
766 tmp3 |= 0x0000000080000000;
767 CVMX_MT_HSH_DAT(tmp3, 2);
772 CVMX_MT_HSH_STARTSHA((uint64_t) ((64 + 20) << 3));
775 IOV_INIT(iov, data, data_i, data_l);
776 while (icv_off > 0) {
777 IOV_CONSUME(iov, data, data_i, data_l);
780 CVMX_MF_HSH_IV(*data, 0);
781 IOV_CONSUME(iov, data, data_i, data_l);
782 CVMX_MF_HSH_IV(tmp1, 1);
783 *(uint32_t *)data = (uint32_t) (tmp1 >> 32);
788 /****************************************************************************/
792 octo_des_cbc_md5_encrypt(
793 struct octo_sess *od,
794 struct iovec *iov, size_t iovcnt, size_t iovlen,
795 int auth_off, int auth_len,
796 int crypt_off, int crypt_len,
797 int icv_off, uint8_t *ivp)
804 uint64_t *data = &mydata.data64[0];
807 int data_i, data_l, alen = auth_len;
809 dprintf("%s()\n", __func__);
811 if (__predict_false(od == NULL || iov==NULL || iovlen==0 || ivp==NULL ||
812 (crypt_off & 0x3) || (crypt_off + crypt_len > iovlen) ||
815 (auth_off & 0x3) || (auth_off + auth_len > iovlen))) {
816 dprintf("%s: Bad parameters od=%p iov=%p iovlen=%jd "
817 "auth_off=%d auth_len=%d crypt_off=%d crypt_len=%d "
818 "icv_off=%d ivp=%p\n", __func__, od, iov, iovlen,
819 auth_off, auth_len, crypt_off, crypt_len, icv_off, ivp);
823 IOV_INIT(iov, data32, data_i, data_l);
826 CVMX_PREFETCH0(od->octo_enckey);
829 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
830 if (od->octo_encklen == 24) {
831 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
832 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
833 } else if (od->octo_encklen == 8) {
834 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 1);
835 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 2);
837 dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
841 CVMX_MT_3DES_IV(* (uint64_t *) ivp);
844 CVMX_MT_HSH_IV(od->octo_hminner[0], 0);
845 CVMX_MT_HSH_IV(od->octo_hminner[1], 1);
847 while (crypt_off > 0 && auth_off > 0) {
848 IOV_CONSUME(iov, data32, data_i, data_l);
853 while (crypt_len > 0 || auth_len > 0) {
854 uint32_t *first = data32;
855 mydata.data32[0] = *first;
856 IOV_CONSUME(iov, data32, data_i, data_l);
857 mydata.data32[1] = *data32;
858 if (crypt_off <= 0) {
860 CVMX_MT_3DES_ENC_CBC(*data);
861 CVMX_MF_3DES_RESULT(*data);
868 CVM_LOAD_MD5_UNIT(*data, next);
873 *first = mydata.data32[0];
874 *data32 = mydata.data32[1];
875 IOV_CONSUME(iov, data32, data_i, data_l);
878 /* finish the hash */
879 CVMX_PREFETCH0(od->octo_hmouter);
881 if (__predict_false(inplen)) {
883 uint8_t *p = (uint8_t *) & tmp;
887 p[inplen] = ((uint8_t *) data)[inplen];
889 CVM_LOAD_MD5_UNIT(tmp, next);
891 CVM_LOAD_MD5_UNIT(0x8000000000000000ULL, next);
894 CVM_LOAD_MD5_UNIT(0x8000000000000000ULL, next);
897 /* Finish Inner hash */
899 CVM_LOAD_MD5_UNIT(((uint64_t) 0x0ULL), next);
901 CVMX_ES64(tmp1, ((alen + 64) << 3));
902 CVM_LOAD_MD5_UNIT(tmp1, next);
904 /* Get the inner hash of HMAC */
905 CVMX_MF_HSH_IV(tmp1, 0);
906 CVMX_MF_HSH_IV(tmp2, 1);
908 /* Initialize hash unit */
909 CVMX_MT_HSH_IV(od->octo_hmouter[0], 0);
910 CVMX_MT_HSH_IV(od->octo_hmouter[1], 1);
912 CVMX_MT_HSH_DAT(tmp1, 0);
913 CVMX_MT_HSH_DAT(tmp2, 1);
914 CVMX_MT_HSH_DAT(0x8000000000000000ULL, 2);
919 CVMX_ES64(tmp1, ((64 + 16) << 3));
920 CVMX_MT_HSH_STARTMD5(tmp1);
923 IOV_INIT(iov, data32, data_i, data_l);
924 while (icv_off > 0) {
925 IOV_CONSUME(iov, data32, data_i, data_l);
928 CVMX_MF_HSH_IV(tmp1, 0);
929 *data32 = (uint32_t) (tmp1 >> 32);
930 IOV_CONSUME(iov, data32, data_i, data_l);
931 *data32 = (uint32_t) tmp1;
932 IOV_CONSUME(iov, data32, data_i, data_l);
933 CVMX_MF_HSH_IV(tmp1, 1);
934 *data32 = (uint32_t) (tmp1 >> 32);
940 octo_des_cbc_md5_decrypt(
941 struct octo_sess *od,
942 struct iovec *iov, size_t iovcnt, size_t iovlen,
943 int auth_off, int auth_len,
944 int crypt_off, int crypt_len,
945 int icv_off, uint8_t *ivp)
952 uint64_t *data = &mydata.data64[0];
955 int data_i, data_l, alen = auth_len;
957 dprintf("%s()\n", __func__);
959 if (__predict_false(od == NULL || iov==NULL || iovlen==0 || ivp==NULL ||
960 (crypt_off & 0x3) || (crypt_off + crypt_len > iovlen) ||
963 (auth_off & 0x3) || (auth_off + auth_len > iovlen))) {
964 dprintf("%s: Bad parameters od=%p iov=%p iovlen=%jd "
965 "auth_off=%d auth_len=%d crypt_off=%d crypt_len=%d "
966 "icv_off=%d ivp=%p\n", __func__, od, iov, iovlen,
967 auth_off, auth_len, crypt_off, crypt_len, icv_off, ivp);
971 IOV_INIT(iov, data32, data_i, data_l);
974 CVMX_PREFETCH0(od->octo_enckey);
977 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
978 if (od->octo_encklen == 24) {
979 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
980 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
981 } else if (od->octo_encklen == 8) {
982 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 1);
983 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 2);
985 dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
989 CVMX_MT_3DES_IV(* (uint64_t *) ivp);
992 CVMX_MT_HSH_IV(od->octo_hminner[0], 0);
993 CVMX_MT_HSH_IV(od->octo_hminner[1], 1);
995 while (crypt_off > 0 && auth_off > 0) {
996 IOV_CONSUME(iov, data32, data_i, data_l);
1001 while (crypt_len > 0 || auth_len > 0) {
1002 uint32_t *first = data32;
1003 mydata.data32[0] = *first;
1004 IOV_CONSUME(iov, data32, data_i, data_l);
1005 mydata.data32[1] = *data32;
1006 if (auth_off <= 0) {
1008 CVM_LOAD_MD5_UNIT(*data, next);
1013 if (crypt_off <= 0) {
1014 if (crypt_len > 0) {
1015 CVMX_MT_3DES_DEC_CBC(*data);
1016 CVMX_MF_3DES_RESULT(*data);
1021 *first = mydata.data32[0];
1022 *data32 = mydata.data32[1];
1023 IOV_CONSUME(iov, data32, data_i, data_l);
1026 /* finish the hash */
1027 CVMX_PREFETCH0(od->octo_hmouter);
1029 if (__predict_false(inplen)) {
1031 uint8_t *p = (uint8_t *) & tmp;
1035 p[inplen] = ((uint8_t *) data)[inplen];
1037 CVM_LOAD_MD5_UNIT(tmp, next);
1039 CVM_LOAD_MD5_UNIT(0x8000000000000000ULL, next);
1042 CVM_LOAD_MD5_UNIT(0x8000000000000000ULL, next);
1045 /* Finish Inner hash */
1047 CVM_LOAD_MD5_UNIT(((uint64_t) 0x0ULL), next);
1049 CVMX_ES64(tmp1, ((alen + 64) << 3));
1050 CVM_LOAD_MD5_UNIT(tmp1, next);
1052 /* Get the inner hash of HMAC */
1053 CVMX_MF_HSH_IV(tmp1, 0);
1054 CVMX_MF_HSH_IV(tmp2, 1);
1056 /* Initialize hash unit */
1057 CVMX_MT_HSH_IV(od->octo_hmouter[0], 0);
1058 CVMX_MT_HSH_IV(od->octo_hmouter[1], 1);
1060 CVMX_MT_HSH_DAT(tmp1, 0);
1061 CVMX_MT_HSH_DAT(tmp2, 1);
1062 CVMX_MT_HSH_DAT(0x8000000000000000ULL, 2);
1063 CVMX_MT_HSH_DATZ(3);
1064 CVMX_MT_HSH_DATZ(4);
1065 CVMX_MT_HSH_DATZ(5);
1066 CVMX_MT_HSH_DATZ(6);
1067 CVMX_ES64(tmp1, ((64 + 16) << 3));
1068 CVMX_MT_HSH_STARTMD5(tmp1);
1071 IOV_INIT(iov, data32, data_i, data_l);
1072 while (icv_off > 0) {
1073 IOV_CONSUME(iov, data32, data_i, data_l);
1076 CVMX_MF_HSH_IV(tmp1, 0);
1077 *data32 = (uint32_t) (tmp1 >> 32);
1078 IOV_CONSUME(iov, data32, data_i, data_l);
1079 *data32 = (uint32_t) tmp1;
1080 IOV_CONSUME(iov, data32, data_i, data_l);
1081 CVMX_MF_HSH_IV(tmp1, 1);
1082 *data32 = (uint32_t) (tmp1 >> 32);
1087 /****************************************************************************/
1091 octo_des_cbc_sha1_encrypt(
1092 struct octo_sess *od,
1093 struct iovec *iov, size_t iovcnt, size_t iovlen,
1094 int auth_off, int auth_len,
1095 int crypt_off, int crypt_len,
1096 int icv_off, uint8_t *ivp)
1103 uint64_t *data = &mydata.data64[0];
1105 uint64_t tmp1, tmp2, tmp3;
1106 int data_i, data_l, alen = auth_len;
1108 dprintf("%s()\n", __func__);
1110 if (__predict_false(od == NULL || iov==NULL || iovlen==0 || ivp==NULL ||
1111 (crypt_off & 0x3) || (crypt_off + crypt_len > iovlen) ||
1112 (crypt_len & 0x7) ||
1114 (auth_off & 0x3) || (auth_off + auth_len > iovlen))) {
1115 dprintf("%s: Bad parameters od=%p iov=%p iovlen=%jd "
1116 "auth_off=%d auth_len=%d crypt_off=%d crypt_len=%d "
1117 "icv_off=%d ivp=%p\n", __func__, od, iov, iovlen,
1118 auth_off, auth_len, crypt_off, crypt_len, icv_off, ivp);
1122 IOV_INIT(iov, data32, data_i, data_l);
1124 CVMX_PREFETCH0(ivp);
1125 CVMX_PREFETCH0(od->octo_enckey);
1128 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
1129 if (od->octo_encklen == 24) {
1130 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
1131 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
1132 } else if (od->octo_encklen == 8) {
1133 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 1);
1134 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 2);
1136 dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
1140 CVMX_MT_3DES_IV(* (uint64_t *) ivp);
1143 CVMX_MT_HSH_IV(od->octo_hminner[0], 0);
1144 CVMX_MT_HSH_IV(od->octo_hminner[1], 1);
1145 CVMX_MT_HSH_IV(od->octo_hminner[2], 2);
1147 while (crypt_off > 0 && auth_off > 0) {
1148 IOV_CONSUME(iov, data32, data_i, data_l);
1153 while (crypt_len > 0 || auth_len > 0) {
1154 uint32_t *first = data32;
1155 mydata.data32[0] = *first;
1156 IOV_CONSUME(iov, data32, data_i, data_l);
1157 mydata.data32[1] = *data32;
1158 if (crypt_off <= 0) {
1159 if (crypt_len > 0) {
1160 CVMX_MT_3DES_ENC_CBC(*data);
1161 CVMX_MF_3DES_RESULT(*data);
1166 if (auth_off <= 0) {
1168 CVM_LOAD_SHA_UNIT(*data, next);
1173 *first = mydata.data32[0];
1174 *data32 = mydata.data32[1];
1175 IOV_CONSUME(iov, data32, data_i, data_l);
1178 /* finish the hash */
1179 CVMX_PREFETCH0(od->octo_hmouter);
1181 if (__predict_false(inplen)) {
1183 uint8_t *p = (uint8_t *) & tmp;
1187 p[inplen] = ((uint8_t *) data)[inplen];
1189 CVM_LOAD_SHA_UNIT(tmp, next);
1191 CVM_LOAD_SHA_UNIT(0x8000000000000000ULL, next);
1194 CVM_LOAD_SHA_UNIT(0x8000000000000000ULL, next);
1197 /* Finish Inner hash */
1199 CVM_LOAD_SHA_UNIT(((uint64_t) 0x0ULL), next);
1201 CVM_LOAD_SHA_UNIT((uint64_t) ((alen + 64) << 3), next);
1203 /* Get the inner hash of HMAC */
1204 CVMX_MF_HSH_IV(tmp1, 0);
1205 CVMX_MF_HSH_IV(tmp2, 1);
1207 CVMX_MF_HSH_IV(tmp3, 2);
1209 /* Initialize hash unit */
1210 CVMX_MT_HSH_IV(od->octo_hmouter[0], 0);
1211 CVMX_MT_HSH_IV(od->octo_hmouter[1], 1);
1212 CVMX_MT_HSH_IV(od->octo_hmouter[2], 2);
1214 CVMX_MT_HSH_DAT(tmp1, 0);
1215 CVMX_MT_HSH_DAT(tmp2, 1);
1216 tmp3 |= 0x0000000080000000;
1217 CVMX_MT_HSH_DAT(tmp3, 2);
1218 CVMX_MT_HSH_DATZ(3);
1219 CVMX_MT_HSH_DATZ(4);
1220 CVMX_MT_HSH_DATZ(5);
1221 CVMX_MT_HSH_DATZ(6);
1222 CVMX_MT_HSH_STARTSHA((uint64_t) ((64 + 20) << 3));
1225 IOV_INIT(iov, data32, data_i, data_l);
1226 while (icv_off > 0) {
1227 IOV_CONSUME(iov, data32, data_i, data_l);
1230 CVMX_MF_HSH_IV(tmp1, 0);
1231 *data32 = (uint32_t) (tmp1 >> 32);
1232 IOV_CONSUME(iov, data32, data_i, data_l);
1233 *data32 = (uint32_t) tmp1;
1234 IOV_CONSUME(iov, data32, data_i, data_l);
1235 CVMX_MF_HSH_IV(tmp1, 1);
1236 *data32 = (uint32_t) (tmp1 >> 32);
1242 octo_des_cbc_sha1_decrypt(
1243 struct octo_sess *od,
1244 struct iovec *iov, size_t iovcnt, size_t iovlen,
1245 int auth_off, int auth_len,
1246 int crypt_off, int crypt_len,
1247 int icv_off, uint8_t *ivp)
1254 uint64_t *data = &mydata.data64[0];
1256 uint64_t tmp1, tmp2, tmp3;
1257 int data_i, data_l, alen = auth_len;
1259 dprintf("%s()\n", __func__);
1261 if (__predict_false(od == NULL || iov==NULL || iovlen==0 || ivp==NULL ||
1262 (crypt_off & 0x3) || (crypt_off + crypt_len > iovlen) ||
1263 (crypt_len & 0x7) ||
1265 (auth_off & 0x3) || (auth_off + auth_len > iovlen))) {
1266 dprintf("%s: Bad parameters od=%p iov=%p iovlen=%jd "
1267 "auth_off=%d auth_len=%d crypt_off=%d crypt_len=%d "
1268 "icv_off=%d ivp=%p\n", __func__, od, iov, iovlen,
1269 auth_off, auth_len, crypt_off, crypt_len, icv_off, ivp);
1273 IOV_INIT(iov, data32, data_i, data_l);
1275 CVMX_PREFETCH0(ivp);
1276 CVMX_PREFETCH0(od->octo_enckey);
1279 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
1280 if (od->octo_encklen == 24) {
1281 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
1282 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
1283 } else if (od->octo_encklen == 8) {
1284 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 1);
1285 CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 2);
1287 dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
1291 CVMX_MT_3DES_IV(* (uint64_t *) ivp);
1294 CVMX_MT_HSH_IV(od->octo_hminner[0], 0);
1295 CVMX_MT_HSH_IV(od->octo_hminner[1], 1);
1296 CVMX_MT_HSH_IV(od->octo_hminner[2], 2);
1298 while (crypt_off > 0 && auth_off > 0) {
1299 IOV_CONSUME(iov, data32, data_i, data_l);
1304 while (crypt_len > 0 || auth_len > 0) {
1305 uint32_t *first = data32;
1306 mydata.data32[0] = *first;
1307 IOV_CONSUME(iov, data32, data_i, data_l);
1308 mydata.data32[1] = *data32;
1309 if (auth_off <= 0) {
1311 CVM_LOAD_SHA_UNIT(*data, next);
1316 if (crypt_off <= 0) {
1317 if (crypt_len > 0) {
1318 CVMX_MT_3DES_DEC_CBC(*data);
1319 CVMX_MF_3DES_RESULT(*data);
1324 *first = mydata.data32[0];
1325 *data32 = mydata.data32[1];
1326 IOV_CONSUME(iov, data32, data_i, data_l);
1329 /* finish the hash */
1330 CVMX_PREFETCH0(od->octo_hmouter);
1332 if (__predict_false(inplen)) {
1334 uint8_t *p = (uint8_t *) & tmp;
1338 p[inplen] = ((uint8_t *) data)[inplen];
1340 CVM_LOAD_SHA_UNIT(tmp, next);
1342 CVM_LOAD_SHA_UNIT(0x8000000000000000ULL, next);
1345 CVM_LOAD_SHA_UNIT(0x8000000000000000ULL, next);
1348 /* Finish Inner hash */
1350 CVM_LOAD_SHA_UNIT(((uint64_t) 0x0ULL), next);
1352 CVM_LOAD_SHA_UNIT((uint64_t) ((alen + 64) << 3), next);
1354 /* Get the inner hash of HMAC */
1355 CVMX_MF_HSH_IV(tmp1, 0);
1356 CVMX_MF_HSH_IV(tmp2, 1);
1358 CVMX_MF_HSH_IV(tmp3, 2);
1360 /* Initialize hash unit */
1361 CVMX_MT_HSH_IV(od->octo_hmouter[0], 0);
1362 CVMX_MT_HSH_IV(od->octo_hmouter[1], 1);
1363 CVMX_MT_HSH_IV(od->octo_hmouter[2], 2);
1365 CVMX_MT_HSH_DAT(tmp1, 0);
1366 CVMX_MT_HSH_DAT(tmp2, 1);
1367 tmp3 |= 0x0000000080000000;
1368 CVMX_MT_HSH_DAT(tmp3, 2);
1369 CVMX_MT_HSH_DATZ(3);
1370 CVMX_MT_HSH_DATZ(4);
1371 CVMX_MT_HSH_DATZ(5);
1372 CVMX_MT_HSH_DATZ(6);
1373 CVMX_MT_HSH_STARTSHA((uint64_t) ((64 + 20) << 3));
1375 IOV_INIT(iov, data32, data_i, data_l);
1376 while (icv_off > 0) {
1377 IOV_CONSUME(iov, data32, data_i, data_l);
1380 CVMX_MF_HSH_IV(tmp1, 0);
1381 *data32 = (uint32_t) (tmp1 >> 32);
1382 IOV_CONSUME(iov, data32, data_i, data_l);
1383 *data32 = (uint32_t) tmp1;
1384 IOV_CONSUME(iov, data32, data_i, data_l);
1385 CVMX_MF_HSH_IV(tmp1, 1);
1386 *data32 = (uint32_t) (tmp1 >> 32);
1391 /****************************************************************************/
1395 octo_aes_cbc_md5_encrypt(
1396 struct octo_sess *od,
1397 struct iovec *iov, size_t iovcnt, size_t iovlen,
1398 int auth_off, int auth_len,
1399 int crypt_off, int crypt_len,
1400 int icv_off, uint8_t *ivp)
1407 uint64_t *pdata = &mydata[0].data64[0];
1408 uint64_t *data = &mydata[1].data64[0];
1410 uint64_t tmp1, tmp2;
1411 int data_i, data_l, alen = auth_len;
1413 dprintf("%s()\n", __func__);
1415 if (__predict_false(od == NULL || iov==NULL || iovlen==0 || ivp==NULL ||
1416 (crypt_off & 0x3) || (crypt_off + crypt_len > iovlen) ||
1417 (crypt_len & 0x7) ||
1419 (auth_off & 0x3) || (auth_off + auth_len > iovlen))) {
1420 dprintf("%s: Bad parameters od=%p iov=%p iovlen=%jd "
1421 "auth_off=%d auth_len=%d crypt_off=%d crypt_len=%d "
1422 "icv_off=%d ivp=%p\n", __func__, od, iov, iovlen,
1423 auth_off, auth_len, crypt_off, crypt_len, icv_off, ivp);
1427 IOV_INIT(iov, data32, data_i, data_l);
1429 CVMX_PREFETCH0(ivp);
1430 CVMX_PREFETCH0(od->octo_enckey);
1433 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
1434 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
1436 if (od->octo_encklen == 16) {
1437 CVMX_MT_AES_KEY(0x0, 2);
1438 CVMX_MT_AES_KEY(0x0, 3);
1439 } else if (od->octo_encklen == 24) {
1440 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
1441 CVMX_MT_AES_KEY(0x0, 3);
1442 } else if (od->octo_encklen == 32) {
1443 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
1444 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[3], 3);
1446 dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
1449 CVMX_MT_AES_KEYLENGTH(od->octo_encklen / 8 - 1);
1451 CVMX_MT_AES_IV(((uint64_t *) ivp)[0], 0);
1452 CVMX_MT_AES_IV(((uint64_t *) ivp)[1], 1);
1455 CVMX_MT_HSH_IV(od->octo_hminner[0], 0);
1456 CVMX_MT_HSH_IV(od->octo_hminner[1], 1);
1458 while (crypt_off > 0 && auth_off > 0) {
1459 IOV_CONSUME(iov, data32, data_i, data_l);
1464 while (crypt_len > 0 || auth_len > 0) {
1465 uint32_t *pdata32[3];
1467 pdata32[0] = data32;
1468 mydata[0].data32[0] = *data32;
1469 IOV_CONSUME(iov, data32, data_i, data_l);
1471 pdata32[1] = data32;
1472 mydata[0].data32[1] = *data32;
1473 IOV_CONSUME(iov, data32, data_i, data_l);
1475 pdata32[2] = data32;
1476 mydata[1].data32[0] = *data32;
1477 IOV_CONSUME(iov, data32, data_i, data_l);
1479 mydata[1].data32[1] = *data32;
1482 if (crypt_off <= 0) {
1483 if (crypt_len > 0) {
1484 CVMX_MT_AES_ENC_CBC0(*pdata);
1485 CVMX_MT_AES_ENC_CBC1(*data);
1486 CVMX_MF_AES_RESULT(*pdata, 0);
1487 CVMX_MF_AES_RESULT(*data, 1);
1493 if (auth_off <= 0) {
1495 CVM_LOAD_MD5_UNIT(*pdata, next);
1496 CVM_LOAD_MD5_UNIT(*data, next);
1502 *pdata32[0] = mydata[0].data32[0];
1503 *pdata32[1] = mydata[0].data32[1];
1504 *pdata32[2] = mydata[1].data32[0];
1505 *data32 = mydata[1].data32[1];
1507 IOV_CONSUME(iov, data32, data_i, data_l);
1510 /* finish the hash */
1511 CVMX_PREFETCH0(od->octo_hmouter);
1513 if (__predict_false(inplen)) {
1515 uint8_t *p = (uint8_t *) & tmp;
1519 p[inplen] = ((uint8_t *) data)[inplen];
1521 CVM_LOAD_MD5_UNIT(tmp, next);
1523 CVM_LOAD_MD5_UNIT(0x8000000000000000ULL, next);
1526 CVM_LOAD_MD5_UNIT(0x8000000000000000ULL, next);
1529 /* Finish Inner hash */
1531 CVM_LOAD_MD5_UNIT(((uint64_t) 0x0ULL), next);
1533 CVMX_ES64(tmp1, ((alen + 64) << 3));
1534 CVM_LOAD_MD5_UNIT(tmp1, next);
1536 /* Get the inner hash of HMAC */
1537 CVMX_MF_HSH_IV(tmp1, 0);
1538 CVMX_MF_HSH_IV(tmp2, 1);
1540 /* Initialize hash unit */
1541 CVMX_MT_HSH_IV(od->octo_hmouter[0], 0);
1542 CVMX_MT_HSH_IV(od->octo_hmouter[1], 1);
1544 CVMX_MT_HSH_DAT(tmp1, 0);
1545 CVMX_MT_HSH_DAT(tmp2, 1);
1546 CVMX_MT_HSH_DAT(0x8000000000000000ULL, 2);
1547 CVMX_MT_HSH_DATZ(3);
1548 CVMX_MT_HSH_DATZ(4);
1549 CVMX_MT_HSH_DATZ(5);
1550 CVMX_MT_HSH_DATZ(6);
1551 CVMX_ES64(tmp1, ((64 + 16) << 3));
1552 CVMX_MT_HSH_STARTMD5(tmp1);
1555 IOV_INIT(iov, data32, data_i, data_l);
1556 while (icv_off > 0) {
1557 IOV_CONSUME(iov, data32, data_i, data_l);
1560 CVMX_MF_HSH_IV(tmp1, 0);
1561 *data32 = (uint32_t) (tmp1 >> 32);
1562 IOV_CONSUME(iov, data32, data_i, data_l);
1563 *data32 = (uint32_t) tmp1;
1564 IOV_CONSUME(iov, data32, data_i, data_l);
1565 CVMX_MF_HSH_IV(tmp1, 1);
1566 *data32 = (uint32_t) (tmp1 >> 32);
1572 octo_aes_cbc_md5_decrypt(
1573 struct octo_sess *od,
1574 struct iovec *iov, size_t iovcnt, size_t iovlen,
1575 int auth_off, int auth_len,
1576 int crypt_off, int crypt_len,
1577 int icv_off, uint8_t *ivp)
1584 uint64_t *pdata = &mydata[0].data64[0];
1585 uint64_t *data = &mydata[1].data64[0];
1587 uint64_t tmp1, tmp2;
1588 int data_i, data_l, alen = auth_len;
1590 dprintf("%s()\n", __func__);
1592 if (__predict_false(od == NULL || iov==NULL || iovlen==0 || ivp==NULL ||
1593 (crypt_off & 0x3) || (crypt_off + crypt_len > iovlen) ||
1594 (crypt_len & 0x7) ||
1596 (auth_off & 0x3) || (auth_off + auth_len > iovlen))) {
1597 dprintf("%s: Bad parameters od=%p iov=%p iovlen=%jd "
1598 "auth_off=%d auth_len=%d crypt_off=%d crypt_len=%d "
1599 "icv_off=%d ivp=%p\n", __func__, od, iov, iovlen,
1600 auth_off, auth_len, crypt_off, crypt_len, icv_off, ivp);
1604 IOV_INIT(iov, data32, data_i, data_l);
1606 CVMX_PREFETCH0(ivp);
1607 CVMX_PREFETCH0(od->octo_enckey);
1610 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
1611 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
1613 if (od->octo_encklen == 16) {
1614 CVMX_MT_AES_KEY(0x0, 2);
1615 CVMX_MT_AES_KEY(0x0, 3);
1616 } else if (od->octo_encklen == 24) {
1617 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
1618 CVMX_MT_AES_KEY(0x0, 3);
1619 } else if (od->octo_encklen == 32) {
1620 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
1621 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[3], 3);
1623 dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
1626 CVMX_MT_AES_KEYLENGTH(od->octo_encklen / 8 - 1);
1628 CVMX_MT_AES_IV(((uint64_t *) ivp)[0], 0);
1629 CVMX_MT_AES_IV(((uint64_t *) ivp)[1], 1);
1632 CVMX_MT_HSH_IV(od->octo_hminner[0], 0);
1633 CVMX_MT_HSH_IV(od->octo_hminner[1], 1);
1635 while (crypt_off > 0 && auth_off > 0) {
1636 IOV_CONSUME(iov, data32, data_i, data_l);
1641 while (crypt_len > 0 || auth_len > 0) {
1642 uint32_t *pdata32[3];
1644 pdata32[0] = data32;
1645 mydata[0].data32[0] = *data32;
1646 IOV_CONSUME(iov, data32, data_i, data_l);
1647 pdata32[1] = data32;
1648 mydata[0].data32[1] = *data32;
1649 IOV_CONSUME(iov, data32, data_i, data_l);
1650 pdata32[2] = data32;
1651 mydata[1].data32[0] = *data32;
1652 IOV_CONSUME(iov, data32, data_i, data_l);
1653 mydata[1].data32[1] = *data32;
1655 if (auth_off <= 0) {
1657 CVM_LOAD_MD5_UNIT(*pdata, next);
1658 CVM_LOAD_MD5_UNIT(*data, next);
1664 if (crypt_off <= 0) {
1665 if (crypt_len > 0) {
1666 CVMX_MT_AES_DEC_CBC0(*pdata);
1667 CVMX_MT_AES_DEC_CBC1(*data);
1668 CVMX_MF_AES_RESULT(*pdata, 0);
1669 CVMX_MF_AES_RESULT(*data, 1);
1675 *pdata32[0] = mydata[0].data32[0];
1676 *pdata32[1] = mydata[0].data32[1];
1677 *pdata32[2] = mydata[1].data32[0];
1678 *data32 = mydata[1].data32[1];
1680 IOV_CONSUME(iov, data32, data_i, data_l);
1683 /* finish the hash */
1684 CVMX_PREFETCH0(od->octo_hmouter);
1686 if (__predict_false(inplen)) {
1688 uint8_t *p = (uint8_t *) & tmp;
1692 p[inplen] = ((uint8_t *) data)[inplen];
1694 CVM_LOAD_MD5_UNIT(tmp, next);
1696 CVM_LOAD_MD5_UNIT(0x8000000000000000ULL, next);
1699 CVM_LOAD_MD5_UNIT(0x8000000000000000ULL, next);
1702 /* Finish Inner hash */
1704 CVM_LOAD_MD5_UNIT(((uint64_t) 0x0ULL), next);
1706 CVMX_ES64(tmp1, ((alen + 64) << 3));
1707 CVM_LOAD_MD5_UNIT(tmp1, next);
1709 /* Get the inner hash of HMAC */
1710 CVMX_MF_HSH_IV(tmp1, 0);
1711 CVMX_MF_HSH_IV(tmp2, 1);
1713 /* Initialize hash unit */
1714 CVMX_MT_HSH_IV(od->octo_hmouter[0], 0);
1715 CVMX_MT_HSH_IV(od->octo_hmouter[1], 1);
1717 CVMX_MT_HSH_DAT(tmp1, 0);
1718 CVMX_MT_HSH_DAT(tmp2, 1);
1719 CVMX_MT_HSH_DAT(0x8000000000000000ULL, 2);
1720 CVMX_MT_HSH_DATZ(3);
1721 CVMX_MT_HSH_DATZ(4);
1722 CVMX_MT_HSH_DATZ(5);
1723 CVMX_MT_HSH_DATZ(6);
1724 CVMX_ES64(tmp1, ((64 + 16) << 3));
1725 CVMX_MT_HSH_STARTMD5(tmp1);
1728 IOV_INIT(iov, data32, data_i, data_l);
1729 while (icv_off > 0) {
1730 IOV_CONSUME(iov, data32, data_i, data_l);
1733 CVMX_MF_HSH_IV(tmp1, 0);
1734 *data32 = (uint32_t) (tmp1 >> 32);
1735 IOV_CONSUME(iov, data32, data_i, data_l);
1736 *data32 = (uint32_t) tmp1;
1737 IOV_CONSUME(iov, data32, data_i, data_l);
1738 CVMX_MF_HSH_IV(tmp1, 1);
1739 *data32 = (uint32_t) (tmp1 >> 32);
1744 /****************************************************************************/
1748 octo_aes_cbc_sha1_encrypt(
1749 struct octo_sess *od,
1750 struct iovec *iov, size_t iovcnt, size_t iovlen,
1751 int auth_off, int auth_len,
1752 int crypt_off, int crypt_len,
1753 int icv_off, uint8_t *ivp)
1760 uint64_t *pdata = &mydata[0].data64[0];
1761 uint64_t *data = &mydata[1].data64[0];
1763 uint64_t tmp1, tmp2, tmp3;
1764 int data_i, data_l, alen = auth_len;
1766 dprintf("%s()\n", __func__);
1768 if (__predict_false(od == NULL || iov==NULL || iovlen==0 || ivp==NULL ||
1769 (crypt_off & 0x3) || (crypt_off + crypt_len > iovlen) ||
1770 (crypt_len & 0x7) ||
1772 (auth_off & 0x3) || (auth_off + auth_len > iovlen))) {
1773 dprintf("%s: Bad parameters od=%p iov=%p iovlen=%jd "
1774 "auth_off=%d auth_len=%d crypt_off=%d crypt_len=%d "
1775 "icv_off=%d ivp=%p\n", __func__, od, iov, iovlen,
1776 auth_off, auth_len, crypt_off, crypt_len, icv_off, ivp);
1780 IOV_INIT(iov, data32, data_i, data_l);
1782 CVMX_PREFETCH0(ivp);
1783 CVMX_PREFETCH0(od->octo_enckey);
1786 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
1787 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
1789 if (od->octo_encklen == 16) {
1790 CVMX_MT_AES_KEY(0x0, 2);
1791 CVMX_MT_AES_KEY(0x0, 3);
1792 } else if (od->octo_encklen == 24) {
1793 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
1794 CVMX_MT_AES_KEY(0x0, 3);
1795 } else if (od->octo_encklen == 32) {
1796 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
1797 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[3], 3);
1799 dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
1802 CVMX_MT_AES_KEYLENGTH(od->octo_encklen / 8 - 1);
1804 CVMX_MT_AES_IV(((uint64_t *) ivp)[0], 0);
1805 CVMX_MT_AES_IV(((uint64_t *) ivp)[1], 1);
1808 CVMX_MT_HSH_IV(od->octo_hminner[0], 0);
1809 CVMX_MT_HSH_IV(od->octo_hminner[1], 1);
1810 CVMX_MT_HSH_IV(od->octo_hminner[2], 2);
1812 while (crypt_off > 0 && auth_off > 0) {
1813 IOV_CONSUME(iov, data32, data_i, data_l);
1818 while (crypt_len > 0 || auth_len > 0) {
1819 uint32_t *pdata32[3];
1821 pdata32[0] = data32;
1822 mydata[0].data32[0] = *data32;
1823 IOV_CONSUME(iov, data32, data_i, data_l);
1824 pdata32[1] = data32;
1825 mydata[0].data32[1] = *data32;
1826 IOV_CONSUME(iov, data32, data_i, data_l);
1827 pdata32[2] = data32;
1828 mydata[1].data32[0] = *data32;
1829 IOV_CONSUME(iov, data32, data_i, data_l);
1830 mydata[1].data32[1] = *data32;
1833 if (crypt_off <= 0) {
1834 if (crypt_len > 0) {
1835 CVMX_MT_AES_ENC_CBC0(*pdata);
1836 CVMX_MT_AES_ENC_CBC1(*data);
1837 CVMX_MF_AES_RESULT(*pdata, 0);
1838 CVMX_MF_AES_RESULT(*data, 1);
1844 if (auth_off <= 0) {
1846 CVM_LOAD_SHA_UNIT(*pdata, next);
1847 CVM_LOAD_SHA_UNIT(*data, next);
1853 *pdata32[0] = mydata[0].data32[0];
1854 *pdata32[1] = mydata[0].data32[1];
1855 *pdata32[2] = mydata[1].data32[0];
1856 *data32 = mydata[1].data32[1];
1858 IOV_CONSUME(iov, data32, data_i, data_l);
1861 /* finish the hash */
1862 CVMX_PREFETCH0(od->octo_hmouter);
1864 if (__predict_false(inplen)) {
1866 uint8_t *p = (uint8_t *) & tmp;
1870 p[inplen] = ((uint8_t *) data)[inplen];
1872 CVM_LOAD_SHA_UNIT(tmp, next);
1874 CVM_LOAD_SHA_UNIT(0x8000000000000000ULL, next);
1877 CVM_LOAD_SHA_UNIT(0x8000000000000000ULL, next);
1880 /* Finish Inner hash */
1882 CVM_LOAD_SHA_UNIT(((uint64_t) 0x0ULL), next);
1884 CVM_LOAD_SHA_UNIT((uint64_t) ((alen + 64) << 3), next);
1886 /* Get the inner hash of HMAC */
1887 CVMX_MF_HSH_IV(tmp1, 0);
1888 CVMX_MF_HSH_IV(tmp2, 1);
1890 CVMX_MF_HSH_IV(tmp3, 2);
1892 /* Initialize hash unit */
1893 CVMX_MT_HSH_IV(od->octo_hmouter[0], 0);
1894 CVMX_MT_HSH_IV(od->octo_hmouter[1], 1);
1895 CVMX_MT_HSH_IV(od->octo_hmouter[2], 2);
1897 CVMX_MT_HSH_DAT(tmp1, 0);
1898 CVMX_MT_HSH_DAT(tmp2, 1);
1899 tmp3 |= 0x0000000080000000;
1900 CVMX_MT_HSH_DAT(tmp3, 2);
1901 CVMX_MT_HSH_DATZ(3);
1902 CVMX_MT_HSH_DATZ(4);
1903 CVMX_MT_HSH_DATZ(5);
1904 CVMX_MT_HSH_DATZ(6);
1905 CVMX_MT_HSH_STARTSHA((uint64_t) ((64 + 20) << 3));
1907 /* finish the hash */
1908 CVMX_PREFETCH0(od->octo_hmouter);
1910 if (__predict_false(inplen)) {
1912 uint8_t *p = (uint8_t *) & tmp;
1916 p[inplen] = ((uint8_t *) data)[inplen];
1918 CVM_LOAD_MD5_UNIT(tmp, next);
1920 CVM_LOAD_MD5_UNIT(0x8000000000000000ULL, next);
1923 CVM_LOAD_MD5_UNIT(0x8000000000000000ULL, next);
1927 IOV_INIT(iov, data32, data_i, data_l);
1928 while (icv_off > 0) {
1929 IOV_CONSUME(iov, data32, data_i, data_l);
1932 CVMX_MF_HSH_IV(tmp1, 0);
1933 *data32 = (uint32_t) (tmp1 >> 32);
1934 IOV_CONSUME(iov, data32, data_i, data_l);
1935 *data32 = (uint32_t) tmp1;
1936 IOV_CONSUME(iov, data32, data_i, data_l);
1937 CVMX_MF_HSH_IV(tmp1, 1);
1938 *data32 = (uint32_t) (tmp1 >> 32);
1944 octo_aes_cbc_sha1_decrypt(
1945 struct octo_sess *od,
1946 struct iovec *iov, size_t iovcnt, size_t iovlen,
1947 int auth_off, int auth_len,
1948 int crypt_off, int crypt_len,
1949 int icv_off, uint8_t *ivp)
1956 uint64_t *pdata = &mydata[0].data64[0];
1957 uint64_t *data = &mydata[1].data64[0];
1959 uint64_t tmp1, tmp2, tmp3;
1960 int data_i, data_l, alen = auth_len;
1962 dprintf("%s()\n", __func__);
1964 if (__predict_false(od == NULL || iov==NULL || iovlen==0 || ivp==NULL ||
1965 (crypt_off & 0x3) || (crypt_off + crypt_len > iovlen) ||
1966 (crypt_len & 0x7) ||
1968 (auth_off & 0x3) || (auth_off + auth_len > iovlen))) {
1969 dprintf("%s: Bad parameters od=%p iov=%p iovlen=%jd "
1970 "auth_off=%d auth_len=%d crypt_off=%d crypt_len=%d "
1971 "icv_off=%d ivp=%p\n", __func__, od, iov, iovlen,
1972 auth_off, auth_len, crypt_off, crypt_len, icv_off, ivp);
1976 IOV_INIT(iov, data32, data_i, data_l);
1978 CVMX_PREFETCH0(ivp);
1979 CVMX_PREFETCH0(od->octo_enckey);
1982 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
1983 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
1985 if (od->octo_encklen == 16) {
1986 CVMX_MT_AES_KEY(0x0, 2);
1987 CVMX_MT_AES_KEY(0x0, 3);
1988 } else if (od->octo_encklen == 24) {
1989 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
1990 CVMX_MT_AES_KEY(0x0, 3);
1991 } else if (od->octo_encklen == 32) {
1992 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2);
1993 CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[3], 3);
1995 dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
1998 CVMX_MT_AES_KEYLENGTH(od->octo_encklen / 8 - 1);
2000 CVMX_MT_AES_IV(((uint64_t *) ivp)[0], 0);
2001 CVMX_MT_AES_IV(((uint64_t *) ivp)[1], 1);
2004 CVMX_MT_HSH_IV(od->octo_hminner[0], 0);
2005 CVMX_MT_HSH_IV(od->octo_hminner[1], 1);
2006 CVMX_MT_HSH_IV(od->octo_hminner[2], 2);
2008 while (crypt_off > 0 && auth_off > 0) {
2009 IOV_CONSUME(iov, data32, data_i, data_l);
2014 while (crypt_len > 0 || auth_len > 0) {
2015 uint32_t *pdata32[3];
2017 pdata32[0] = data32;
2018 mydata[0].data32[0] = *data32;
2019 IOV_CONSUME(iov, data32, data_i, data_l);
2020 pdata32[1] = data32;
2021 mydata[0].data32[1] = *data32;
2022 IOV_CONSUME(iov, data32, data_i, data_l);
2023 pdata32[2] = data32;
2024 mydata[1].data32[0] = *data32;
2025 IOV_CONSUME(iov, data32, data_i, data_l);
2026 mydata[1].data32[1] = *data32;
2028 if (auth_off <= 0) {
2030 CVM_LOAD_SHA_UNIT(*pdata, next);
2031 CVM_LOAD_SHA_UNIT(*data, next);
2037 if (crypt_off <= 0) {
2038 if (crypt_len > 0) {
2039 CVMX_MT_AES_DEC_CBC0(*pdata);
2040 CVMX_MT_AES_DEC_CBC1(*data);
2041 CVMX_MF_AES_RESULT(*pdata, 0);
2042 CVMX_MF_AES_RESULT(*data, 1);
2048 *pdata32[0] = mydata[0].data32[0];
2049 *pdata32[1] = mydata[0].data32[1];
2050 *pdata32[2] = mydata[1].data32[0];
2051 *data32 = mydata[1].data32[1];
2053 IOV_CONSUME(iov, data32, data_i, data_l);
2056 /* finish the hash */
2057 CVMX_PREFETCH0(od->octo_hmouter);
2059 if (__predict_false(inplen)) {
2061 uint8_t *p = (uint8_t *) & tmp;
2065 p[inplen] = ((uint8_t *) data)[inplen];
2067 CVM_LOAD_SHA_UNIT(tmp, next);
2069 CVM_LOAD_SHA_UNIT(0x8000000000000000ULL, next);
2072 CVM_LOAD_SHA_UNIT(0x8000000000000000ULL, next);
2075 /* Finish Inner hash */
2077 CVM_LOAD_SHA_UNIT(((uint64_t) 0x0ULL), next);
2079 CVM_LOAD_SHA_UNIT((uint64_t) ((alen + 64) << 3), next);
2081 /* Get the inner hash of HMAC */
2082 CVMX_MF_HSH_IV(tmp1, 0);
2083 CVMX_MF_HSH_IV(tmp2, 1);
2085 CVMX_MF_HSH_IV(tmp3, 2);
2087 /* Initialize hash unit */
2088 CVMX_MT_HSH_IV(od->octo_hmouter[0], 0);
2089 CVMX_MT_HSH_IV(od->octo_hmouter[1], 1);
2090 CVMX_MT_HSH_IV(od->octo_hmouter[2], 2);
2092 CVMX_MT_HSH_DAT(tmp1, 0);
2093 CVMX_MT_HSH_DAT(tmp2, 1);
2094 tmp3 |= 0x0000000080000000;
2095 CVMX_MT_HSH_DAT(tmp3, 2);
2096 CVMX_MT_HSH_DATZ(3);
2097 CVMX_MT_HSH_DATZ(4);
2098 CVMX_MT_HSH_DATZ(5);
2099 CVMX_MT_HSH_DATZ(6);
2100 CVMX_MT_HSH_STARTSHA((uint64_t) ((64 + 20) << 3));
2102 /* finish the hash */
2103 CVMX_PREFETCH0(od->octo_hmouter);
2105 if (__predict_false(inplen)) {
2107 uint8_t *p = (uint8_t *) & tmp;
2111 p[inplen] = ((uint8_t *) data)[inplen];
2113 CVM_LOAD_MD5_UNIT(tmp, next);
2115 CVM_LOAD_MD5_UNIT(0x8000000000000000ULL, next);
2118 CVM_LOAD_MD5_UNIT(0x8000000000000000ULL, next);
2122 IOV_INIT(iov, data32, data_i, data_l);
2123 while (icv_off > 0) {
2124 IOV_CONSUME(iov, data32, data_i, data_l);
2127 CVMX_MF_HSH_IV(tmp1, 0);
2128 *data32 = (uint32_t) (tmp1 >> 32);
2129 IOV_CONSUME(iov, data32, data_i, data_l);
2130 *data32 = (uint32_t) tmp1;
2131 IOV_CONSUME(iov, data32, data_i, data_l);
2132 CVMX_MF_HSH_IV(tmp1, 1);
2133 *data32 = (uint32_t) (tmp1 >> 32);
2138 /****************************************************************************/