2 * Copyright (c) 2008-2011 Apple Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
29 /* $FreeBSD: src/sys/netinet6/ah_core.c,v 1.2.2.4 2001/07/03 11:01:49 ume Exp $ */
30 /* $KAME: ah_core.c,v 1.44 2001/03/12 11:24:39 itojun Exp $ */
33 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
34 * All rights reserved.
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
39 * 1. Redistributions of source code must retain the above copyright
40 * notice, this list of conditions and the following disclaimer.
41 * 2. Redistributions in binary form must reproduce the above copyright
42 * notice, this list of conditions and the following disclaimer in the
43 * documentation and/or other materials provided with the distribution.
44 * 3. Neither the name of the project nor the names of its contributors
45 * may be used to endorse or promote products derived from this software
46 * without specific prior written permission.
48 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
49 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
52 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62 * RFC1826/2402 authentication header.
65 /* TODO: have shared routines for hmac-* algorithms */
67 #include <sys/param.h>
68 #include <sys/systm.h>
69 #include <sys/malloc.h>
71 #include <sys/domain.h>
72 #include <sys/protosw.h>
73 #include <sys/socket.h>
74 #include <sys/socketvar.h>
75 #include <sys/errno.h>
77 #include <sys/syslog.h>
80 #include <net/route.h>
82 #include <netinet/in.h>
83 #include <netinet/in_systm.h>
84 #include <netinet/ip.h>
85 #include <netinet/in_var.h>
88 #include <netinet/ip6.h>
89 #include <netinet6/ip6_var.h>
90 #include <netinet/icmp6.h>
93 #include <netinet6/ipsec.h>
95 #include <netinet6/ipsec6.h>
97 #include <netinet6/ah.h>
99 #include <netinet6/ah6.h>
102 #include <netinet6/esp.h>
104 #include <netinet6/esp6.h>
107 #include <net/pfkeyv2.h>
108 #include <netkey/keydb.h>
109 #include <libkern/crypto/md5.h>
110 #include <libkern/crypto/sha1.h>
111 #include <libkern/crypto/sha2.h>
113 #include <net/net_osdep.h>
117 static int ah_sumsiz_1216(struct secasvar
*);
118 static int ah_sumsiz_zero(struct secasvar
*);
119 static int ah_none_mature(struct secasvar
*);
120 static int ah_none_init(struct ah_algorithm_state
*, struct secasvar
*);
121 static void ah_none_loop(struct ah_algorithm_state
*, caddr_t
, size_t);
122 static void ah_none_result(struct ah_algorithm_state
*, caddr_t
, size_t);
123 static int ah_keyed_md5_mature(struct secasvar
*);
124 static int ah_keyed_md5_init(struct ah_algorithm_state
*, struct secasvar
*);
125 static void ah_keyed_md5_loop(struct ah_algorithm_state
*, caddr_t
, size_t);
126 static void ah_keyed_md5_result(struct ah_algorithm_state
*, caddr_t
, size_t);
127 static int ah_keyed_sha1_mature(struct secasvar
*);
128 static int ah_keyed_sha1_init(struct ah_algorithm_state
*, struct secasvar
*);
129 static void ah_keyed_sha1_loop(struct ah_algorithm_state
*, caddr_t
, size_t);
130 static void ah_keyed_sha1_result(struct ah_algorithm_state
*, caddr_t
, size_t);
131 static int ah_hmac_md5_mature(struct secasvar
*);
132 static int ah_hmac_md5_init(struct ah_algorithm_state
*, struct secasvar
*);
133 static void ah_hmac_md5_loop(struct ah_algorithm_state
*, caddr_t
, size_t);
134 static void ah_hmac_md5_result(struct ah_algorithm_state
*, caddr_t
, size_t);
135 static int ah_hmac_sha1_mature(struct secasvar
*);
136 static int ah_hmac_sha1_init(struct ah_algorithm_state
*, struct secasvar
*);
137 static void ah_hmac_sha1_loop(struct ah_algorithm_state
*, caddr_t
, size_t);
138 static void ah_hmac_sha1_result(struct ah_algorithm_state
*, caddr_t
, size_t);
140 static int ah_sumsiz_sha2_256(struct secasvar
*);
141 static int ah_hmac_sha2_256_mature(struct secasvar
*);
142 static int ah_hmac_sha2_256_init(struct ah_algorithm_state
*,
144 static void ah_hmac_sha2_256_loop(struct ah_algorithm_state
*, caddr_t
, size_t);
145 static void ah_hmac_sha2_256_result(struct ah_algorithm_state
*, caddr_t
, size_t);
146 static int ah_sumsiz_sha2_384(struct secasvar
*);
147 static int ah_hmac_sha2_384_mature(struct secasvar
*);
148 static int ah_hmac_sha2_384_init(struct ah_algorithm_state
*,
150 static void ah_hmac_sha2_384_loop(struct ah_algorithm_state
*, caddr_t
, size_t);
151 static void ah_hmac_sha2_384_result(struct ah_algorithm_state
*, caddr_t
, size_t);
152 static int ah_sumsiz_sha2_512(struct secasvar
*);
153 static int ah_hmac_sha2_512_mature(struct secasvar
*);
154 static int ah_hmac_sha2_512_init(struct ah_algorithm_state
*,
156 static void ah_hmac_sha2_512_loop(struct ah_algorithm_state
*, caddr_t
, size_t);
157 static void ah_hmac_sha2_512_result(struct ah_algorithm_state
*, caddr_t
, size_t);
158 #endif /* AH_ALL_CRYPTO */
160 static void ah_update_mbuf(struct mbuf
*, int, int,
161 const struct ah_algorithm
*, struct ah_algorithm_state
*);
163 const struct ah_algorithm
*
164 ah_algorithm_lookup(idx
)
167 /* checksum algorithms */
168 static struct ah_algorithm hmac_md5
=
169 { ah_sumsiz_1216
, ah_hmac_md5_mature
, 128, 128, "hmac-md5",
170 ah_hmac_md5_init
, ah_hmac_md5_loop
,
171 ah_hmac_md5_result
, };
172 static struct ah_algorithm keyed_md5
=
173 { ah_sumsiz_1216
, ah_keyed_md5_mature
, 128, 128, "keyed-md5",
174 ah_keyed_md5_init
, ah_keyed_md5_loop
,
175 ah_keyed_md5_result
, };
176 static struct ah_algorithm hmac_sha1
=
177 { ah_sumsiz_1216
, ah_hmac_sha1_mature
, 160, 160, "hmac-sha1",
178 ah_hmac_sha1_init
, ah_hmac_sha1_loop
,
179 ah_hmac_sha1_result
, };
180 static struct ah_algorithm keyed_sha1
=
181 { ah_sumsiz_1216
, ah_keyed_sha1_mature
, 160, 160, "keyed-sha1",
182 ah_keyed_sha1_init
, ah_keyed_sha1_loop
,
183 ah_keyed_sha1_result
, };
184 static struct ah_algorithm ah_none
=
185 { ah_sumsiz_zero
, ah_none_mature
, 0, 2048, "none",
186 ah_none_init
, ah_none_loop
, ah_none_result
, };
188 static struct ah_algorithm hmac_sha2_256
=
189 { ah_sumsiz_sha2_256
, ah_hmac_sha2_256_mature
, 256, 256,
191 ah_hmac_sha2_256_init
, ah_hmac_sha2_256_loop
,
192 ah_hmac_sha2_256_result
, };
193 static struct ah_algorithm hmac_sha2_384
=
194 { ah_sumsiz_sha2_384
, ah_hmac_sha2_384_mature
, 384, 384,
196 ah_hmac_sha2_384_init
, ah_hmac_sha2_384_loop
,
197 ah_hmac_sha2_384_result
, };
198 static struct ah_algorithm hmac_sha2_512
=
199 { ah_sumsiz_sha2_512
, ah_hmac_sha2_512_mature
, 512, 512,
201 ah_hmac_sha2_512_init
, ah_hmac_sha2_512_loop
,
202 ah_hmac_sha2_512_result
, };
203 #endif /* AH_ALL_CRYPTO */
206 case SADB_AALG_MD5HMAC
:
208 case SADB_AALG_SHA1HMAC
:
210 case SADB_X_AALG_MD5
:
212 case SADB_X_AALG_SHA
:
214 case SADB_X_AALG_NULL
:
217 case SADB_X_AALG_SHA2_256
:
218 return &hmac_sha2_256
;
219 case SADB_X_AALG_SHA2_384
:
220 return &hmac_sha2_384
;
221 case SADB_X_AALG_SHA2_512
:
222 return &hmac_sha2_512
;
223 #endif /* AH_ALL_CRYPTO */
232 struct secasvar
*sav
;
236 if (sav
->flags
& SADB_X_EXT_OLD
)
244 struct secasvar
*sav
;
253 struct secasvar
*sav
;
255 if (sav
->sah
->saidx
.proto
== IPPROTO_AH
) {
257 "ah_none_mature: protocol and algorithm mismatch.\n"));
265 struct ah_algorithm_state
*state
,
266 __unused
struct secasvar
*sav
)
274 __unused
struct ah_algorithm_state
*state
,
275 __unused caddr_t addr
,
282 __unused
struct ah_algorithm_state
*state
,
283 __unused caddr_t addr
,
290 __unused
struct secasvar
*sav
)
292 /* anything is okay */
297 ah_keyed_md5_init(state
, sav
)
298 struct ah_algorithm_state
*state
;
299 struct secasvar
*sav
;
303 u_int8_t buf
[32] __attribute__((aligned(4)));
306 panic("ah_keyed_md5_init: what?");
309 state
->foo
= (void *)_MALLOC(sizeof(MD5_CTX
), M_TEMP
, M_NOWAIT
);
310 if (state
->foo
== NULL
)
313 MD5Init((MD5_CTX
*)state
->foo
);
315 MD5Update((MD5_CTX
*)state
->foo
,
316 (u_int8_t
*)_KEYBUF(state
->sav
->key_auth
),
317 (u_int
)_KEYLEN(state
->sav
->key_auth
));
321 * We cannot simply use md5_pad() since the function
322 * won't update the total length.
324 if (_KEYLEN(state
->sav
->key_auth
) < 56)
325 padlen
= 64 - 8 - _KEYLEN(state
->sav
->key_auth
);
327 padlen
= 64 + 64 - 8 - _KEYLEN(state
->sav
->key_auth
);
328 keybitlen
= _KEYLEN(state
->sav
->key_auth
);
332 MD5Update((MD5_CTX
*)state
->foo
, &buf
[0], 1);
335 bzero(buf
, sizeof(buf
));
336 while (sizeof(buf
) < padlen
) {
337 MD5Update((MD5_CTX
*)state
->foo
, &buf
[0], sizeof(buf
));
338 padlen
-= sizeof(buf
);
341 MD5Update((MD5_CTX
*)state
->foo
, &buf
[0], padlen
);
344 buf
[0] = (keybitlen
>> 0) & 0xff;
345 buf
[1] = (keybitlen
>> 8) & 0xff;
346 buf
[2] = (keybitlen
>> 16) & 0xff;
347 buf
[3] = (keybitlen
>> 24) & 0xff;
348 MD5Update((MD5_CTX
*)state
->foo
, buf
, 8);
355 ah_keyed_md5_loop(state
, addr
, len
)
356 struct ah_algorithm_state
*state
;
361 panic("ah_keyed_md5_loop: what?");
363 MD5Update((MD5_CTX
*)state
->foo
, addr
, len
);
367 ah_keyed_md5_result(state
, addr
, l
)
368 struct ah_algorithm_state
*state
;
372 u_char digest
[16] __attribute__((aligned(4)));
375 panic("ah_keyed_md5_result: what?");
378 MD5Update((MD5_CTX
*)state
->foo
,
379 (u_int8_t
*)_KEYBUF(state
->sav
->key_auth
),
380 (u_int
)_KEYLEN(state
->sav
->key_auth
));
382 MD5Final(&digest
[0], (MD5_CTX
*)state
->foo
);
383 FREE(state
->foo
, M_TEMP
);
384 bcopy(&digest
[0], (void *)addr
, sizeof(digest
) > l
? l
: sizeof(digest
));
388 ah_keyed_sha1_mature(sav
)
389 struct secasvar
*sav
;
391 const struct ah_algorithm
*algo
;
393 if (!sav
->key_auth
) {
394 ipseclog((LOG_ERR
, "ah_keyed_sha1_mature: no key is given.\n"));
398 algo
= ah_algorithm_lookup(sav
->alg_auth
);
400 ipseclog((LOG_ERR
, "ah_keyed_sha1_mature: unsupported algorithm.\n"));
404 if (sav
->key_auth
->sadb_key_bits
< algo
->keymin
405 || algo
->keymax
< sav
->key_auth
->sadb_key_bits
) {
407 "ah_keyed_sha1_mature: invalid key length %d.\n",
408 sav
->key_auth
->sadb_key_bits
));
416 ah_keyed_sha1_init(state
, sav
)
417 struct ah_algorithm_state
*state
;
418 struct secasvar
*sav
;
423 u_int8_t buf
[32] __attribute__((aligned(4)));
426 panic("ah_keyed_sha1_init: what?");
429 state
->foo
= (void *)_MALLOC(sizeof(SHA1_CTX
), M_TEMP
, M_NOWAIT
);
433 ctxt
= (SHA1_CTX
*)state
->foo
;
437 SHA1Update(ctxt
, (u_int8_t
*)_KEYBUF(state
->sav
->key_auth
),
438 (u_int
)_KEYLEN(state
->sav
->key_auth
));
443 if (_KEYLEN(state
->sav
->key_auth
) < 56)
444 padlen
= 64 - 8 - _KEYLEN(state
->sav
->key_auth
);
446 padlen
= 64 + 64 - 8 - _KEYLEN(state
->sav
->key_auth
);
447 keybitlen
= _KEYLEN(state
->sav
->key_auth
);
451 SHA1Update(ctxt
, &buf
[0], 1);
454 bzero(buf
, sizeof(buf
));
455 while (sizeof(buf
) < padlen
) {
456 SHA1Update(ctxt
, &buf
[0], sizeof(buf
));
457 padlen
-= sizeof(buf
);
460 SHA1Update(ctxt
, &buf
[0], padlen
);
463 buf
[0] = (keybitlen
>> 0) & 0xff;
464 buf
[1] = (keybitlen
>> 8) & 0xff;
465 buf
[2] = (keybitlen
>> 16) & 0xff;
466 buf
[3] = (keybitlen
>> 24) & 0xff;
467 SHA1Update(ctxt
, buf
, 8);
474 ah_keyed_sha1_loop(state
, addr
, len
)
475 struct ah_algorithm_state
*state
;
481 if (!state
|| !state
->foo
)
482 panic("ah_keyed_sha1_loop: what?");
483 ctxt
= (SHA1_CTX
*)state
->foo
;
485 SHA1Update(ctxt
, (caddr_t
)addr
, (size_t)len
);
489 ah_keyed_sha1_result(state
, addr
, l
)
490 struct ah_algorithm_state
*state
;
494 u_char digest
[SHA1_RESULTLEN
] __attribute__((aligned(4))); /* SHA-1 generates 160 bits */
497 if (!state
|| !state
->foo
)
498 panic("ah_keyed_sha1_result: what?");
499 ctxt
= (SHA1_CTX
*)state
->foo
;
502 SHA1Update(ctxt
, (u_int8_t
*)_KEYBUF(state
->sav
->key_auth
),
503 (u_int
)_KEYLEN(state
->sav
->key_auth
));
505 SHA1Final((caddr_t
)&digest
[0], ctxt
);
506 bcopy(&digest
[0], (void *)addr
, sizeof(digest
) > l
? l
: sizeof(digest
));
508 FREE(state
->foo
, M_TEMP
);
512 ah_hmac_md5_mature(sav
)
513 struct secasvar
*sav
;
515 const struct ah_algorithm
*algo
;
517 if (!sav
->key_auth
) {
518 ipseclog((LOG_ERR
, "ah_hmac_md5_mature: no key is given.\n"));
522 algo
= ah_algorithm_lookup(sav
->alg_auth
);
524 ipseclog((LOG_ERR
, "ah_hmac_md5_mature: unsupported algorithm.\n"));
528 if (sav
->key_auth
->sadb_key_bits
< algo
->keymin
529 || algo
->keymax
< sav
->key_auth
->sadb_key_bits
) {
531 "ah_hmac_md5_mature: invalid key length %d.\n",
532 sav
->key_auth
->sadb_key_bits
));
540 ah_hmac_md5_init(state
, sav
)
541 struct ah_algorithm_state
*state
;
542 struct secasvar
*sav
;
546 u_char tk
[16] __attribute__((aligned(4)));
553 panic("ah_hmac_md5_init: what?");
556 state
->foo
= (void *)_MALLOC(64 + 64 + sizeof(MD5_CTX
), M_TEMP
, M_NOWAIT
);
560 ipad
= (u_char
*)state
->foo
;
561 opad
= (u_char
*)(ipad
+ 64);
562 ctxt
= (MD5_CTX
*)(void *)(opad
+ 64);
564 /* compress the key if necessery */
565 if (64 < _KEYLEN(state
->sav
->key_auth
)) {
567 MD5Update(ctxt
, _KEYBUF(state
->sav
->key_auth
),
568 _KEYLEN(state
->sav
->key_auth
));
569 MD5Final(&tk
[0], ctxt
);
573 key
= (u_char
*) _KEYBUF(state
->sav
->key_auth
);
574 keylen
= _KEYLEN(state
->sav
->key_auth
);
579 bcopy(key
, ipad
, keylen
);
580 bcopy(key
, opad
, keylen
);
581 for (i
= 0; i
< 64; i
++) {
587 MD5Update(ctxt
, ipad
, 64);
593 ah_hmac_md5_loop(state
, addr
, len
)
594 struct ah_algorithm_state
*state
;
600 if (!state
|| !state
->foo
)
601 panic("ah_hmac_md5_loop: what?");
602 ctxt
= (MD5_CTX
*)(void *)(((caddr_t
)state
->foo
) + 128);
603 MD5Update(ctxt
, addr
, len
);
607 ah_hmac_md5_result(state
, addr
, l
)
608 struct ah_algorithm_state
*state
;
612 u_char digest
[16] __attribute__((aligned(4)));
617 if (!state
|| !state
->foo
)
618 panic("ah_hmac_md5_result: what?");
620 ipad
= (u_char
*)state
->foo
;
621 opad
= (u_char
*)(ipad
+ 64);
622 ctxt
= (MD5_CTX
*)(void *)(opad
+ 64);
624 MD5Final(&digest
[0], ctxt
);
627 MD5Update(ctxt
, opad
, 64);
628 MD5Update(ctxt
, &digest
[0], sizeof(digest
));
629 MD5Final(&digest
[0], ctxt
);
631 bcopy(&digest
[0], (void *)addr
, sizeof(digest
) > l
? l
: sizeof(digest
));
633 FREE(state
->foo
, M_TEMP
);
637 ah_hmac_sha1_mature(sav
)
638 struct secasvar
*sav
;
640 const struct ah_algorithm
*algo
;
642 if (!sav
->key_auth
) {
643 ipseclog((LOG_ERR
, "ah_hmac_sha1_mature: no key is given.\n"));
647 algo
= ah_algorithm_lookup(sav
->alg_auth
);
649 ipseclog((LOG_ERR
, "ah_hmac_sha1_mature: unsupported algorithm.\n"));
653 if (sav
->key_auth
->sadb_key_bits
< algo
->keymin
654 || algo
->keymax
< sav
->key_auth
->sadb_key_bits
) {
656 "ah_hmac_sha1_mature: invalid key length %d.\n",
657 sav
->key_auth
->sadb_key_bits
));
665 ah_hmac_sha1_init(state
, sav
)
666 struct ah_algorithm_state
*state
;
667 struct secasvar
*sav
;
672 u_char tk
[SHA1_RESULTLEN
] __attribute__((aligned(4))); /* SHA-1 generates 160 bits */
678 panic("ah_hmac_sha1_init: what?");
681 state
->foo
= (void *)_MALLOC(64 + 64 + sizeof(SHA1_CTX
),
686 ipad
= (u_char
*)state
->foo
;
687 opad
= (u_char
*)(ipad
+ 64);
688 ctxt
= (SHA1_CTX
*)(void *)(opad
+ 64);
690 /* compress the key if necessery */
691 if (64 < _KEYLEN(state
->sav
->key_auth
)) {
693 SHA1Update(ctxt
, _KEYBUF(state
->sav
->key_auth
),
694 _KEYLEN(state
->sav
->key_auth
));
695 SHA1Final(&tk
[0], ctxt
);
697 keylen
= SHA1_RESULTLEN
;
699 key
= (u_char
*) _KEYBUF(state
->sav
->key_auth
);
700 keylen
= _KEYLEN(state
->sav
->key_auth
);
705 bcopy(key
, ipad
, keylen
);
706 bcopy(key
, opad
, keylen
);
707 for (i
= 0; i
< 64; i
++) {
713 SHA1Update(ctxt
, ipad
, 64);
719 ah_hmac_sha1_loop(state
, addr
, len
)
720 struct ah_algorithm_state
*state
;
726 if (!state
|| !state
->foo
)
727 panic("ah_hmac_sha1_loop: what?");
729 ctxt
= (SHA1_CTX
*)(void *)(((u_char
*)state
->foo
) + 128);
730 SHA1Update(ctxt
, (caddr_t
)addr
, (size_t)len
);
734 ah_hmac_sha1_result(state
, addr
, l
)
735 struct ah_algorithm_state
*state
;
739 u_char digest
[SHA1_RESULTLEN
] __attribute__((aligned(4))); /* SHA-1 generates 160 bits */
744 if (!state
|| !state
->foo
)
745 panic("ah_hmac_sha1_result: what?");
747 ipad
= (u_char
*)state
->foo
;
748 opad
= (u_char
*)(ipad
+ 64);
749 ctxt
= (SHA1_CTX
*)(void *)(opad
+ 64);
751 SHA1Final((caddr_t
)&digest
[0], ctxt
);
754 SHA1Update(ctxt
, opad
, 64);
755 SHA1Update(ctxt
, (caddr_t
)&digest
[0], sizeof(digest
));
756 SHA1Final((caddr_t
)&digest
[0], ctxt
);
758 bcopy(&digest
[0], (void *)addr
, sizeof(digest
) > l
? l
: sizeof(digest
));
760 FREE(state
->foo
, M_TEMP
);
765 ah_sumsiz_sha2_256(sav
)
766 struct secasvar
*sav
;
770 // return half the output size (in bytes), as per rfc 4868
771 return 16; // 256/(8*2)
775 ah_hmac_sha2_256_mature(sav
)
776 struct secasvar
*sav
;
778 const struct ah_algorithm
*algo
;
780 if (!sav
->key_auth
) {
782 "ah_hmac_sha2_256_mature: no key is given.\n"));
786 algo
= ah_algorithm_lookup(sav
->alg_auth
);
789 "ah_hmac_sha2_256_mature: unsupported algorithm.\n"));
793 if (sav
->key_auth
->sadb_key_bits
< algo
->keymin
||
794 algo
->keymax
< sav
->key_auth
->sadb_key_bits
) {
796 "ah_hmac_sha2_256_mature: invalid key length %d.\n",
797 sav
->key_auth
->sadb_key_bits
));
805 ah_hmac_sha2_256_init(state
, sav
)
806 struct ah_algorithm_state
*state
;
807 struct secasvar
*sav
;
812 u_char tk
[SHA256_DIGEST_LENGTH
] __attribute__((aligned(4)));
818 panic("ah_hmac_sha2_256_init: what?");
821 state
->foo
= (void *)_MALLOC(64 + 64 + sizeof(SHA256_CTX
),
826 ipad
= (u_char
*)state
->foo
;
827 opad
= (u_char
*)(ipad
+ 64);
828 ctxt
= (SHA256_CTX
*)(void *)(opad
+ 64);
830 /* compress the key if necessery */
831 if (64 < _KEYLEN(state
->sav
->key_auth
)) {
832 bzero(tk
, sizeof(tk
));
833 bzero(ctxt
, sizeof(*ctxt
));
835 SHA256_Update(ctxt
, (const u_int8_t
*) _KEYBUF(state
->sav
->key_auth
),
836 _KEYLEN(state
->sav
->key_auth
));
837 SHA256_Final(&tk
[0], ctxt
);
839 keylen
= sizeof(tk
) < 64 ? sizeof(tk
) : 64;
841 key
= (u_char
*) _KEYBUF(state
->sav
->key_auth
);
842 keylen
= _KEYLEN(state
->sav
->key_auth
);
847 bcopy(key
, ipad
, keylen
);
848 bcopy(key
, opad
, keylen
);
849 for (i
= 0; i
< 64; i
++) {
854 bzero(ctxt
, sizeof(*ctxt
));
856 SHA256_Update(ctxt
, ipad
, 64);
862 ah_hmac_sha2_256_loop(state
, addr
, len
)
863 struct ah_algorithm_state
*state
;
869 if (!state
|| !state
->foo
)
870 panic("ah_hmac_sha2_256_loop: what?");
872 ctxt
= (SHA256_CTX
*)(void *)(((u_char
*)state
->foo
) + 128);
873 SHA256_Update(ctxt
, (const u_int8_t
*)addr
, (size_t)len
);
877 ah_hmac_sha2_256_result(state
, addr
, l
)
878 struct ah_algorithm_state
*state
;
882 u_char digest
[SHA256_DIGEST_LENGTH
] __attribute__((aligned(4)));
887 if (!state
|| !state
->foo
)
888 panic("ah_hmac_sha2_256_result: what?");
890 ipad
= (u_char
*)state
->foo
;
891 opad
= (u_char
*)(ipad
+ 64);
892 ctxt
= (SHA256_CTX
*)(void *)(opad
+ 64);
894 SHA256_Final((u_int8_t
*)digest
, ctxt
);
897 SHA256_Update(ctxt
, opad
, 64);
898 SHA256_Update(ctxt
, (const u_int8_t
*)digest
, sizeof(digest
));
899 SHA256_Final((u_int8_t
*)digest
, ctxt
);
901 bcopy(&digest
[0], (void *)addr
, sizeof(digest
) > l
? l
: sizeof(digest
));
903 FREE(state
->foo
, M_TEMP
);
907 ah_sumsiz_sha2_384(sav
)
908 struct secasvar
*sav
;
912 // return half the output size (in bytes), as per rfc 4868
913 return 24; // 384/(8*2)
917 ah_hmac_sha2_384_mature(sav
)
918 struct secasvar
*sav
;
920 const struct ah_algorithm
*algo
;
922 if (!sav
->key_auth
) {
924 "ah_hmac_sha2_384_mature: no key is given.\n"));
928 algo
= ah_algorithm_lookup(sav
->alg_auth
);
931 "ah_hmac_sha2_384_mature: unsupported algorithm.\n"));
935 if (sav
->key_auth
->sadb_key_bits
< algo
->keymin
||
936 algo
->keymax
< sav
->key_auth
->sadb_key_bits
) {
938 "ah_hmac_sha2_384_mature: invalid key length %d.\n",
939 sav
->key_auth
->sadb_key_bits
));
947 ah_hmac_sha2_384_init(state
, sav
)
948 struct ah_algorithm_state
*state
;
949 struct secasvar
*sav
;
954 u_char tk
[SHA384_DIGEST_LENGTH
] __attribute__((aligned(4)));
960 panic("ah_hmac_sha2_384_init: what?");
963 state
->foo
= (void *)_MALLOC(128 + 128 + sizeof(SHA384_CTX
),
967 bzero(state
->foo
, 128 + 128 + sizeof(SHA384_CTX
));
969 ipad
= (u_char
*)state
->foo
;
970 opad
= (u_char
*)(ipad
+ 128);
971 ctxt
= (SHA384_CTX
*)(void *)(opad
+ 128);
973 /* compress the key if necessery */
974 if (128 < _KEYLEN(state
->sav
->key_auth
)) {
975 bzero(tk
, sizeof(tk
));
976 bzero(ctxt
, sizeof(*ctxt
));
978 SHA384_Update(ctxt
, (const u_int8_t
*) _KEYBUF(state
->sav
->key_auth
),
979 _KEYLEN(state
->sav
->key_auth
));
980 SHA384_Final(&tk
[0], ctxt
);
982 keylen
= sizeof(tk
) < 128 ? sizeof(tk
) : 128;
984 key
= (u_char
*) _KEYBUF(state
->sav
->key_auth
);
985 keylen
= _KEYLEN(state
->sav
->key_auth
);
990 bcopy(key
, ipad
, keylen
);
991 bcopy(key
, opad
, keylen
);
992 for (i
= 0; i
< 128; i
++) {
997 bzero(ctxt
, sizeof(*ctxt
));
999 SHA384_Update(ctxt
, ipad
, 128);
1005 ah_hmac_sha2_384_loop(state
, addr
, len
)
1006 struct ah_algorithm_state
*state
;
1012 if (!state
|| !state
->foo
)
1013 panic("ah_hmac_sha2_384_loop: what?");
1015 ctxt
= (SHA384_CTX
*)(void *)(((u_char
*)state
->foo
) + 256);
1016 SHA384_Update(ctxt
, (const u_int8_t
*)addr
, (size_t)len
);
1020 ah_hmac_sha2_384_result(state
, addr
, l
)
1021 struct ah_algorithm_state
*state
;
1025 u_char digest
[SHA384_DIGEST_LENGTH
];
1030 if (!state
|| !state
->foo
)
1031 panic("ah_hmac_sha2_384_result: what?");
1033 ipad
= (u_char
*)state
->foo
;
1034 opad
= (u_char
*)(ipad
+ 128);
1035 ctxt
= (SHA384_CTX
*)(void *)(opad
+ 128);
1037 SHA384_Final((u_int8_t
*)digest
, ctxt
);
1040 SHA384_Update(ctxt
, opad
, 128);
1041 SHA384_Update(ctxt
, (const u_int8_t
*)digest
, sizeof(digest
));
1042 SHA384_Final((u_int8_t
*)digest
, ctxt
);
1044 bcopy(&digest
[0], (void *)addr
, sizeof(digest
) > l
? l
: sizeof(digest
));
1046 FREE(state
->foo
, M_TEMP
);
1050 ah_sumsiz_sha2_512(sav
)
1051 struct secasvar
*sav
;
1055 // return half the output size (in bytes), as per rfc 4868
1056 return 32; // 512/(8*2)
1060 ah_hmac_sha2_512_mature(sav
)
1061 struct secasvar
*sav
;
1063 const struct ah_algorithm
*algo
;
1065 if (!sav
->key_auth
) {
1067 "ah_hmac_sha2_512_mature: no key is given.\n"));
1071 algo
= ah_algorithm_lookup(sav
->alg_auth
);
1074 "ah_hmac_sha2_512_mature: unsupported algorithm.\n"));
1078 if (sav
->key_auth
->sadb_key_bits
< algo
->keymin
||
1079 algo
->keymax
< sav
->key_auth
->sadb_key_bits
) {
1081 "ah_hmac_sha2_512_mature: invalid key length %d.\n",
1082 sav
->key_auth
->sadb_key_bits
));
1090 ah_hmac_sha2_512_init(state
, sav
)
1091 struct ah_algorithm_state
*state
;
1092 struct secasvar
*sav
;
1097 u_char tk
[SHA512_DIGEST_LENGTH
] __attribute__((aligned(4)));
1103 panic("ah_hmac_sha2_512_init: what?");
1106 state
->foo
= (void *)_MALLOC(128 + 128 + sizeof(SHA512_CTX
),
1110 bzero(state
->foo
, 128 + 128 + sizeof(SHA512_CTX
));
1112 ipad
= (u_char
*)state
->foo
;
1113 opad
= (u_char
*)(ipad
+ 128);
1114 ctxt
= (SHA512_CTX
*)(void *)(opad
+ 128);
1116 /* compress the key if necessery */
1117 if (128 < _KEYLEN(state
->sav
->key_auth
)) {
1118 bzero(tk
, sizeof(tk
));
1119 bzero(ctxt
, sizeof(*ctxt
));
1121 SHA512_Update(ctxt
, (const u_int8_t
*) _KEYBUF(state
->sav
->key_auth
),
1122 _KEYLEN(state
->sav
->key_auth
));
1123 SHA512_Final(&tk
[0], ctxt
);
1125 keylen
= sizeof(tk
) < 128 ? sizeof(tk
) : 128;
1127 key
= (u_char
*) _KEYBUF(state
->sav
->key_auth
);
1128 keylen
= _KEYLEN(state
->sav
->key_auth
);
1133 bcopy(key
, ipad
, keylen
);
1134 bcopy(key
, opad
, keylen
);
1135 for (i
= 0; i
< 128; i
++) {
1140 bzero(ctxt
, sizeof(*ctxt
));
1142 SHA512_Update(ctxt
, ipad
, 128);
1148 ah_hmac_sha2_512_loop(state
, addr
, len
)
1149 struct ah_algorithm_state
*state
;
1155 if (!state
|| !state
->foo
)
1156 panic("ah_hmac_sha2_512_loop: what?");
1158 ctxt
= (SHA512_CTX
*)(void *)(((u_char
*)state
->foo
) + 256);
1159 SHA512_Update(ctxt
, (const u_int8_t
*) addr
, (size_t)len
);
1163 ah_hmac_sha2_512_result(state
, addr
, l
)
1164 struct ah_algorithm_state
*state
;
1168 u_char digest
[SHA512_DIGEST_LENGTH
] __attribute__((aligned(4)));
1173 if (!state
|| !state
->foo
)
1174 panic("ah_hmac_sha2_512_result: what?");
1176 ipad
= (u_char
*)state
->foo
;
1177 opad
= (u_char
*)(ipad
+ 128);
1178 ctxt
= (SHA512_CTX
*)(void *)(opad
+ 128);
1180 SHA512_Final((u_int8_t
*)digest
, ctxt
);
1183 SHA512_Update(ctxt
, opad
, 128);
1184 SHA512_Update(ctxt
, (const u_int8_t
*)digest
, sizeof(digest
));
1185 SHA512_Final((u_int8_t
*)digest
, ctxt
);
1187 bcopy(&digest
[0], (void *)addr
, sizeof(digest
) > l
? l
: sizeof(digest
));
1189 FREE(state
->foo
, M_TEMP
);
1191 #endif /* AH_ALL_CRYPTO */
1193 /*------------------------------------------------------------*/
1196 * go generate the checksum.
1199 ah_update_mbuf(m
, off
, len
, algo
, algos
)
1203 const struct ah_algorithm
*algo
;
1204 struct ah_algorithm_state
*algos
;
1209 /* easy case first */
1210 if (off
+ len
<= m
->m_len
) {
1211 (algo
->update
)(algos
, mtod(m
, caddr_t
) + off
, len
);
1215 for (n
= m
; n
; n
= n
->m_next
) {
1223 panic("ah_update_mbuf: wrong offset specified");
1225 for (/*nothing*/; n
&& len
> 0; n
= n
->m_next
) {
1228 if (n
->m_len
- off
< len
)
1229 tlen
= n
->m_len
- off
;
1233 (algo
->update
)(algos
, mtod(n
, caddr_t
) + off
, tlen
);
1242 * Go generate the checksum. This function won't modify the mbuf chain
1245 * NOTE: the function does not free mbuf on failure.
1246 * Don't use m_copy(), it will try to share cluster mbuf by using refcnt.
1249 ah4_calccksum(m
, ahdat
, len
, algo
, sav
)
1253 const struct ah_algorithm
*algo
;
1254 struct secasvar
*sav
;
1258 size_t advancewidth
;
1259 struct ah_algorithm_state algos
;
1260 u_char sumbuf
[AH_MAXSUMSIZE
] __attribute__((aligned(4)));
1263 struct mbuf
*n
= NULL
;
1265 if ((m
->m_flags
& M_PKTHDR
) == 0)
1269 hdrtype
= -1; /*dummy, it is called IPPROTO_IP*/
1273 error
= (algo
->init
)(&algos
, sav
);
1277 advancewidth
= 0; /*safety*/
1282 case -1: /*first one only*/
1285 * copy ip hdr, modify to fit the AH checksum rule,
1286 * then take a checksum.
1291 m_copydata(m
, off
, sizeof(iphdr
), (caddr_t
)&iphdr
);
1293 hlen
= IP_VHL_HL(iphdr
.ip_vhl
) << 2;
1295 hlen
= iphdr
.ip_hl
<< 2;
1298 iphdr
.ip_sum
= htons(0);
1299 if (ip4_ah_cleartos
)
1301 iphdr
.ip_off
= htons(ntohs(iphdr
.ip_off
) & ip4_ah_offsetmask
);
1302 (algo
->update
)(&algos
, (caddr_t
)&iphdr
, sizeof(struct ip
));
1304 if (hlen
!= sizeof(struct ip
)) {
1308 if (hlen
> MCLBYTES
) {
1312 MGET(n
, M_DONTWAIT
, MT_DATA
);
1313 if (n
&& hlen
> MLEN
) {
1314 MCLGET(n
, M_DONTWAIT
);
1315 if ((n
->m_flags
& M_EXT
) == 0) {
1324 m_copydata(m
, off
, hlen
, mtod(n
, caddr_t
));
1327 * IP options processing.
1328 * See RFC2402 appendix A.
1330 p
= mtod(n
, u_char
*);
1331 i
= sizeof(struct ip
);
1333 if (i
+ IPOPT_OPTVAL
>= hlen
) {
1334 ipseclog((LOG_ERR
, "ah4_calccksum: "
1335 "invalid IP option\n"));
1339 if (p
[i
+ IPOPT_OPTVAL
] == IPOPT_EOL
||
1340 p
[i
+ IPOPT_OPTVAL
] == IPOPT_NOP
||
1341 i
+ IPOPT_OLEN
< hlen
)
1345 "ah4_calccksum: invalid IP option "
1347 p
[i
+ IPOPT_OPTVAL
]));
1353 switch (p
[i
+ IPOPT_OPTVAL
]) {
1359 case IPOPT_SECURITY
: /* 0x82 */
1360 case 0x85: /* Extended security */
1361 case 0x86: /* Commercial security */
1362 case 0x94: /* Router alert */
1363 case 0x95: /* RFC1770 */
1364 l
= p
[i
+ IPOPT_OLEN
];
1370 l
= p
[i
+ IPOPT_OLEN
];
1376 if (l
< 1 || hlen
- i
< l
) {
1379 "ah4_calccksum: invalid IP option "
1380 "(type=%02x len=%02x)\n",
1381 p
[i
+ IPOPT_OPTVAL
],
1382 p
[i
+ IPOPT_OLEN
]));
1388 if (p
[i
+ IPOPT_OPTVAL
] == IPOPT_EOL
)
1393 p
= mtod(n
, u_char
*) + sizeof(struct ip
);
1394 (algo
->update
)(&algos
, (caddr_t
)p
, hlen
- sizeof(struct ip
));
1400 hdrtype
= (iphdr
.ip_p
) & 0xff;
1401 advancewidth
= hlen
;
1412 m_copydata(m
, off
, sizeof(ah
), (caddr_t
)&ah
);
1413 hdrsiz
= (sav
->flags
& SADB_X_EXT_OLD
)
1415 : sizeof(struct newah
);
1416 siz
= (*algo
->sumsiz
)(sav
);
1417 totlen
= (ah
.ah_len
+ 2) << 2;
1420 * special treatment is necessary for the first one, not others
1423 if (totlen
> m
->m_pkthdr
.len
- off
||
1424 totlen
> MCLBYTES
) {
1428 MGET(n
, M_DONTWAIT
, MT_DATA
);
1429 if (n
&& totlen
> MLEN
) {
1430 MCLGET(n
, M_DONTWAIT
);
1431 if ((n
->m_flags
& M_EXT
) == 0) {
1440 m_copydata(m
, off
, totlen
, mtod(n
, caddr_t
));
1442 bzero(mtod(n
, caddr_t
) + hdrsiz
, siz
);
1443 (algo
->update
)(&algos
, mtod(n
, caddr_t
), n
->m_len
);
1447 ah_update_mbuf(m
, off
, totlen
, algo
, &algos
);
1450 hdrtype
= ah
.ah_nxt
;
1451 advancewidth
= totlen
;
1456 ah_update_mbuf(m
, off
, m
->m_pkthdr
.len
- off
, algo
, &algos
);
1457 advancewidth
= m
->m_pkthdr
.len
- off
;
1461 off
+= advancewidth
;
1462 if (off
< m
->m_pkthdr
.len
)
1465 if (len
< (*algo
->sumsiz
)(sav
)) {
1470 (algo
->result
)(&algos
, (caddr_t
) &sumbuf
[0], sizeof(sumbuf
));
1471 bcopy(&sumbuf
[0], ahdat
, (*algo
->sumsiz
)(sav
));
1486 * Go generate the checksum. This function won't modify the mbuf chain
1489 * NOTE: the function does not free mbuf on failure.
1490 * Don't use m_copy(), it will try to share cluster mbuf by using refcnt.
1493 ah6_calccksum(m
, ahdat
, len
, algo
, sav
)
1497 const struct ah_algorithm
*algo
;
1498 struct secasvar
*sav
;
1502 struct mbuf
*n
= NULL
;
1505 struct ah_algorithm_state algos
;
1506 u_char sumbuf
[AH_MAXSUMSIZE
] __attribute__((aligned(4)));
1508 if ((m
->m_flags
& M_PKTHDR
) == 0)
1511 error
= (algo
->init
)(&algos
, sav
);
1516 proto
= IPPROTO_IPV6
;
1521 newoff
= ip6_nexthdr(m
, off
, proto
, &nxt
);
1523 newoff
= m
->m_pkthdr
.len
;
1524 else if (newoff
<= off
) {
1532 * special treatment is necessary for the first one, not others
1535 struct ip6_hdr ip6copy
;
1537 if (newoff
- off
!= sizeof(struct ip6_hdr
)) {
1542 m_copydata(m
, off
, newoff
- off
, (caddr_t
)&ip6copy
);
1544 ip6copy
.ip6_flow
= 0;
1545 ip6copy
.ip6_vfc
&= ~IPV6_VERSION_MASK
;
1546 ip6copy
.ip6_vfc
|= IPV6_VERSION
;
1547 ip6copy
.ip6_hlim
= 0;
1548 if (IN6_IS_ADDR_LINKLOCAL(&ip6copy
.ip6_src
))
1549 ip6copy
.ip6_src
.s6_addr16
[1] = 0x0000;
1550 if (IN6_IS_ADDR_LINKLOCAL(&ip6copy
.ip6_dst
))
1551 ip6copy
.ip6_dst
.s6_addr16
[1] = 0x0000;
1552 (algo
->update
)(&algos
, (caddr_t
)&ip6copy
,
1553 sizeof(struct ip6_hdr
));
1555 newoff
= m
->m_pkthdr
.len
;
1556 ah_update_mbuf(m
, off
, m
->m_pkthdr
.len
- off
, algo
,
1566 hdrsiz
= (sav
->flags
& SADB_X_EXT_OLD
)
1568 : sizeof(struct newah
);
1569 siz
= (*algo
->sumsiz
)(sav
);
1572 * special treatment is necessary for the first one, not others
1575 if (newoff
- off
> MCLBYTES
) {
1579 MGET(n
, M_DONTWAIT
, MT_DATA
);
1580 if (n
&& newoff
- off
> MLEN
) {
1581 MCLGET(n
, M_DONTWAIT
);
1582 if ((n
->m_flags
& M_EXT
) == 0) {
1591 m_copydata(m
, off
, newoff
- off
, mtod(n
, caddr_t
));
1592 n
->m_len
= newoff
- off
;
1593 bzero(mtod(n
, caddr_t
) + hdrsiz
, siz
);
1594 (algo
->update
)(&algos
, mtod(n
, caddr_t
), n
->m_len
);
1598 ah_update_mbuf(m
, off
, newoff
- off
, algo
, &algos
);
1603 case IPPROTO_HOPOPTS
:
1604 case IPPROTO_DSTOPTS
:
1606 struct ip6_ext
*ip6e
;
1608 u_int8_t
*p
, *optend
, *optp
;
1610 if (newoff
- off
> MCLBYTES
) {
1614 MGET(n
, M_DONTWAIT
, MT_DATA
);
1615 if (n
&& newoff
- off
> MLEN
) {
1616 MCLGET(n
, M_DONTWAIT
);
1617 if ((n
->m_flags
& M_EXT
) == 0) {
1626 m_copydata(m
, off
, newoff
- off
, mtod(n
, caddr_t
));
1627 n
->m_len
= newoff
- off
;
1629 ip6e
= mtod(n
, struct ip6_ext
*);
1630 hdrlen
= (ip6e
->ip6e_len
+ 1) << 3;
1631 if (newoff
- off
< hdrlen
) {
1637 p
= mtod(n
, u_int8_t
*);
1638 optend
= p
+ hdrlen
;
1641 * ICV calculation for the options header including all
1642 * options. This part is a little tricky since there are
1643 * two type of options; mutable and immutable. We try to
1644 * null-out mutable ones here.
1647 while (optp
< optend
) {
1648 if (optp
[0] == IP6OPT_PAD1
)
1651 if (optp
+ 2 > optend
) {
1657 optlen
= optp
[1] + 2;
1659 if (optp
[0] & IP6OPT_MUTABLE
)
1660 bzero(optp
+ 2, optlen
- 2);
1666 (algo
->update
)(&algos
, mtod(n
, caddr_t
), n
->m_len
);
1672 case IPPROTO_ROUTING
:
1674 * For an input packet, we can just calculate `as is'.
1675 * For an output packet, we assume ip6_output have already
1676 * made packet how it will be received at the final
1682 ah_update_mbuf(m
, off
, newoff
- off
, algo
, &algos
);
1686 if (newoff
< m
->m_pkthdr
.len
) {
1692 if (len
< (*algo
->sumsiz
)(sav
)) {
1697 (algo
->result
)(&algos
, (caddr_t
) &sumbuf
[0], sizeof(sumbuf
));
1698 bcopy(&sumbuf
[0], ahdat
, (*algo
->sumsiz
)(sav
));