1 /* $NetBSD: oakley.c,v 1.9.6.2 2007/04/04 13:08:28 vanhu Exp $ */
3 /* Id: oakley.c,v 1.32 2006/05/26 12:19:46 manubsd Exp */
6 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the project nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 #include <sys/types.h>
37 #include <sys/param.h>
38 #include <sys/socket.h> /* XXX for subjectaltname */
39 #include <netinet/in.h> /* XXX for subjectaltname */
41 #include <openssl/pkcs7.h>
42 #include <openssl/x509.h>
48 #include <arpa/inet.h>
49 #include <TargetConditionals.h>
51 #if TIME_WITH_SYS_TIME
52 # include <sys/time.h>
56 # include <sys/time.h>
72 #include "isakmp_var.h"
75 #include "isakmp_xauth.h"
76 #include "isakmp_cfg.h"
81 #include "localconf.h"
84 #include "ipsec_doi.h"
85 #include "algorithm.h"
89 #include "crypto_openssl.h"
91 #include "crypto_cssm.h"
102 #include <CoreFoundation/CoreFoundation.h>
104 #include "remoteconf.h"
105 #include "vpn_control.h"
111 #define OUTBOUND_SA 0
115 #define CERT_CHECKID_FROM_PEER 0
116 #define CERT_CHECKID_FROM_RMCONFIG 1
119 #define INITDHVAL(a, s, d, t) \
122 buf.v = str2val((s), 16, &buf.l); \
123 memset(&a, 0, sizeof(struct dhgroup)); \
125 a.prime = vdup(&buf); \
128 racoon_free(buf.v); \
131 struct dhgroup dh_modp768
;
132 struct dhgroup dh_modp1024
;
133 struct dhgroup dh_modp1536
;
134 struct dhgroup dh_modp2048
;
135 struct dhgroup dh_modp3072
;
136 struct dhgroup dh_modp4096
;
137 struct dhgroup dh_modp6144
;
138 struct dhgroup dh_modp8192
;
141 static int oakley_check_dh_pub
__P((vchar_t
*, vchar_t
**));
142 static int oakley_compute_keymat_x
__P((struct ph2handle
*, int, int));
143 static int get_cert_fromlocal
__P((struct ph1handle
*, int));
144 static int get_plainrsa_fromlocal
__P((struct ph1handle
*, int));
146 static int oakley_check_certid
__P((struct ph1handle
*iph1
, int));
147 static int oakley_check_certid_1
__P((struct ph1handle
*, int, int, void*));
149 static int oakley_check_certid
__P((struct ph1handle
*iph1
));
151 static int check_typeofcertname
__P((int, int));
152 static cert_t
*save_certbuf
__P((struct isakmp_gen
*));
153 static cert_t
*save_certx509
__P((X509
*));
154 static int oakley_padlen
__P((int, int));
157 static int base64toCFData(vchar_t
*, CFDataRef
*);
161 oakley_get_defaultlifetime()
163 return OAKLEY_ATTR_SA_LD_SEC_DEFAULT
;
170 INITDHVAL(dh_modp768
, OAKLEY_PRIME_MODP768
,
171 OAKLEY_ATTR_GRP_DESC_MODP768
, OAKLEY_ATTR_GRP_TYPE_MODP
);
172 INITDHVAL(dh_modp1024
, OAKLEY_PRIME_MODP1024
,
173 OAKLEY_ATTR_GRP_DESC_MODP1024
, OAKLEY_ATTR_GRP_TYPE_MODP
);
174 INITDHVAL(dh_modp1536
, OAKLEY_PRIME_MODP1536
,
175 OAKLEY_ATTR_GRP_DESC_MODP1536
, OAKLEY_ATTR_GRP_TYPE_MODP
);
176 INITDHVAL(dh_modp2048
, OAKLEY_PRIME_MODP2048
,
177 OAKLEY_ATTR_GRP_DESC_MODP2048
, OAKLEY_ATTR_GRP_TYPE_MODP
);
178 INITDHVAL(dh_modp3072
, OAKLEY_PRIME_MODP3072
,
179 OAKLEY_ATTR_GRP_DESC_MODP3072
, OAKLEY_ATTR_GRP_TYPE_MODP
);
180 INITDHVAL(dh_modp4096
, OAKLEY_PRIME_MODP4096
,
181 OAKLEY_ATTR_GRP_DESC_MODP4096
, OAKLEY_ATTR_GRP_TYPE_MODP
);
182 INITDHVAL(dh_modp6144
, OAKLEY_PRIME_MODP6144
,
183 OAKLEY_ATTR_GRP_DESC_MODP6144
, OAKLEY_ATTR_GRP_TYPE_MODP
);
184 INITDHVAL(dh_modp8192
, OAKLEY_PRIME_MODP8192
,
185 OAKLEY_ATTR_GRP_DESC_MODP8192
, OAKLEY_ATTR_GRP_TYPE_MODP
);
191 oakley_dhgrp_free(dhgrp
)
192 struct dhgroup
*dhgrp
;
197 vfree(dhgrp
->curve_a
);
199 vfree(dhgrp
->curve_b
);
207 * The length of the Diffie-Hellman public value MUST be equal to the
208 * length of the prime modulus over which the exponentiation was
209 * performed, prepending zero bits to the value if necessary.
212 oakley_check_dh_pub(prime
, pub0
)
213 vchar_t
*prime
, **pub0
;
216 vchar_t
*pub
= *pub0
;
218 if (prime
->l
== pub
->l
)
221 if (prime
->l
< pub
->l
) {
222 /* what should i do ? */
223 plog(LLV_ERROR
, LOCATION
, NULL
,
224 "invalid public information was generated.\n");
228 /* prime->l > pub->l */
229 tmp
= vmalloc(prime
->l
);
231 plog(LLV_ERROR
, LOCATION
, NULL
,
232 "failed to get DH buffer.\n");
235 memcpy(tmp
->v
+ prime
->l
- pub
->l
, pub
->v
, pub
->l
);
244 * compute sharing secret of DH
245 * IN: *dh, *pub, *priv, *pub_p
249 oakley_dh_compute(dh
, pub
, priv
, pub_p
, gxy
)
250 const struct dhgroup
*dh
;
251 vchar_t
*pub
, *priv
, *pub_p
, **gxy
;
254 struct timeval start
, end
;
256 if ((*gxy
= vmalloc(dh
->prime
->l
)) == NULL
) {
257 plog(LLV_ERROR
, LOCATION
, NULL
,
258 "failed to get DH buffer.\n");
263 gettimeofday(&start
, NULL
);
266 case OAKLEY_ATTR_GRP_TYPE_MODP
:
267 if (eay_dh_compute(dh
->prime
, dh
->gen1
, pub
, priv
, pub_p
, gxy
) < 0) {
268 plog(LLV_ERROR
, LOCATION
, NULL
,
269 "failed to compute dh value.\n");
273 case OAKLEY_ATTR_GRP_TYPE_ECP
:
274 case OAKLEY_ATTR_GRP_TYPE_EC2N
:
275 plog(LLV_ERROR
, LOCATION
, NULL
,
276 "dh type %d isn't supported.\n", dh
->type
);
279 plog(LLV_ERROR
, LOCATION
, NULL
,
280 "invalid dh type %d.\n", dh
->type
);
285 gettimeofday(&end
, NULL
);
286 syslog(LOG_NOTICE
, "%s(%s%d): %8.6f", __func__
,
287 s_attr_isakmp_group(dh
->type
), dh
->prime
->l
<< 3,
288 timedelta(&start
, &end
));
291 plog(LLV_DEBUG
, LOCATION
, NULL
, "compute DH's shared.\n");
292 plogdump(LLV_DEBUG
, (*gxy
)->v
, (*gxy
)->l
);
298 * generate values of DH
303 oakley_dh_generate(dh
, pub
, priv
)
304 const struct dhgroup
*dh
;
305 vchar_t
**pub
, **priv
;
308 struct timeval start
, end
;
309 gettimeofday(&start
, NULL
);
312 case OAKLEY_ATTR_GRP_TYPE_MODP
:
313 if (eay_dh_generate(dh
->prime
, dh
->gen1
, dh
->gen2
, pub
, priv
) < 0) {
314 plog(LLV_ERROR
, LOCATION
, NULL
,
315 "failed to compute dh value.\n");
320 case OAKLEY_ATTR_GRP_TYPE_ECP
:
321 case OAKLEY_ATTR_GRP_TYPE_EC2N
:
322 plog(LLV_ERROR
, LOCATION
, NULL
,
323 "dh type %d isn't supported.\n", dh
->type
);
326 plog(LLV_ERROR
, LOCATION
, NULL
,
327 "invalid dh type %d.\n", dh
->type
);
332 gettimeofday(&end
, NULL
);
333 syslog(LOG_NOTICE
, "%s(%s%d): %8.6f", __func__
,
334 s_attr_isakmp_group(dh
->type
), dh
->prime
->l
<< 3,
335 timedelta(&start
, &end
));
338 if (oakley_check_dh_pub(dh
->prime
, pub
) != 0)
341 plog(LLV_DEBUG
, LOCATION
, NULL
, "compute DH's private.\n");
342 plogdump(LLV_DEBUG
, (*priv
)->v
, (*priv
)->l
);
343 plog(LLV_DEBUG
, LOCATION
, NULL
, "compute DH's public.\n");
344 plogdump(LLV_DEBUG
, (*pub
)->v
, (*pub
)->l
);
350 * copy pre-defined dhgroup values.
353 oakley_setdhgroup(group
, dhgrp
)
355 struct dhgroup
**dhgrp
;
359 *dhgrp
= NULL
; /* just make sure, initialize */
361 g
= alg_oakley_dhdef_group(group
);
363 plog(LLV_ERROR
, LOCATION
, NULL
,
364 "invalid DH parameter grp=%d.\n", group
);
368 if (!g
->type
|| !g
->prime
|| !g
->gen1
) {
370 plog(LLV_ERROR
, LOCATION
, NULL
,
371 "unsupported DH parameters grp=%d.\n", group
);
375 *dhgrp
= racoon_calloc(1, sizeof(struct dhgroup
));
376 if (*dhgrp
== NULL
) {
377 plog(LLV_ERROR
, LOCATION
, NULL
,
378 "failed to get DH buffer.\n");
382 /* set defined dh vlaues */
383 memcpy(*dhgrp
, g
, sizeof(*g
));
384 (*dhgrp
)->prime
= vdup(g
->prime
);
392 * NOTE: we do not support prf with different input/output bitwidth,
393 * so we do not implement RFC2409 Appendix B (DOORAK-MAC example) in
394 * oakley_compute_keymat(). If you add support for such prf function,
395 * modify oakley_compute_keymat() accordingly.
398 oakley_prf(key
, buf
, iph1
)
400 struct ph1handle
*iph1
;
405 if (iph1
->approval
== NULL
) {
407 * it's before negotiating hash algorithm.
408 * We use md5 as default.
410 type
= OAKLEY_ATTR_HASH_ALG_MD5
;
412 type
= iph1
->approval
->hashtype
;
414 res
= alg_oakley_hmacdef_one(type
, key
, buf
);
416 plog(LLV_ERROR
, LOCATION
, NULL
,
417 "invalid hmac algorithm %d.\n", type
);
428 oakley_hash(buf
, iph1
)
430 struct ph1handle
*iph1
;
435 if (iph1
->approval
== NULL
) {
437 * it's before negotiating hash algorithm.
438 * We use md5 as default.
440 type
= OAKLEY_ATTR_HASH_ALG_MD5
;
442 type
= iph1
->approval
->hashtype
;
444 res
= alg_oakley_hashdef_one(type
, buf
);
446 plog(LLV_ERROR
, LOCATION
, NULL
,
447 "invalid hash algorithm %d.\n", type
);
456 * see seciton 5.5 Phase 2 - Quick Mode in isakmp-oakley-05.
459 oakley_compute_keymat(iph2
, side
)
460 struct ph2handle
*iph2
;
465 /* compute sharing secret of DH when PFS */
466 if (iph2
->approval
->pfs_group
&& iph2
->dhpub_p
) {
467 if (oakley_dh_compute(iph2
->pfsgrp
, iph2
->dhpub
,
468 iph2
->dhpriv
, iph2
->dhpub_p
, &iph2
->dhgxy
) < 0)
473 if (oakley_compute_keymat_x(iph2
, side
, INBOUND_SA
) < 0
474 || oakley_compute_keymat_x(iph2
, side
, OUTBOUND_SA
) < 0)
477 plog(LLV_DEBUG
, LOCATION
, NULL
, "KEYMAT computed.\n");
487 * KEYMAT = prf(SKEYID_d, protocol | SPI | Ni_b | Nr_b).
488 * If PFS is desired and KE payloads were exchanged,
489 * KEYMAT = prf(SKEYID_d, g(qm)^xy | protocol | SPI | Ni_b | Nr_b)
491 * NOTE: we do not support prf with different input/output bitwidth,
492 * so we do not implement RFC2409 Appendix B (DOORAK-MAC example).
495 oakley_compute_keymat_x(iph2
, side
, sa_dir
)
496 struct ph2handle
*iph2
;
500 vchar_t
*buf
= NULL
, *res
= NULL
, *bp
;
505 int dupkeymat
; /* generate K[1-dupkeymat] */
508 int encklen
, authklen
, l
;
510 pfs
= ((iph2
->approval
->pfs_group
&& iph2
->dhgxy
) ? 1 : 0);
512 len
= pfs
? iph2
->dhgxy
->l
: 0;
514 + sizeof(u_int32_t
) /* XXX SPI size */
519 plog(LLV_ERROR
, LOCATION
, NULL
,
520 "failed to get keymat buffer.\n");
524 for (pr
= iph2
->approval
->head
; pr
!= NULL
; pr
= pr
->next
) {
529 memcpy(p
, iph2
->dhgxy
->v
, iph2
->dhgxy
->l
);
536 memcpy(p
, (sa_dir
== INBOUND_SA
? &pr
->spi
: &pr
->spi_p
),
538 p
+= sizeof(pr
->spi
);
540 bp
= (side
== INITIATOR
? iph2
->nonce
: iph2
->nonce_p
);
541 memcpy(p
, bp
->v
, bp
->l
);
544 bp
= (side
== INITIATOR
? iph2
->nonce_p
: iph2
->nonce
);
545 memcpy(p
, bp
->v
, bp
->l
);
549 plog(LLV_DEBUG
, LOCATION
, NULL
, "KEYMAT compute with\n");
550 plogdump(LLV_DEBUG
, buf
->v
, buf
->l
);
553 res
= oakley_prf(iph2
->ph1
->skeyid_d
, buf
, iph2
->ph1
);
557 /* compute key length needed */
558 encklen
= authklen
= 0;
559 switch (pr
->proto_id
) {
560 case IPSECDOI_PROTO_IPSEC_ESP
:
561 for (tr
= pr
->head
; tr
; tr
= tr
->next
) {
562 l
= alg_ipsec_encdef_keylen(tr
->trns_id
,
567 l
= alg_ipsec_hmacdef_hashlen(tr
->authtype
);
572 case IPSECDOI_PROTO_IPSEC_AH
:
573 for (tr
= pr
->head
; tr
; tr
= tr
->next
) {
574 l
= alg_ipsec_hmacdef_hashlen(tr
->trns_id
);
582 plog(LLV_DEBUG
, LOCATION
, NULL
, "encklen=%d authklen=%d\n",
585 dupkeymat
= (encklen
+ authklen
) / 8 / res
->l
;
586 dupkeymat
+= 2; /* safety mergin */
589 plog(LLV_DEBUG
, LOCATION
, NULL
,
590 "generating %zu bits of key (dupkeymat=%d)\n",
591 dupkeymat
* 8 * res
->l
, dupkeymat
);
592 if (0 < --dupkeymat
) {
593 vchar_t
*prev
= res
; /* K(n-1) */
594 vchar_t
*seed
= NULL
; /* seed for Kn */
598 * generating long key (isakmp-oakley-08 5.5)
599 * KEYMAT = K1 | K2 | K3 | ...
601 * src = [ g(qm)^xy | ] protocol | SPI | Ni_b | Nr_b
602 * K1 = prf(SKEYID_d, src)
603 * K2 = prf(SKEYID_d, K1 | src)
604 * K3 = prf(SKEYID_d, K2 | src)
605 * Kn = prf(SKEYID_d, K(n-1) | src)
607 plog(LLV_DEBUG
, LOCATION
, NULL
,
608 "generating K1...K%d for KEYMAT.\n",
611 seed
= vmalloc(prev
->l
+ buf
->l
);
613 plog(LLV_ERROR
, LOCATION
, NULL
,
614 "failed to get keymat buffer.\n");
615 if (prev
&& prev
!= res
)
620 while (dupkeymat
--) {
621 vchar_t
*this = NULL
; /* Kn */
624 memcpy(seed
->v
, prev
->v
, prev
->l
);
625 memcpy(seed
->v
+ prev
->l
, buf
->v
, buf
->l
);
626 this = oakley_prf(iph2
->ph1
->skeyid_d
, seed
,
629 plog(LLV_ERROR
, LOCATION
, NULL
,
630 "oakley_prf memory overflow\n");
631 if (prev
&& prev
!= res
)
638 update_prev
= (prev
&& prev
== res
) ? 1 : 0;
641 res
= vrealloc(res
, l
+ this->l
);
647 plog(LLV_ERROR
, LOCATION
, NULL
,
648 "failed to get keymat buffer.\n");
649 if (prev
&& prev
!= res
)
655 memcpy(res
->v
+ l
, this->v
, this->l
);
657 if (prev
&& prev
!= res
)
663 if (prev
&& prev
!= res
)
668 plogdump(LLV_DEBUG
, res
->v
, res
->l
);
670 if (sa_dir
== INBOUND_SA
)
681 for (pr
= iph2
->approval
->head
; pr
!= NULL
; pr
= pr
->next
) {
703 * NOTE: Must terminate by NULL.
706 oakley_compute_hashx(struct ph1handle
*iph1
, ...)
715 /* get buffer length */
718 while ((s
= va_arg(ap
, vchar_t
*)) != NULL
) {
725 plog(LLV_ERROR
, LOCATION
, NULL
,
726 "failed to get hash buffer\n");
733 while ((s
= va_arg(ap
, char *)) != NULL
) {
734 memcpy(p
, s
->v
, s
->l
);
739 plog(LLV_DEBUG
, LOCATION
, NULL
, "HASH with: \n");
740 plogdump(LLV_DEBUG
, buf
->v
, buf
->l
);
743 res
= oakley_prf(iph1
->skeyid_a
, buf
, iph1
);
748 plog(LLV_DEBUG
, LOCATION
, NULL
, "HASH computed:\n");
749 plogdump(LLV_DEBUG
, res
->v
, res
->l
);
756 * compute HASH(3) prf(SKEYID_a, 0 | M-ID | Ni_b | Nr_b)
757 * see seciton 5.5 Phase 2 - Quick Mode in isakmp-oakley-05.
760 oakley_compute_hash3(iph1
, msgid
, body
)
761 struct ph1handle
*iph1
;
765 vchar_t
*buf
= 0, *res
= 0;
770 len
= 1 + sizeof(u_int32_t
) + body
->l
;
773 plog(LLV_DEBUG
, LOCATION
, NULL
,
774 "failed to get hash buffer\n");
780 memcpy(buf
->v
+ 1, (char *)&msgid
, sizeof(msgid
));
782 memcpy(buf
->v
+ 1 + sizeof(u_int32_t
), body
->v
, body
->l
);
784 plog(LLV_DEBUG
, LOCATION
, NULL
, "HASH with: \n");
785 plogdump(LLV_DEBUG
, buf
->v
, buf
->l
);
788 res
= oakley_prf(iph1
->skeyid_a
, buf
, iph1
);
794 plog(LLV_DEBUG
, LOCATION
, NULL
, "HASH computed:\n");
795 plogdump(LLV_DEBUG
, res
->v
, res
->l
);
804 * compute HASH type of prf(SKEYID_a, M-ID | buffer)
806 * for quick mode HASH(1):
807 * prf(SKEYID_a, M-ID | SA | Ni [ | KE ] [ | IDci | IDcr ])
808 * for quick mode HASH(2):
809 * prf(SKEYID_a, M-ID | Ni_b | SA | Nr [ | KE ] [ | IDci | IDcr ])
810 * for Informational exchange:
811 * prf(SKEYID_a, M-ID | N/D)
814 oakley_compute_hash1(iph1
, msgid
, body
)
815 struct ph1handle
*iph1
;
819 vchar_t
*buf
= NULL
, *res
= NULL
;
825 len
= sizeof(u_int32_t
) + body
->l
;
828 plog(LLV_DEBUG
, LOCATION
, NULL
,
829 "failed to get hash buffer\n");
835 memcpy(buf
->v
, (char *)&msgid
, sizeof(msgid
));
836 p
+= sizeof(u_int32_t
);
838 memcpy(p
, body
->v
, body
->l
);
840 plog(LLV_DEBUG
, LOCATION
, NULL
, "HASH with:\n");
841 plogdump(LLV_DEBUG
, buf
->v
, buf
->l
);
844 res
= oakley_prf(iph1
->skeyid_a
, buf
, iph1
);
850 plog(LLV_DEBUG
, LOCATION
, NULL
, "HASH computed:\n");
851 plogdump(LLV_DEBUG
, res
->v
, res
->l
);
860 * compute phase1 HASH
862 * I-digest = prf(SKEYID, g^i | g^r | CKY-I | CKY-R | SAi_b | ID_i1_b)
863 * R-digest = prf(SKEYID, g^r | g^i | CKY-R | CKY-I | SAi_b | ID_r1_b)
864 * for gssapi, also include all GSS tokens, and call gss_wrap on the result
867 oakley_ph1hash_common(iph1
, sw
)
868 struct ph1handle
*iph1
;
871 vchar_t
*buf
= NULL
, *res
= NULL
, *bp
;
876 vchar_t
*gsstokens
= NULL
;
882 + sizeof(cookie_t
) * 2
884 + (sw
== GENERATE
? iph1
->id
->l
: iph1
->id_p
->l
);
887 if (AUTHMETHOD(iph1
) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
) {
888 if (iph1
->gi_i
!= NULL
&& iph1
->gi_r
!= NULL
) {
889 bp
= (sw
== GENERATE
? iph1
->gi_i
: iph1
->gi_r
);
893 gssapi_get_itokens(iph1
, &gsstokens
);
895 gssapi_get_rtokens(iph1
, &gsstokens
);
896 if (gsstokens
== NULL
)
904 plog(LLV_ERROR
, LOCATION
, NULL
,
905 "failed to get hash buffer\n");
911 bp
= (sw
== GENERATE
? iph1
->dhpub
: iph1
->dhpub_p
);
912 memcpy(p
, bp
->v
, bp
->l
);
915 bp
= (sw
== GENERATE
? iph1
->dhpub_p
: iph1
->dhpub
);
916 memcpy(p
, bp
->v
, bp
->l
);
919 if (iph1
->side
== INITIATOR
)
920 bp2
= (sw
== GENERATE
?
921 (char *)&iph1
->index
.i_ck
: (char *)&iph1
->index
.r_ck
);
923 bp2
= (sw
== GENERATE
?
924 (char *)&iph1
->index
.r_ck
: (char *)&iph1
->index
.i_ck
);
925 bl
= sizeof(cookie_t
);
929 if (iph1
->side
== INITIATOR
)
930 bp2
= (sw
== GENERATE
?
931 (char *)&iph1
->index
.r_ck
: (char *)&iph1
->index
.i_ck
);
933 bp2
= (sw
== GENERATE
?
934 (char *)&iph1
->index
.i_ck
: (char *)&iph1
->index
.r_ck
);
935 bl
= sizeof(cookie_t
);
940 memcpy(p
, bp
->v
, bp
->l
);
943 bp
= (sw
== GENERATE
? iph1
->id
: iph1
->id_p
);
944 memcpy(p
, bp
->v
, bp
->l
);
948 if (AUTHMETHOD(iph1
) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
) {
949 if (iph1
->gi_i
!= NULL
&& iph1
->gi_r
!= NULL
) {
950 bp
= (sw
== GENERATE
? iph1
->gi_i
: iph1
->gi_r
);
951 memcpy(p
, bp
->v
, bp
->l
);
954 memcpy(p
, gsstokens
->v
, gsstokens
->l
);
959 plog(LLV_DEBUG
, LOCATION
, NULL
, "HASH with:\n");
960 plogdump(LLV_DEBUG
, buf
->v
, buf
->l
);
963 res
= oakley_prf(iph1
->skeyid
, buf
, iph1
);
969 plog(LLV_DEBUG
, LOCATION
, NULL
, "HASH (%s) computed:\n",
970 iph1
->side
== INITIATOR
? "init" : "resp");
971 plogdump(LLV_DEBUG
, res
->v
, res
->l
);
977 if (gsstokens
!= NULL
)
984 * compute HASH_I on base mode.
986 * HASH_I = prf(SKEYID, g^xi | CKY-I | CKY-R | SAi_b | IDii_b)
988 * HASH_I = prf(hash(Ni_b | Nr_b), g^xi | CKY-I | CKY-R | SAi_b | IDii_b)
991 oakley_ph1hash_base_i(iph1
, sw
)
992 struct ph1handle
*iph1
;
995 vchar_t
*buf
= NULL
, *res
= NULL
, *bp
;
996 vchar_t
*hashkey
= NULL
;
997 vchar_t
*hash
= NULL
; /* for signature mode */
1003 if (iph1
->etype
!= ISAKMP_ETYPE_BASE
) {
1004 plog(LLV_ERROR
, LOCATION
, NULL
,
1005 "invalid etype for this hash function\n");
1009 switch (AUTHMETHOD(iph1
)) {
1010 case OAKLEY_ATTR_AUTH_METHOD_PSKEY
:
1011 case OAKLEY_ATTR_AUTH_METHOD_RSAENC
:
1012 case OAKLEY_ATTR_AUTH_METHOD_RSAREV
:
1013 #ifdef ENABLE_HYBRID
1014 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I
:
1015 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R
:
1016 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I
:
1017 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R
:
1018 case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I
:
1019 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R
:
1021 if (iph1
->skeyid
== NULL
) {
1022 plog(LLV_ERROR
, LOCATION
, NULL
, "no SKEYID found.\n");
1025 hashkey
= iph1
->skeyid
;
1028 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG
:
1029 case OAKLEY_ATTR_AUTH_METHOD_RSASIG
:
1031 case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
:
1033 #ifdef ENABLE_HYBRID
1034 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I
:
1035 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R
:
1036 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I
:
1037 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R
:
1038 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I
:
1039 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R
:
1040 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I
:
1041 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R
:
1043 /* make hash for seed */
1044 len
= iph1
->nonce
->l
+ iph1
->nonce_p
->l
;
1047 plog(LLV_ERROR
, LOCATION
, NULL
,
1048 "failed to get hash buffer\n");
1053 bp
= (sw
== GENERATE
? iph1
->nonce_p
: iph1
->nonce
);
1054 memcpy(p
, bp
->v
, bp
->l
);
1057 bp
= (sw
== GENERATE
? iph1
->nonce
: iph1
->nonce_p
);
1058 memcpy(p
, bp
->v
, bp
->l
);
1061 hash
= oakley_hash(buf
, iph1
);
1071 plog(LLV_ERROR
, LOCATION
, NULL
,
1072 "not supported authentication method %d\n",
1073 iph1
->approval
->authmethod
);
1078 len
= (sw
== GENERATE
? iph1
->dhpub
->l
: iph1
->dhpub_p
->l
)
1079 + sizeof(cookie_t
) * 2
1081 + (sw
== GENERATE
? iph1
->id
->l
: iph1
->id_p
->l
);
1084 plog(LLV_ERROR
, LOCATION
, NULL
,
1085 "failed to get hash buffer\n");
1090 bp
= (sw
== GENERATE
? iph1
->dhpub
: iph1
->dhpub_p
);
1091 memcpy(p
, bp
->v
, bp
->l
);
1094 memcpy(p
, &iph1
->index
.i_ck
, sizeof(cookie_t
));
1095 p
+= sizeof(cookie_t
);
1096 memcpy(p
, &iph1
->index
.r_ck
, sizeof(cookie_t
));
1097 p
+= sizeof(cookie_t
);
1099 memcpy(p
, iph1
->sa
->v
, iph1
->sa
->l
);
1102 bp
= (sw
== GENERATE
? iph1
->id
: iph1
->id_p
);
1103 memcpy(p
, bp
->v
, bp
->l
);
1106 plog(LLV_DEBUG
, LOCATION
, NULL
, "HASH_I with:\n");
1107 plogdump(LLV_DEBUG
, buf
->v
, buf
->l
);
1110 res
= oakley_prf(hashkey
, buf
, iph1
);
1116 plog(LLV_DEBUG
, LOCATION
, NULL
, "HASH_I computed:\n");
1117 plogdump(LLV_DEBUG
, res
->v
, res
->l
);
1128 * compute HASH_R on base mode for signature method.
1130 * HASH_R = prf(hash(Ni_b | Nr_b), g^xi | g^xr | CKY-I | CKY-R | SAi_b | IDii_b)
1133 oakley_ph1hash_base_r(iph1
, sw
)
1134 struct ph1handle
*iph1
;
1137 vchar_t
*buf
= NULL
, *res
= NULL
, *bp
;
1138 vchar_t
*hash
= NULL
;
1144 if (iph1
->etype
!= ISAKMP_ETYPE_BASE
) {
1145 plog(LLV_ERROR
, LOCATION
, NULL
,
1146 "invalid etype for this hash function\n");
1150 switch(AUTHMETHOD(iph1
)) {
1151 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG
:
1152 case OAKLEY_ATTR_AUTH_METHOD_RSASIG
:
1153 #ifdef ENABLE_HYBRID
1154 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I
:
1155 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R
:
1156 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I
:
1157 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R
:
1158 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I
:
1159 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R
:
1160 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I
:
1161 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R
:
1162 case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I
:
1166 plog(LLV_ERROR
, LOCATION
, NULL
,
1167 "not supported authentication method %d\n",
1168 iph1
->approval
->authmethod
);
1173 /* make hash for seed */
1174 len
= iph1
->nonce
->l
+ iph1
->nonce_p
->l
;
1177 plog(LLV_ERROR
, LOCATION
, NULL
,
1178 "failed to get hash buffer\n");
1183 bp
= (sw
== GENERATE
? iph1
->nonce_p
: iph1
->nonce
);
1184 memcpy(p
, bp
->v
, bp
->l
);
1187 bp
= (sw
== GENERATE
? iph1
->nonce
: iph1
->nonce_p
);
1188 memcpy(p
, bp
->v
, bp
->l
);
1191 hash
= oakley_hash(buf
, iph1
);
1197 /* make really hash */
1198 len
= (sw
== GENERATE
? iph1
->dhpub_p
->l
: iph1
->dhpub
->l
)
1199 + (sw
== GENERATE
? iph1
->dhpub
->l
: iph1
->dhpub_p
->l
)
1200 + sizeof(cookie_t
) * 2
1202 + (sw
== GENERATE
? iph1
->id_p
->l
: iph1
->id
->l
);
1205 plog(LLV_ERROR
, LOCATION
, NULL
,
1206 "failed to get hash buffer\n");
1212 bp
= (sw
== GENERATE
? iph1
->dhpub_p
: iph1
->dhpub
);
1213 memcpy(p
, bp
->v
, bp
->l
);
1216 bp
= (sw
== GENERATE
? iph1
->dhpub
: iph1
->dhpub_p
);
1217 memcpy(p
, bp
->v
, bp
->l
);
1220 memcpy(p
, &iph1
->index
.i_ck
, sizeof(cookie_t
));
1221 p
+= sizeof(cookie_t
);
1222 memcpy(p
, &iph1
->index
.r_ck
, sizeof(cookie_t
));
1223 p
+= sizeof(cookie_t
);
1225 memcpy(p
, iph1
->sa
->v
, iph1
->sa
->l
);
1228 bp
= (sw
== GENERATE
? iph1
->id_p
: iph1
->id
);
1229 memcpy(p
, bp
->v
, bp
->l
);
1232 plog(LLV_DEBUG
, LOCATION
, NULL
, "HASH_R with:\n");
1233 plogdump(LLV_DEBUG
, buf
->v
, buf
->l
);
1236 res
= oakley_prf(hash
, buf
, iph1
);
1242 plog(LLV_DEBUG
, LOCATION
, NULL
, "HASH_R computed:\n");
1243 plogdump(LLV_DEBUG
, res
->v
, res
->l
);
1254 * compute each authentication method in phase 1.
1258 * other: error to be reply with notification.
1259 * the value is notification type.
1262 oakley_validate_auth(iph1
)
1263 struct ph1handle
*iph1
;
1265 vchar_t
*my_hash
= NULL
;
1268 vchar_t
*gsshash
= NULL
;
1271 struct timeval start
, end
;
1275 gettimeofday(&start
, NULL
);
1278 switch (AUTHMETHOD(iph1
)) {
1279 case OAKLEY_ATTR_AUTH_METHOD_PSKEY
:
1280 #ifdef ENABLE_HYBRID
1281 case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I
:
1282 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R
:
1288 if (iph1
->id_p
== NULL
|| iph1
->pl_hash
== NULL
) {
1289 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1290 "few isakmp message received.\n");
1291 return ISAKMP_NTYPE_PAYLOAD_MALFORMED
;
1293 #ifdef ENABLE_HYBRID
1294 if (AUTHMETHOD(iph1
) == FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I
&&
1295 ((iph1
->mode_cfg
->flags
& ISAKMP_CFG_VENDORID_XAUTH
) == 0))
1297 plog(LLV_ERROR
, LOCATION
, NULL
, "No SIG was passed, "
1298 "hybrid auth is enabled, "
1299 "but peer is no Xauth compliant\n");
1300 return ISAKMP_NTYPE_SITUATION_NOT_SUPPORTED
;
1304 r_hash
= (caddr_t
)(iph1
->pl_hash
+ 1);
1306 plog(LLV_DEBUG
, LOCATION
, NULL
, "HASH received:\n");
1307 plogdump(LLV_DEBUG
, r_hash
,
1308 ntohs(iph1
->pl_hash
->h
.len
) - sizeof(*iph1
->pl_hash
));
1310 switch (iph1
->etype
) {
1311 case ISAKMP_ETYPE_IDENT
:
1312 case ISAKMP_ETYPE_AGG
:
1313 my_hash
= oakley_ph1hash_common(iph1
, VALIDATE
);
1315 case ISAKMP_ETYPE_BASE
:
1316 if (iph1
->side
== INITIATOR
)
1317 my_hash
= oakley_ph1hash_common(iph1
, VALIDATE
);
1319 my_hash
= oakley_ph1hash_base_i(iph1
, VALIDATE
);
1322 plog(LLV_ERROR
, LOCATION
, NULL
,
1323 "invalid etype %d\n", iph1
->etype
);
1324 return ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE
;
1326 if (my_hash
== NULL
)
1327 return ISAKMP_INTERNAL_ERROR
;
1329 result
= memcmp(my_hash
->v
, r_hash
, my_hash
->l
);
1333 plog(LLV_ERROR
, LOCATION
, NULL
, "HASH mismatched\n");
1334 return ISAKMP_NTYPE_INVALID_HASH_INFORMATION
;
1337 plog(LLV_DEBUG
, LOCATION
, NULL
, "HASH for PSK validated.\n");
1340 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG
:
1341 case OAKLEY_ATTR_AUTH_METHOD_RSASIG
:
1342 #ifdef ENABLE_HYBRID
1343 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I
:
1344 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I
:
1345 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I
:
1346 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R
:
1347 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I
:
1348 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R
:
1355 if (iph1
->id_p
== NULL
) {
1356 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1357 "no ID payload was passed.\n");
1358 return ISAKMP_NTYPE_PAYLOAD_MALFORMED
;
1360 if (iph1
->sig_p
== NULL
) {
1361 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1362 "no SIG payload was passed.\n");
1363 return ISAKMP_NTYPE_PAYLOAD_MALFORMED
;
1366 plog(LLV_DEBUG
, LOCATION
, NULL
, "SIGN passed:\n");
1367 plogdump(LLV_DEBUG
, iph1
->sig_p
->v
, iph1
->sig_p
->l
);
1369 /* get peer's cert */
1370 switch (iph1
->rmconf
->getcert_method
) {
1371 case ISAKMP_GETCERT_PAYLOAD
:
1372 if (iph1
->cert_p
== NULL
) {
1373 plog(LLV_ERROR
, LOCATION
, NULL
,
1374 "no peer's CERT payload found.\n");
1375 return ISAKMP_INTERNAL_ERROR
;
1378 case ISAKMP_GETCERT_LOCALFILE
:
1379 switch (iph1
->rmconf
->certtype
) {
1380 case ISAKMP_CERT_X509SIGN
:
1381 if (iph1
->rmconf
->peerscertfile
== NULL
) {
1382 plog(LLV_ERROR
, LOCATION
, NULL
,
1383 "no peer's CERT file found.\n");
1384 return ISAKMP_INTERNAL_ERROR
;
1387 /* don't use cached cert */
1388 if (iph1
->cert_p
!= NULL
) {
1389 oakley_delcert(iph1
->cert_p
);
1390 iph1
->cert_p
= NULL
;
1393 error
= get_cert_fromlocal(iph1
, 0);
1396 case ISAKMP_CERT_PLAINRSA
:
1397 error
= get_plainrsa_fromlocal(iph1
, 0);
1401 return ISAKMP_INTERNAL_ERROR
;
1403 case ISAKMP_GETCERT_DNS
:
1404 if (iph1
->rmconf
->peerscertfile
!= NULL
) {
1405 plog(LLV_ERROR
, LOCATION
, NULL
,
1406 "why peer's CERT file is defined "
1407 "though getcert method is dns ?\n");
1408 return ISAKMP_INTERNAL_ERROR
;
1411 /* don't use cached cert */
1412 if (iph1
->cert_p
!= NULL
) {
1413 oakley_delcert(iph1
->cert_p
);
1414 iph1
->cert_p
= NULL
;
1417 iph1
->cert_p
= dnssec_getcert(iph1
->id_p
);
1418 if (iph1
->cert_p
== NULL
) {
1419 plog(LLV_ERROR
, LOCATION
, NULL
,
1420 "no CERT RR found.\n");
1421 return ISAKMP_INTERNAL_ERROR
;
1425 plog(LLV_ERROR
, LOCATION
, NULL
,
1426 "invalid getcert_mothod: %d\n",
1427 iph1
->rmconf
->getcert_method
);
1428 return ISAKMP_INTERNAL_ERROR
;
1431 /* compare ID payload and certificate name */
1432 if (iph1
->rmconf
->verify_cert
&&
1434 (error
= oakley_check_certid(iph1
, CERT_CHECKID_FROM_PEER
)) != 0)
1436 (error
= oakley_check_certid(iph1
)) != 0)
1442 /* check configured peers identifier against cert IDs */
1443 /* allows checking of specified ID against multiple ids in the cert */
1444 /* such as multiple domain names */
1445 #if !TARGET_OS_EMBEDDED
1446 if (iph1
->rmconf
->cert_verification_option
== VERIFICATION_OPTION_PEERS_IDENTIFIER
&&
1447 (error
= oakley_check_certid(iph1
, CERT_CHECKID_FROM_RMCONFIG
)) != 0)
1452 /* check cert common name against Open Directory authentication group */
1453 if (iph1
->rmconf
->cert_verification_option
== VERIFICATION_OPTION_OPEN_DIR
) {
1455 vchar_t
*user_id
= NULL
;
1457 user_id
= eay_get_x509_common_name(&iph1
->cert_p
->cert
);
1459 // the following functions will check if user_id == 0
1460 if (open_dir_authorize_id(user_id
, iph1
->rmconf
->open_dir_auth_group
) == 0) {
1461 plog(LLV_ERROR
, LOCATION
, NULL
,
1462 "the peer is not authorized for access.\n");
1464 return ISAKMP_NTYPE_AUTHENTICATION_FAILED
;
1468 plog(LLV_ERROR
, LOCATION
, NULL
,
1469 "the peer is not authorized for access - user ID not found.\n");
1470 return ISAKMP_NTYPE_AUTHENTICATION_FAILED
;
1473 #endif /* HAVE_OPENDIR */
1474 #endif /* __APPLE__ */
1476 /* verify certificate */
1477 if (iph1
->rmconf
->verify_cert
1478 && iph1
->rmconf
->getcert_method
== ISAKMP_GETCERT_PAYLOAD
) {
1479 certtype
= iph1
->rmconf
->certtype
;
1480 #ifdef ENABLE_HYBRID
1481 switch (AUTHMETHOD(iph1
)) {
1482 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I
:
1483 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I
:
1484 certtype
= iph1
->cert_p
->type
;
1491 case ISAKMP_CERT_X509SIGN
:
1493 #if TARGET_OS_EMBEDDED
1495 /* use ID from remote configuration */
1496 /* check each ID in list */
1497 struct idspec
*id_spec
;
1498 CFStringRef hostname
= NULL
;
1500 struct genlist_entry
*gpb
= NULL
;
1502 if (iph1
->rmconf
->cert_verification_option
== VERIFICATION_OPTION_PEERS_IDENTIFIER
) {
1503 id_spec
= genlist_next(iph1
->rmconf
->idvl_p
, &gpb
); /* expect only one id */
1504 if (id_spec
->idtype
== IDTYPE_ADDRESS
) {
1505 switch (((struct sockaddr
*)(id_spec
->id
->v
))->sa_family
) {
1507 peers_id
= inet_ntoa(((struct sockaddr_in
*)(id_spec
->id
->v
))->sin_addr
);
1508 hostname
= CFStringCreateWithCString(NULL
, peers_id
, kCFStringEncodingUTF8
);
1512 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
; /* not currently supported for embedded */
1516 plog(LLV_ERROR
, LOCATION
, NULL
,
1517 "unknown address type for peers identifier.\n");
1518 return ISAKMP_NTYPE_AUTHENTICATION_FAILED
;
1522 hostname
= CFStringCreateWithBytes(NULL
, (u_int8_t
*)id_spec
->id
->v
, id_spec
->id
->l
, kCFStringEncodingUTF8
, FALSE
);
1524 error
= crypto_cssm_check_x509cert(&iph1
->cert_p
->cert
, hostname
, iph1
->cert_p
->status
);
1526 CFRelease(hostname
);
1529 #else /* TARGET_OS_EMBEDDED */
1531 if (iph1
->rmconf
->cert_verification
== VERIFICATION_MODULE_SEC_FRAMEWORK
)
1532 error
= crypto_cssm_check_x509cert(&iph1
->cert_p
->cert
, NULL
, iph1
->cert_p
->status
);
1534 #endif /* __APPLE__ */
1536 char path
[MAXPATHLEN
];
1539 if (iph1
->rmconf
->cacertfile
!= NULL
) {
1540 getpathname(path
, sizeof(path
),
1542 iph1
->rmconf
->cacertfile
);
1548 error
= eay_check_x509cert(&iph1
->cert_p
->cert
,
1549 lcconf
->pathinfo
[LC_PATHTYPE_CERT
],
1552 #endif /* TARGET_OS_EMBEDDED */
1556 plog(LLV_ERROR
, LOCATION
, NULL
,
1557 "no supported certtype %d\n", certtype
);
1558 return ISAKMP_INTERNAL_ERROR
;
1561 plog(LLV_ERROR
, LOCATION
, NULL
,
1562 "the peer's certificate is not verified.\n");
1563 return ISAKMP_NTYPE_INVALID_CERT_AUTHORITY
;
1567 plog(LLV_DEBUG
, LOCATION
, NULL
, "CERT validated\n");
1570 switch (iph1
->etype
) {
1571 case ISAKMP_ETYPE_IDENT
:
1572 case ISAKMP_ETYPE_AGG
:
1573 my_hash
= oakley_ph1hash_common(iph1
, VALIDATE
);
1575 case ISAKMP_ETYPE_BASE
:
1576 if (iph1
->side
== INITIATOR
)
1577 my_hash
= oakley_ph1hash_base_r(iph1
, VALIDATE
);
1579 my_hash
= oakley_ph1hash_base_i(iph1
, VALIDATE
);
1582 plog(LLV_ERROR
, LOCATION
, NULL
,
1583 "invalid etype %d\n", iph1
->etype
);
1584 return ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE
;
1586 if (my_hash
== NULL
)
1587 return ISAKMP_INTERNAL_ERROR
;
1590 certtype
= iph1
->rmconf
->certtype
;
1591 #ifdef ENABLE_HYBRID
1592 switch (AUTHMETHOD(iph1
)) {
1593 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I
:
1594 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I
:
1595 certtype
= iph1
->cert_p
->type
;
1601 /* check signature */
1603 case ISAKMP_CERT_X509SIGN
:
1604 case ISAKMP_CERT_DNS
:
1605 error
= eay_check_x509sign(my_hash
,
1607 &iph1
->cert_p
->cert
);
1609 case ISAKMP_CERT_PLAINRSA
:
1610 iph1
->rsa_p
= rsa_try_check_rsasign(my_hash
,
1611 iph1
->sig_p
, iph1
->rsa_candidates
);
1612 error
= iph1
->rsa_p
? 0 : -1;
1616 plog(LLV_ERROR
, LOCATION
, NULL
,
1617 "no supported certtype %d\n",
1620 return ISAKMP_INTERNAL_ERROR
;
1625 plog(LLV_ERROR
, LOCATION
, NULL
,
1627 return ISAKMP_NTYPE_INVALID_SIGNATURE
;
1629 plog(LLV_DEBUG
, LOCATION
, NULL
, "SIG authenticated\n");
1632 #ifdef ENABLE_HYBRID
1633 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R
:
1634 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R
:
1636 if ((iph1
->mode_cfg
->flags
& ISAKMP_CFG_VENDORID_XAUTH
) == 0) {
1637 plog(LLV_ERROR
, LOCATION
, NULL
, "No SIG was passed, "
1638 "hybrid auth is enabled, "
1639 "but peer is no Xauth compliant\n");
1640 return ISAKMP_NTYPE_SITUATION_NOT_SUPPORTED
;
1643 plog(LLV_INFO
, LOCATION
, NULL
, "No SIG was passed, "
1644 "but hybrid auth is enabled\n");
1651 case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
:
1652 /* check if we're not into XAUTH_PSKEY_I instead */
1653 #ifdef ENABLE_HYBRID
1654 if (iph1
->rmconf
->xauth
)
1657 switch (iph1
->etype
) {
1658 case ISAKMP_ETYPE_IDENT
:
1659 case ISAKMP_ETYPE_AGG
:
1660 my_hash
= oakley_ph1hash_common(iph1
, VALIDATE
);
1663 plog(LLV_ERROR
, LOCATION
, NULL
,
1664 "invalid etype %d\n", iph1
->etype
);
1665 return ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE
;
1668 if (my_hash
== NULL
) {
1669 if (gssapi_more_tokens(iph1
))
1670 return ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE
;
1672 return ISAKMP_NTYPE_INVALID_HASH_INFORMATION
;
1675 gsshash
= gssapi_unwraphash(iph1
);
1676 if (gsshash
== NULL
) {
1678 return ISAKMP_NTYPE_INVALID_HASH_INFORMATION
;
1681 result
= memcmp(my_hash
->v
, gsshash
->v
, my_hash
->l
);
1686 plog(LLV_ERROR
, LOCATION
, NULL
, "HASH mismatched\n");
1687 return ISAKMP_NTYPE_INVALID_HASH_INFORMATION
;
1689 plog(LLV_DEBUG
, LOCATION
, NULL
, "hash compared OK\n");
1692 case OAKLEY_ATTR_AUTH_METHOD_RSAENC
:
1693 case OAKLEY_ATTR_AUTH_METHOD_RSAREV
:
1694 #ifdef ENABLE_HYBRID
1695 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I
:
1696 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R
:
1697 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I
:
1698 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R
:
1700 if (iph1
->id_p
== NULL
|| iph1
->pl_hash
== NULL
) {
1701 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1702 "few isakmp message received.\n");
1703 return ISAKMP_NTYPE_PAYLOAD_MALFORMED
;
1705 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1706 "not supported authmethod type %s\n",
1707 s_oakley_attr_method(iph1
->approval
->authmethod
));
1708 return ISAKMP_INTERNAL_ERROR
;
1710 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1711 "invalid authmethod %d why ?\n",
1712 iph1
->approval
->authmethod
);
1713 return ISAKMP_INTERNAL_ERROR
;
1716 gettimeofday(&end
, NULL
);
1717 syslog(LOG_NOTICE
, "%s(%s): %8.6f", __func__
,
1718 s_oakley_attr_method(iph1
->approval
->authmethod
),
1719 timedelta(&start
, &end
));
1725 /* get my certificate
1726 * NOTE: include certificate type.
1729 oakley_getmycert(iph1
)
1730 struct ph1handle
*iph1
;
1735 switch (iph1
->rmconf
->certtype
) {
1736 case ISAKMP_CERT_X509SIGN
:
1739 /* only do the local cert test on the phone */
1741 if ( !(err
= get_cert_fromlocal(iph1
, 1))){
1742 if ( iph1
->cert
->status
== CERT_STATUS_EXPIRED
|| iph1
->cert
->status
== CERT_STATUS_PREMATURE
){
1743 if (iph1
->remote
->sa_family
== AF_INET
)
1744 address
= ((struct sockaddr_in
*)(iph1
->remote
))->sin_addr
.s_addr
;
1747 vpncontrol_notify_ike_failed(VPNCTL_NTYPE_PH1_DELETE_CERT_ERROR
+ iph1
->cert
->status
, FROM_LOCAL
, address
, 0, NULL
);
1754 case ISAKMP_CERT_PLAINRSA
:
1757 return get_plainrsa_fromlocal(iph1
, 1);
1760 plog(LLV_ERROR
, LOCATION
, NULL
,
1761 "Unknown certtype #%d\n",
1762 iph1
->rmconf
->certtype
);
1769 * get a CERT from local file.
1772 * my == 0 peer's cert.
1775 get_cert_fromlocal(iph1
, my
)
1776 struct ph1handle
*iph1
;
1779 char path
[MAXPATHLEN
];
1780 vchar_t
*cert
= NULL
;
1784 cert_status_t status
= CERT_STATUS_OK
;
1787 certfile
= iph1
->rmconf
->mycertfile
;
1788 certpl
= &iph1
->cert
;
1790 certfile
= iph1
->rmconf
->peerscertfile
;
1791 certpl
= &iph1
->cert_p
;
1795 if (!certfile
&& iph1
->rmconf
->identity_in_keychain
== 0) {
1799 plog(LLV_ERROR
, LOCATION
, NULL
, "no CERT defined.\n");
1803 switch (iph1
->rmconf
->certtype
) {
1804 case ISAKMP_CERT_X509SIGN
:
1805 #if defined(__APPLE__)
1806 if (iph1
->rmconf
->identity_in_keychain
) {
1809 if (iph1
->rmconf
->keychainCertRef
== NULL
|| base64toCFData(iph1
->rmconf
->keychainCertRef
, &dataRef
))
1811 cert
= crypto_cssm_get_x509cert(dataRef
, &status
);
1812 plog(LLV_DEBUG
, LOCATION
, NULL
, "done with chking cert status %d\n",status
);
1817 case ISAKMP_CERT_DNS
:
1818 /* make public file name */
1819 getpathname(path
, sizeof(path
), LC_PATHTYPE_CERT
, certfile
);
1820 cert
= eay_get_x509cert(path
);
1823 p
= eay_get_x509text(cert
);
1824 plog(LLV_DEBUG
, LOCATION
, NULL
, "%s", p
? p
: "\n");
1830 plog(LLV_ERROR
, LOCATION
, NULL
,
1831 "not supported certtype %d\n",
1832 iph1
->rmconf
->certtype
);
1837 plog(LLV_ERROR
, LOCATION
, NULL
,
1838 "failed to get %s CERT.\n",
1839 my
? "my" : "peers");
1843 *certpl
= oakley_newcert();
1845 plog(LLV_ERROR
, LOCATION
, NULL
,
1846 "failed to get cert buffer.\n");
1849 (*certpl
)->pl
= vmalloc(cert
->l
+ 1);
1850 if ((*certpl
)->pl
== NULL
) {
1851 plog(LLV_ERROR
, LOCATION
, NULL
,
1852 "failed to get cert buffer\n");
1853 oakley_delcert(*certpl
);
1857 memcpy((*certpl
)->pl
->v
+ 1, cert
->v
, cert
->l
);
1858 (*certpl
)->pl
->v
[0] = iph1
->rmconf
->certtype
;
1859 (*certpl
)->type
= iph1
->rmconf
->certtype
;
1860 (*certpl
)->status
= status
;
1861 (*certpl
)->cert
.v
= (*certpl
)->pl
->v
+ 1;
1862 (*certpl
)->cert
.l
= (*certpl
)->pl
->l
- 1;
1864 plog(LLV_DEBUG
, LOCATION
, NULL
, "created CERT payload:\n");
1865 plogdump(LLV_DEBUG
, (*certpl
)->pl
->v
, (*certpl
)->pl
->l
);
1877 get_plainrsa_fromlocal(iph1
, my
)
1878 struct ph1handle
*iph1
;
1881 char path
[MAXPATHLEN
];
1882 vchar_t
*cert
= NULL
;
1886 iph1
->rsa_candidates
= rsa_lookup_keys(iph1
, my
);
1887 if (!iph1
->rsa_candidates
||
1888 rsa_list_count(iph1
->rsa_candidates
) == 0) {
1889 plog(LLV_ERROR
, LOCATION
, NULL
,
1890 "%s RSA key not found for %s\n",
1891 my
? "Private" : "Public",
1892 saddr2str_fromto("%s <-> %s",
1893 iph1
->local
, iph1
->remote
));
1897 if (my
&& rsa_list_count(iph1
->rsa_candidates
) > 1) {
1898 plog(LLV_WARNING
, LOCATION
, NULL
,
1899 "More than one (=%lu) private "
1900 "PlainRSA key found for %s\n",
1901 rsa_list_count(iph1
->rsa_candidates
),
1902 saddr2str_fromto("%s <-> %s",
1903 iph1
->local
, iph1
->remote
));
1904 plog(LLV_WARNING
, LOCATION
, NULL
,
1905 "This may have unpredictable results, "
1906 "i.e. wrong key could be used!\n");
1907 plog(LLV_WARNING
, LOCATION
, NULL
,
1908 "Consider using only one single private "
1909 "key for all peers...\n");
1912 iph1
->rsa
= ((struct rsa_key
*)
1913 genlist_next(iph1
->rsa_candidates
, NULL
))->rsa
;
1915 genlist_free(iph1
->rsa_candidates
, NULL
);
1916 iph1
->rsa_candidates
= NULL
;
1918 if (iph1
->rsa
== NULL
)
1930 oakley_getsign(iph1
)
1931 struct ph1handle
*iph1
;
1933 char path
[MAXPATHLEN
];
1934 vchar_t
*privkey
= NULL
;
1937 switch (iph1
->rmconf
->certtype
) {
1938 case ISAKMP_CERT_X509SIGN
:
1939 #if defined(__APPLE__)
1940 // cert in keychain - use cssm to sign
1941 if (iph1
->rmconf
->identity_in_keychain
) {
1944 if (iph1
->rmconf
->keychainCertRef
== NULL
|| base64toCFData(iph1
->rmconf
->keychainCertRef
, &dataRef
))
1946 iph1
->sig
= crypto_cssm_getsign(dataRef
, iph1
->hash
);
1951 case ISAKMP_CERT_DNS
:
1952 if (iph1
->rmconf
->myprivfile
== NULL
) {
1953 plog(LLV_ERROR
, LOCATION
, NULL
, "no cert defined.\n");
1957 /* make private file name */
1958 getpathname(path
, sizeof(path
),
1960 iph1
->rmconf
->myprivfile
);
1961 privkey
= privsep_eay_get_pkcs1privkey(path
);
1962 if (privkey
== NULL
) {
1963 plog(LLV_ERROR
, LOCATION
, NULL
,
1964 "failed to get private key.\n");
1967 plog(LLV_DEBUG2
, LOCATION
, NULL
, "private key:\n");
1968 plogdump(LLV_DEBUG2
, privkey
->v
, privkey
->l
);
1970 iph1
->sig
= eay_get_x509sign(iph1
->hash
, privkey
);
1972 case ISAKMP_CERT_PLAINRSA
:
1973 iph1
->sig
= eay_get_rsasign(iph1
->hash
, iph1
->rsa
);
1976 plog(LLV_ERROR
, LOCATION
, NULL
,
1977 "Unknown certtype #%d\n",
1978 iph1
->rmconf
->certtype
);
1982 if (iph1
->sig
== NULL
) {
1983 plog(LLV_ERROR
, LOCATION
, NULL
, "failed to sign.\n");
1987 plog(LLV_DEBUG
, LOCATION
, NULL
, "SIGN computed:\n");
1988 plogdump(LLV_DEBUG
, iph1
->sig
->v
, iph1
->sig
->l
);
1993 if (privkey
!= NULL
)
2002 * compare certificate name and ID value.
2005 oakley_check_certid(iph1
, which_id
)
2006 struct ph1handle
*iph1
;
2009 struct ipsecdoi_id_b
*id_b
;
2011 u_int8_t doi_type
= 255;
2012 void *peers_id
= NULL
;
2013 struct genlist_entry
*gpb
= NULL
;
2015 if (which_id
== CERT_CHECKID_FROM_PEER
) {
2016 /* use ID from peer */
2017 if (iph1
->id_p
== NULL
|| iph1
->cert_p
== NULL
) {
2018 plog(LLV_ERROR
, LOCATION
, NULL
, "no ID nor CERT found.\n");
2019 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2021 id_b
= (struct ipsecdoi_id_b
*)iph1
->id_p
->v
;
2022 doi_type
= id_b
->type
;
2023 peers_id
= id_b
+ 1;
2024 idlen
= iph1
->id_p
->l
- sizeof(*id_b
);
2026 return oakley_check_certid_1(iph1
, doi_type
, idlen
, peers_id
);
2029 /* use ID from remote configuration */
2030 /* check each ID in list */
2031 struct idspec
*id_spec
;
2033 for (id_spec
= genlist_next (iph1
->rmconf
->idvl_p
, &gpb
); id_spec
; id_spec
= genlist_next (0, &gpb
)) {
2035 if (id_spec
->idtype
== IDTYPE_ADDRESS
) {
2036 switch (((struct sockaddr
*)(id_spec
->id
->v
))->sa_family
) {
2038 doi_type
= IPSECDOI_ID_IPV4_ADDR
;
2039 idlen
= sizeof(struct in_addr
);
2040 peers_id
= &(((struct sockaddr_in
*)(id_spec
->id
->v
))->sin_addr
.s_addr
);
2044 doi_type
= IPSECDOI_ID_IPV6_ADDR
;
2045 idlen
= sizeof(struct in6_addr
);
2046 peers_id
= &(((struct sockaddr_in6
*)(id_spec
->id
->v
))->sin6_addr
.s6_addr
);
2050 plog(LLV_ERROR
, LOCATION
, NULL
,
2051 "unknown address type for peers identifier.\n");
2052 return ISAKMP_NTYPE_AUTHENTICATION_FAILED
;
2057 doi_type
= idtype2doi(id_spec
->idtype
);
2058 peers_id
= id_spec
->id
->v
;
2059 idlen
= id_spec
->id
->l
;
2061 if (oakley_check_certid_1(iph1
, doi_type
, idlen
, peers_id
) == 0)
2064 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2069 oakley_check_certid_1(iph1
, idtype
, idlen
, id
)
2070 struct ph1handle
*iph1
;
2076 vchar_t
*name
= NULL
;
2077 char *altname
= NULL
;
2082 case IPSECDOI_ID_DER_ASN1_DN
:
2083 name
= eay_get_x509asn1subjectname(&iph1
->cert_p
->cert
);
2085 plog(LLV_ERROR
, LOCATION
, NULL
,
2086 "failed to get subjectName\n");
2087 return ISAKMP_NTYPE_INVALID_CERTIFICATE
;
2089 if (idlen
!= name
->l
) {
2090 plog(LLV_ERROR
, LOCATION
, NULL
,
2091 "Invalid ID length in phase 1.\n");
2093 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2095 error
= memcmp(id
, name
->v
, idlen
);
2098 plog(LLV_ERROR
, LOCATION
, NULL
,
2099 "ID mismatched with subjectName.\n");
2100 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2103 case IPSECDOI_ID_IPV4_ADDR
:
2104 case IPSECDOI_ID_IPV6_ADDR
:
2108 * Openssl returns the IPAddress as an ASN1 octet string (binary format)
2109 * followed by a trailing NULL. 5 bytes for IPv4 and 17 bytes for IPv6
2111 #define SUBJ_ALT_NAME_IPV4_ADDRESS_LEN 5
2112 #define SUBJ_ALT_NAME_IPV6_ADDRESS_LEN 17
2116 if (idtype
== IPSECDOI_ID_IPV4_ADDR
&& idlen
!= sizeof(struct in_addr
)
2117 || idtype
== IPSECDOI_ID_IPV6_ADDR
&& idlen
!= sizeof(struct in6_addr
)) {
2118 plog(LLV_ERROR
, LOCATION
, NULL
,
2119 "invalid address length passed.\n");
2120 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2123 for (pos
= 1; ; pos
++) {
2124 if (eay_get_x509subjectaltname(&iph1
->cert_p
->cert
, &altname
, &type
, pos
, &len
) !=0) {
2125 plog(LLV_ERROR
, LOCATION
, NULL
,
2126 "failed to get subjectAltName\n");
2127 return ISAKMP_NTYPE_INVALID_CERTIFICATE
;
2130 /* it's the end condition of the loop. */
2132 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2135 if (check_typeofcertname(idtype
, type
) != 0) {
2136 /* wrong type - skip this one */
2137 racoon_free(altname
);
2142 if (len
== SUBJ_ALT_NAME_IPV4_ADDRESS_LEN
) { /* IPv4 */
2143 if (idtype
!= IPSECDOI_ID_IPV4_ADDR
) {
2144 /* wrong IP address type - skip this one */
2145 racoon_free(altname
);
2151 else if (len
== SUBJ_ALT_NAME_IPV6_ADDRESS_LEN
) { /* IPv6 */
2152 if (idtype
!= IPSECDOI_ID_IPV6_ADDR
) {
2153 /* wrong IP address type - skip this one */
2154 racoon_free(altname
);
2161 /* invalid IP address length in certificate - bad or bogus certificate */
2162 plog(LLV_ERROR
, LOCATION
, NULL
,
2163 "invalid IP address in certificate.\n");
2164 racoon_free(altname
);
2166 return ISAKMP_NTYPE_INVALID_CERTIFICATE
;
2169 /* compare the addresses */
2170 error
= memcmp(id
, altname
, idlen
);
2171 racoon_free(altname
);
2173 plog(LLV_ERROR
, LOCATION
, NULL
,
2174 "ID mismatched with subjectAltName.\n");
2175 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2180 case IPSECDOI_ID_FQDN
:
2181 case IPSECDOI_ID_USER_FQDN
:
2185 for (pos
= 1; ; pos
++) {
2186 if (eay_get_x509subjectaltname(&iph1
->cert_p
->cert
, &altname
, &type
, pos
, &len
) != 0) {
2187 plog(LLV_ERROR
, LOCATION
, NULL
,
2188 "failed to get subjectAltName\n");
2189 return ISAKMP_NTYPE_INVALID_CERTIFICATE
;
2192 /* it's the end condition of the loop. */
2194 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2197 if (check_typeofcertname(idtype
, type
) != 0) {
2198 /* wrong general type - skip this one */
2199 racoon_free(altname
);
2204 if (idlen
!= strlen(altname
)) {
2205 /* wrong length - skip this one */
2206 racoon_free(altname
);
2210 error
= memcmp(id
, altname
, idlen
);
2211 racoon_free(altname
);
2213 plog(LLV_ERROR
, LOCATION
, NULL
, "ID mismatched.\n");
2214 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2220 plog(LLV_ERROR
, LOCATION
, NULL
,
2221 "Impropper ID type passed: %s.\n",
2222 s_ipsecdoi_ident(idtype
));
2223 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2228 #else /* __APPLE__ */
2231 * compare certificate name and ID value.
2234 oakley_check_certid(iph1
)
2235 struct ph1handle
*iph1
;
2237 struct ipsecdoi_id_b
*id_b
;
2238 vchar_t
*name
= NULL
;
2239 char *altname
= NULL
;
2243 if (iph1
->id_p
== NULL
|| iph1
->cert_p
== NULL
) {
2244 plog(LLV_ERROR
, LOCATION
, NULL
, "no ID nor CERT found.\n");
2245 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2248 id_b
= (struct ipsecdoi_id_b
*)iph1
->id_p
->v
;
2249 idlen
= iph1
->id_p
->l
- sizeof(*id_b
);
2251 switch (id_b
->type
) {
2252 case IPSECDOI_ID_DER_ASN1_DN
:
2253 name
= eay_get_x509asn1subjectname(&iph1
->cert_p
->cert
);
2255 plog(LLV_ERROR
, LOCATION
, NULL
,
2256 "failed to get subjectName\n");
2257 return ISAKMP_NTYPE_INVALID_CERTIFICATE
;
2259 if (idlen
!= name
->l
) {
2260 plog(LLV_ERROR
, LOCATION
, NULL
,
2261 "Invalid ID length in phase 1.\n");
2263 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2265 error
= memcmp(id_b
+ 1, name
->v
, idlen
);
2268 plog(LLV_ERROR
, LOCATION
, NULL
,
2269 "ID mismatched with ASN1 SubjectName.\n");
2270 plogdump(LLV_DEBUG
, id_b
+ 1, idlen
);
2271 plogdump(LLV_DEBUG
, name
->v
, idlen
);
2272 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2275 case IPSECDOI_ID_IPV4_ADDR
:
2276 case IPSECDOI_ID_IPV6_ADDR
:
2279 * converting to binary from string because openssl return
2280 * a string even if object is a binary.
2281 * XXX fix it ! access by ASN.1 directly without.
2283 struct addrinfo hints
, *res
;
2287 for (pos
= 1; ; pos
++) {
2288 if (eay_get_x509subjectaltname(&iph1
->cert_p
->cert
,
2289 &altname
, &type
, pos
) !=0) {
2290 plog(LLV_ERROR
, LOCATION
, NULL
,
2291 "failed to get subjectAltName\n");
2292 return ISAKMP_NTYPE_INVALID_CERTIFICATE
;
2295 /* it's the end condition of the loop. */
2297 plog(LLV_ERROR
, LOCATION
, NULL
,
2298 "no proper subjectAltName.\n");
2299 return ISAKMP_NTYPE_INVALID_CERTIFICATE
;
2302 if (check_typeofcertname(id_b
->type
, type
) == 0)
2306 racoon_free(altname
);
2309 memset(&hints
, 0, sizeof(hints
));
2310 hints
.ai_family
= PF_UNSPEC
;
2311 hints
.ai_socktype
= SOCK_RAW
;
2312 hints
.ai_flags
= AI_NUMERICHOST
;
2313 error
= getaddrinfo(altname
, NULL
, &hints
, &res
);
2315 plog(LLV_ERROR
, LOCATION
, NULL
,
2316 "no proper subjectAltName.\n");
2317 racoon_free(altname
);
2318 return ISAKMP_NTYPE_INVALID_CERTIFICATE
;
2320 switch (res
->ai_family
) {
2322 a
= (caddr_t
)&((struct sockaddr_in
*)res
->ai_addr
)->sin_addr
.s_addr
;
2326 a
= (caddr_t
)&((struct sockaddr_in6
*)res
->ai_addr
)->sin6_addr
.s6_addr
;
2330 plog(LLV_ERROR
, LOCATION
, NULL
,
2331 "family not supported: %d.\n", res
->ai_family
);
2332 racoon_free(altname
);
2334 return ISAKMP_NTYPE_INVALID_CERTIFICATE
;
2336 error
= memcmp(id_b
+ 1, a
, idlen
);
2340 plog(LLV_ERROR
, LOCATION
, NULL
,
2341 "ID mismatched with subjectAltName.\n");
2342 plogdump(LLV_DEBUG
, id_b
+ 1, idlen
);
2343 plogdump(LLV_DEBUG
, a
, idlen
);
2344 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2348 case IPSECDOI_ID_FQDN
:
2349 case IPSECDOI_ID_USER_FQDN
:
2353 for (pos
= 1; ; pos
++) {
2354 if (eay_get_x509subjectaltname(&iph1
->cert_p
->cert
,
2355 &altname
, &type
, pos
) != 0){
2356 plog(LLV_ERROR
, LOCATION
, NULL
,
2357 "failed to get subjectAltName\n");
2358 return ISAKMP_NTYPE_INVALID_CERTIFICATE
;
2361 /* it's the end condition of the loop. */
2363 plog(LLV_ERROR
, LOCATION
, NULL
,
2364 "no proper subjectAltName.\n");
2365 return ISAKMP_NTYPE_INVALID_CERTIFICATE
;
2368 if (check_typeofcertname(id_b
->type
, type
) == 0)
2372 racoon_free(altname
);
2375 if (idlen
!= strlen(altname
)) {
2376 plog(LLV_ERROR
, LOCATION
, NULL
,
2377 "Invalid ID length in phase 1.\n");
2378 racoon_free(altname
);
2379 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2381 if (check_typeofcertname(id_b
->type
, type
) != 0) {
2382 plog(LLV_ERROR
, LOCATION
, NULL
,
2383 "ID type mismatched. ID: %s CERT: %s.\n",
2384 s_ipsecdoi_ident(id_b
->type
),
2385 s_ipsecdoi_ident(type
));
2386 racoon_free(altname
);
2387 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2389 error
= memcmp(id_b
+ 1, altname
, idlen
);
2391 plog(LLV_ERROR
, LOCATION
, NULL
, "ID mismatched.\n");
2392 plogdump(LLV_DEBUG
, id_b
+ 1, idlen
);
2393 plogdump(LLV_DEBUG
, altname
, idlen
);
2394 racoon_free(altname
);
2395 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2397 racoon_free(altname
);
2401 plog(LLV_ERROR
, LOCATION
, NULL
,
2402 "Impropper ID type passed: %s.\n",
2403 s_ipsecdoi_ident(id_b
->type
));
2404 return ISAKMP_NTYPE_INVALID_ID_INFORMATION
;
2409 #endif /* __APPLE__ */
2412 check_typeofcertname(doi
, genid
)
2416 case IPSECDOI_ID_IPV4_ADDR
:
2417 case IPSECDOI_ID_IPV4_ADDR_SUBNET
:
2418 case IPSECDOI_ID_IPV6_ADDR
:
2419 case IPSECDOI_ID_IPV6_ADDR_SUBNET
:
2420 case IPSECDOI_ID_IPV4_ADDR_RANGE
:
2421 case IPSECDOI_ID_IPV6_ADDR_RANGE
:
2422 if (genid
!= GENT_IPADD
)
2425 case IPSECDOI_ID_FQDN
:
2426 if (genid
!= GENT_DNS
)
2429 case IPSECDOI_ID_USER_FQDN
:
2430 if (genid
!= GENT_EMAIL
)
2433 case IPSECDOI_ID_DER_ASN1_DN
: /* should not be passed to this function*/
2434 case IPSECDOI_ID_DER_ASN1_GN
:
2435 case IPSECDOI_ID_KEY_ID
:
2443 * save certificate including certificate type.
2446 oakley_savecert(iph1
, gen
)
2447 struct ph1handle
*iph1
;
2448 struct isakmp_gen
*gen
;
2452 STACK_OF(X509
) *certs
=NULL
;
2455 type
= *(u_int8_t
*)(gen
+ 1) & 0xff;
2458 case ISAKMP_CERT_DNS
:
2459 plog(LLV_WARNING
, LOCATION
, NULL
,
2460 "CERT payload is unnecessary in DNSSEC. "
2461 "ignore this CERT payload.\n");
2463 case ISAKMP_CERT_PKCS7
:
2464 case ISAKMP_CERT_PGP
:
2465 case ISAKMP_CERT_X509SIGN
:
2466 case ISAKMP_CERT_KERBEROS
:
2467 case ISAKMP_CERT_SPKI
:
2470 case ISAKMP_CERT_CRL
:
2473 case ISAKMP_CERT_X509KE
:
2474 case ISAKMP_CERT_X509ATTR
:
2475 case ISAKMP_CERT_ARL
:
2476 plog(LLV_ERROR
, LOCATION
, NULL
,
2477 "No supported such CERT type %d\n", type
);
2480 plog(LLV_ERROR
, LOCATION
, NULL
,
2481 "Invalid CERT type %d\n", type
);
2485 /* XXX choice the 1th cert, ignore after the cert. */
2486 /* XXX should be processed. */
2488 plog(LLV_WARNING
, LOCATION
, NULL
,
2489 "ignore 2nd CERT payload.\n");
2493 if (type
== ISAKMP_CERT_PKCS7
) {
2497 /* Skip the header */
2498 bp
= (u_char
*)(gen
+ 1);
2499 /* And the first byte is the certificate type,
2500 * we know that already
2503 p7
= d2i_PKCS7(NULL
, (void *)&bp
,
2504 ntohs(gen
->len
) - sizeof(*gen
) - 1);
2507 plog(LLV_ERROR
, LOCATION
, NULL
,
2508 "Failed to parse PKCS#7 CERT.\n");
2512 /* Copied this from the openssl pkcs7 application;
2513 * there"s little by way of documentation for any of
2514 * it. I can only presume it"s correct.
2517 i
= OBJ_obj2nid(p7
->type
);
2519 case NID_pkcs7_signed
:
2520 certs
=p7
->d
.sign
->cert
;
2522 case NID_pkcs7_signedAndEnveloped
:
2523 certs
=p7
->d
.signed_and_enveloped
->cert
;
2530 plog(LLV_ERROR
, LOCATION
, NULL
,
2531 "CERT PKCS#7 bundle contains no certs.\n");
2536 for (i
= 0; i
< sk_X509_num(certs
); i
++) {
2539 X509
*cert
= sk_X509_value(certs
,i
);
2541 plog(LLV_DEBUG
, LOCATION
, NULL
,
2542 "Trying PKCS#7 cert %d.\n", i
);
2544 /* We'll just try each cert in turn */
2545 *c
= save_certx509(cert
);
2548 plog(LLV_ERROR
, LOCATION
, NULL
,
2549 "Failed to get CERT buffer.\n");
2553 /* Ignore cert if it doesn't match identity
2554 * XXX If verify cert is disabled, we still just take
2555 * the first certificate....
2557 if(iph1
->rmconf
->verify_cert
&&
2558 oakley_check_certid(iph1
, CERT_CHECKID_FROM_PEER
)) {
2559 plog(LLV_DEBUG
, LOCATION
, NULL
,
2560 "Discarding CERT: does not match ID.\n");
2561 oakley_delcert((*c
));
2567 char *p
= eay_get_x509text(&(*c
)->cert
);
2568 plog(LLV_DEBUG
, LOCATION
, NULL
, "CERT saved:\n");
2569 plogdump(LLV_DEBUG
, (*c
)->cert
.v
, (*c
)->cert
.l
);
2570 plog(LLV_DEBUG
, LOCATION
, NULL
, "%s",
2579 *c
= save_certbuf(gen
);
2581 plog(LLV_ERROR
, LOCATION
, NULL
,
2582 "Failed to get CERT buffer.\n");
2586 switch ((*c
)->type
) {
2587 case ISAKMP_CERT_DNS
:
2588 plog(LLV_WARNING
, LOCATION
, NULL
,
2589 "CERT payload is unnecessary in DNSSEC. "
2592 case ISAKMP_CERT_PGP
:
2593 case ISAKMP_CERT_X509SIGN
:
2594 case ISAKMP_CERT_KERBEROS
:
2595 case ISAKMP_CERT_SPKI
:
2596 /* Ignore cert if it doesn't match identity
2597 * XXX If verify cert is disabled, we still just take
2598 * the first certificate....
2600 if(iph1
->rmconf
->verify_cert
&&
2601 oakley_check_certid(iph1
, CERT_CHECKID_FROM_PEER
)){
2602 plog(LLV_DEBUG
, LOCATION
, NULL
,
2603 "Discarding CERT: does not match ID.\n");
2604 oakley_delcert((*c
));
2610 char *p
= eay_get_x509text(&(*c
)->cert
);
2611 plog(LLV_DEBUG
, LOCATION
, NULL
, "CERT saved:\n");
2612 plogdump(LLV_DEBUG
, (*c
)->cert
.v
, (*c
)->cert
.l
);
2613 plog(LLV_DEBUG
, LOCATION
, NULL
, "%s", p
? p
: "\n");
2617 case ISAKMP_CERT_CRL
:
2618 plog(LLV_DEBUG
, LOCATION
, NULL
, "CRL saved:\n");
2619 plogdump(LLV_DEBUG
, (*c
)->cert
.v
, (*c
)->cert
.l
);
2621 case ISAKMP_CERT_X509KE
:
2622 case ISAKMP_CERT_X509ATTR
:
2623 case ISAKMP_CERT_ARL
:
2626 oakley_delcert((*c
));
2636 * save certificate including certificate type.
2639 oakley_savecr(iph1
, gen
)
2640 struct ph1handle
*iph1
;
2641 struct isakmp_gen
*gen
;
2646 type
= *(u_int8_t
*)(gen
+ 1) & 0xff;
2649 case ISAKMP_CERT_DNS
:
2650 plog(LLV_WARNING
, LOCATION
, NULL
,
2651 "CERT payload is unnecessary in DNSSEC\n");
2653 case ISAKMP_CERT_PKCS7
:
2654 case ISAKMP_CERT_PGP
:
2655 case ISAKMP_CERT_X509SIGN
:
2656 case ISAKMP_CERT_KERBEROS
:
2657 case ISAKMP_CERT_SPKI
:
2660 case ISAKMP_CERT_X509KE
:
2661 case ISAKMP_CERT_X509ATTR
:
2662 case ISAKMP_CERT_ARL
:
2663 plog(LLV_ERROR
, LOCATION
, NULL
,
2664 "No supported such CR type %d\n", type
);
2666 case ISAKMP_CERT_CRL
:
2668 plog(LLV_ERROR
, LOCATION
, NULL
,
2669 "Invalid CR type %d\n", type
);
2673 *c
= save_certbuf(gen
);
2675 plog(LLV_ERROR
, LOCATION
, NULL
,
2676 "Failed to get CR buffer.\n");
2680 plog(LLV_DEBUG
, LOCATION
, NULL
, "CR saved:\n");
2681 plogdump(LLV_DEBUG
, (*c
)->cert
.v
, (*c
)->cert
.l
);
2688 struct isakmp_gen
*gen
;
2692 if(ntohs(gen
->len
) <= sizeof(*gen
)){
2693 plog(LLV_ERROR
, LOCATION
, NULL
,
2694 "Len is too small !!.\n");
2698 new = oakley_newcert();
2700 plog(LLV_ERROR
, LOCATION
, NULL
,
2701 "Failed to get CERT buffer.\n");
2705 new->pl
= vmalloc(ntohs(gen
->len
) - sizeof(*gen
));
2706 if (new->pl
== NULL
) {
2707 plog(LLV_ERROR
, LOCATION
, NULL
,
2708 "Failed to copy CERT from packet.\n");
2709 oakley_delcert(new);
2713 memcpy(new->pl
->v
, gen
+ 1, new->pl
->l
);
2714 new->type
= new->pl
->v
[0] & 0xff;
2715 new->cert
.v
= new->pl
->v
+ 1;
2716 new->cert
.l
= new->pl
->l
- 1;
2729 new = oakley_newcert();
2731 plog(LLV_ERROR
, LOCATION
, NULL
,
2732 "Failed to get CERT buffer.\n");
2736 len
= i2d_X509(cert
, NULL
);
2737 new->pl
= vmalloc(len
);
2738 if (new->pl
== NULL
) {
2739 plog(LLV_ERROR
, LOCATION
, NULL
,
2740 "Failed to copy CERT from packet.\n");
2741 oakley_delcert(new);
2745 bp
= (u_char
*) new->pl
->v
;
2746 len
= i2d_X509(cert
, &bp
);
2747 new->type
= ISAKMP_CERT_X509SIGN
;
2748 new->cert
.v
= new->pl
->v
;
2749 new->cert
.l
= new->pl
->l
;
2756 * NOTE: No Certificate Authority field is included to CR payload at the
2757 * moment. Becuase any certificate authority are accepted without any check.
2758 * The section 3.10 in RFC2408 says that this field SHOULD not be included,
2759 * if there is no specific certificate authority requested.
2763 struct ph1handle
*iph1
;
2769 plog(LLV_ERROR
, LOCATION
, NULL
,
2770 "failed to get cr buffer\n");
2773 if(iph1
->rmconf
->certtype
== ISAKMP_CERT_NONE
) {
2774 buf
->v
[0] = iph1
->rmconf
->cacerttype
;
2775 plog(LLV_DEBUG
, LOCATION
, NULL
, "create my CR: NONE, using %s instead\n",
2776 s_isakmp_certtype(iph1
->rmconf
->cacerttype
));
2778 buf
->v
[0] = iph1
->rmconf
->certtype
;
2779 plog(LLV_DEBUG
, LOCATION
, NULL
, "create my CR: %s\n",
2780 s_isakmp_certtype(iph1
->rmconf
->certtype
));
2783 plogdump(LLV_DEBUG
, buf
->v
, buf
->l
);
2792 oakley_checkcr(iph1
)
2793 struct ph1handle
*iph1
;
2795 if (iph1
->cr_p
== NULL
)
2798 plog(LLV_DEBUG
, LOCATION
, iph1
->remote
,
2799 "peer transmitted CR: %s\n",
2800 s_isakmp_certtype(iph1
->cr_p
->type
));
2802 if (iph1
->cr_p
->type
!= iph1
->rmconf
->certtype
) {
2803 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
2804 "such a cert type isn't supported: %d\n",
2805 (char)iph1
->cr_p
->type
);
2813 * check to need CR payload.
2820 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG
:
2821 case OAKLEY_ATTR_AUTH_METHOD_RSASIG
:
2822 #ifdef ENABLE_HYBRID
2823 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I
:
2824 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I
:
2825 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I
:
2826 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R
:
2827 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I
:
2828 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R
:
2839 * see seciton 5. Exchanges in RFC 2409
2840 * psk: SKEYID = prf(pre-shared-key, Ni_b | Nr_b)
2841 * sig: SKEYID = prf(Ni_b | Nr_b, g^ir)
2842 * enc: SKEYID = prf(H(Ni_b | Nr_b), CKY-I | CKY-R)
2846 struct ph1handle
*iph1
;
2848 vchar_t
*buf
= NULL
, *bp
;
2854 switch (AUTHMETHOD(iph1
)) {
2855 case OAKLEY_ATTR_AUTH_METHOD_PSKEY
:
2856 #ifdef ENABLE_HYBRID
2857 case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I
:
2858 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R
:
2861 if (iph1
->rmconf
->shared_secret
) {
2863 switch (iph1
->rmconf
->secrettype
) {
2864 case SECRETTYPE_KEY
:
2865 /* in psk file - use KEY from remote configuration to locate it */
2866 iph1
->authstr
= getpsk(iph1
->rmconf
->shared_secret
->v
, iph1
->rmconf
->shared_secret
->l
-1);
2869 case SECRETTYPE_KEYCHAIN
:
2870 /* in the system keychain */
2871 iph1
->authstr
= getpskfromkeychain(iph1
->rmconf
->shared_secret
->v
, iph1
->etype
, iph1
->rmconf
->secrettype
, NULL
);
2873 case SECRETTYPE_KEYCHAIN_BY_ID
:
2874 /* in the system keychain - use peer id */
2875 iph1
->authstr
= getpskfromkeychain(iph1
->rmconf
->shared_secret
->v
, iph1
->etype
, iph1
->rmconf
->secrettype
, iph1
->id_p
);
2877 #endif HAVE_KEYCHAIN
2878 case SECRETTYPE_USE
:
2879 /* in the remote configuration */
2881 iph1
->authstr
= vdup(iph1
->rmconf
->shared_secret
);
2887 if (iph1
->etype
!= ISAKMP_ETYPE_IDENT
) {
2888 iph1
->authstr
= getpskbyname(iph1
->id_p
);
2889 if (iph1
->authstr
== NULL
) {
2890 if (iph1
->rmconf
->verify_identifier
) {
2891 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
2892 "couldn't find the pskey.\n");
2895 plog(LLV_NOTIFY
, LOCATION
, iph1
->remote
,
2896 "couldn't find the proper pskey, "
2897 "try to get one by the peer's address.\n");
2900 if (iph1
->authstr
== NULL
) {
2902 * If the exchange type is the main mode or if it's
2903 * failed to get the psk by ID, racoon try to get
2904 * the psk by remote IP address.
2905 * It may be nonsense.
2907 iph1
->authstr
= getpskbyaddr(iph1
->remote
);
2908 if (iph1
->authstr
== NULL
) {
2909 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
2910 "couldn't find the pskey for %s.\n",
2911 saddrwop2str(iph1
->remote
));
2915 plog(LLV_DEBUG
, LOCATION
, NULL
, "the psk found.\n");
2916 /* should be secret PSK */
2917 plog(LLV_DEBUG2
, LOCATION
, NULL
, "psk: ");
2918 plogdump(LLV_DEBUG2
, iph1
->authstr
->v
, iph1
->authstr
->l
);
2920 len
= iph1
->nonce
->l
+ iph1
->nonce_p
->l
;
2923 plog(LLV_ERROR
, LOCATION
, NULL
,
2924 "failed to get skeyid buffer\n");
2929 bp
= (iph1
->side
== INITIATOR
? iph1
->nonce
: iph1
->nonce_p
);
2930 plog(LLV_DEBUG
, LOCATION
, NULL
, "nonce 1: ");
2931 plogdump(LLV_DEBUG
, bp
->v
, bp
->l
);
2932 memcpy(p
, bp
->v
, bp
->l
);
2935 bp
= (iph1
->side
== INITIATOR
? iph1
->nonce_p
: iph1
->nonce
);
2936 plog(LLV_DEBUG
, LOCATION
, NULL
, "nonce 2: ");
2937 plogdump(LLV_DEBUG
, bp
->v
, bp
->l
);
2938 memcpy(p
, bp
->v
, bp
->l
);
2941 iph1
->skeyid
= oakley_prf(iph1
->authstr
, buf
, iph1
);
2942 if (iph1
->skeyid
== NULL
)
2946 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG
:
2947 case OAKLEY_ATTR_AUTH_METHOD_RSASIG
:
2948 #ifdef ENABLE_HYBRID
2949 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I
:
2950 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I
:
2951 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R
:
2952 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R
:
2953 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I
:
2954 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R
:
2955 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I
:
2956 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R
:
2959 case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
:
2961 len
= iph1
->nonce
->l
+ iph1
->nonce_p
->l
;
2964 plog(LLV_ERROR
, LOCATION
, NULL
,
2965 "failed to get nonce buffer\n");
2970 bp
= (iph1
->side
== INITIATOR
? iph1
->nonce
: iph1
->nonce_p
);
2971 plog(LLV_DEBUG
, LOCATION
, NULL
, "nonce1: ");
2972 plogdump(LLV_DEBUG
, bp
->v
, bp
->l
);
2973 memcpy(p
, bp
->v
, bp
->l
);
2976 bp
= (iph1
->side
== INITIATOR
? iph1
->nonce_p
: iph1
->nonce
);
2977 plog(LLV_DEBUG
, LOCATION
, NULL
, "nonce2: ");
2978 plogdump(LLV_DEBUG
, bp
->v
, bp
->l
);
2979 memcpy(p
, bp
->v
, bp
->l
);
2982 iph1
->skeyid
= oakley_prf(buf
, iph1
->dhgxy
, iph1
);
2983 if (iph1
->skeyid
== NULL
)
2986 case OAKLEY_ATTR_AUTH_METHOD_RSAENC
:
2987 case OAKLEY_ATTR_AUTH_METHOD_RSAREV
:
2988 #ifdef ENABLE_HYBRID
2989 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I
:
2990 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R
:
2991 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I
:
2992 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R
:
2994 plog(LLV_WARNING
, LOCATION
, NULL
,
2995 "not supported authentication method %s\n",
2996 s_oakley_attr_method(iph1
->approval
->authmethod
));
2999 plog(LLV_ERROR
, LOCATION
, NULL
,
3000 "invalid authentication method %d\n",
3001 iph1
->approval
->authmethod
);
3005 plog(LLV_DEBUG
, LOCATION
, NULL
, "SKEYID computed:\n");
3006 plogdump(LLV_DEBUG
, iph1
->skeyid
->v
, iph1
->skeyid
->l
);
3017 * compute SKEYID_[dae]
3018 * see seciton 5. Exchanges in RFC 2409
3019 * SKEYID_d = prf(SKEYID, g^ir | CKY-I | CKY-R | 0)
3020 * SKEYID_a = prf(SKEYID, SKEYID_d | g^ir | CKY-I | CKY-R | 1)
3021 * SKEYID_e = prf(SKEYID, SKEYID_a | g^ir | CKY-I | CKY-R | 2)
3024 oakley_skeyid_dae(iph1
)
3025 struct ph1handle
*iph1
;
3027 vchar_t
*buf
= NULL
;
3032 if (iph1
->skeyid
== NULL
) {
3033 plog(LLV_ERROR
, LOCATION
, NULL
, "no SKEYID found.\n");
3038 /* SKEYID_d = prf(SKEYID, g^xy | CKY-I | CKY-R | 0) */
3039 len
= iph1
->dhgxy
->l
+ sizeof(cookie_t
) * 2 + 1;
3042 plog(LLV_ERROR
, LOCATION
, NULL
,
3043 "failed to get skeyid buffer\n");
3048 memcpy(p
, iph1
->dhgxy
->v
, iph1
->dhgxy
->l
);
3049 p
+= iph1
->dhgxy
->l
;
3050 memcpy(p
, (caddr_t
)&iph1
->index
.i_ck
, sizeof(cookie_t
));
3051 p
+= sizeof(cookie_t
);
3052 memcpy(p
, (caddr_t
)&iph1
->index
.r_ck
, sizeof(cookie_t
));
3053 p
+= sizeof(cookie_t
);
3055 iph1
->skeyid_d
= oakley_prf(iph1
->skeyid
, buf
, iph1
);
3056 if (iph1
->skeyid_d
== NULL
)
3062 plog(LLV_DEBUG
, LOCATION
, NULL
, "SKEYID_d computed:\n");
3063 plogdump(LLV_DEBUG
, iph1
->skeyid_d
->v
, iph1
->skeyid_d
->l
);
3066 /* SKEYID_a = prf(SKEYID, SKEYID_d | g^xy | CKY-I | CKY-R | 1) */
3067 len
= iph1
->skeyid_d
->l
+ iph1
->dhgxy
->l
+ sizeof(cookie_t
) * 2 + 1;
3070 plog(LLV_ERROR
, LOCATION
, NULL
,
3071 "failed to get skeyid buffer\n");
3075 memcpy(p
, iph1
->skeyid_d
->v
, iph1
->skeyid_d
->l
);
3076 p
+= iph1
->skeyid_d
->l
;
3077 memcpy(p
, iph1
->dhgxy
->v
, iph1
->dhgxy
->l
);
3078 p
+= iph1
->dhgxy
->l
;
3079 memcpy(p
, (caddr_t
)&iph1
->index
.i_ck
, sizeof(cookie_t
));
3080 p
+= sizeof(cookie_t
);
3081 memcpy(p
, (caddr_t
)&iph1
->index
.r_ck
, sizeof(cookie_t
));
3082 p
+= sizeof(cookie_t
);
3084 iph1
->skeyid_a
= oakley_prf(iph1
->skeyid
, buf
, iph1
);
3085 if (iph1
->skeyid_a
== NULL
)
3091 plog(LLV_DEBUG
, LOCATION
, NULL
, "SKEYID_a computed:\n");
3092 plogdump(LLV_DEBUG
, iph1
->skeyid_a
->v
, iph1
->skeyid_a
->l
);
3095 /* SKEYID_e = prf(SKEYID, SKEYID_a | g^xy | CKY-I | CKY-R | 2) */
3096 len
= iph1
->skeyid_a
->l
+ iph1
->dhgxy
->l
+ sizeof(cookie_t
) * 2 + 1;
3099 plog(LLV_ERROR
, LOCATION
, NULL
,
3100 "failed to get skeyid buffer\n");
3104 memcpy(p
, iph1
->skeyid_a
->v
, iph1
->skeyid_a
->l
);
3105 p
+= iph1
->skeyid_a
->l
;
3106 memcpy(p
, iph1
->dhgxy
->v
, iph1
->dhgxy
->l
);
3107 p
+= iph1
->dhgxy
->l
;
3108 memcpy(p
, (caddr_t
)&iph1
->index
.i_ck
, sizeof(cookie_t
));
3109 p
+= sizeof(cookie_t
);
3110 memcpy(p
, (caddr_t
)&iph1
->index
.r_ck
, sizeof(cookie_t
));
3111 p
+= sizeof(cookie_t
);
3113 iph1
->skeyid_e
= oakley_prf(iph1
->skeyid
, buf
, iph1
);
3114 if (iph1
->skeyid_e
== NULL
)
3120 plog(LLV_DEBUG
, LOCATION
, NULL
, "SKEYID_e computed:\n");
3121 plogdump(LLV_DEBUG
, iph1
->skeyid_e
->v
, iph1
->skeyid_e
->l
);
3132 * compute final encryption key.
3136 oakley_compute_enckey(iph1
)
3137 struct ph1handle
*iph1
;
3139 u_int keylen
, prflen
;
3143 keylen
= alg_oakley_encdef_keylen(iph1
->approval
->enctype
,
3144 iph1
->approval
->encklen
);
3146 plog(LLV_ERROR
, LOCATION
, NULL
,
3147 "invalid encryption algoritym %d, "
3148 "or invalid key length %d.\n",
3149 iph1
->approval
->enctype
,
3150 iph1
->approval
->encklen
);
3153 iph1
->key
= vmalloc(keylen
>> 3);
3154 if (iph1
->key
== NULL
) {
3155 plog(LLV_ERROR
, LOCATION
, NULL
,
3156 "failed to get key buffer\n");
3160 /* set prf length */
3161 prflen
= alg_oakley_hashdef_hashlen(iph1
->approval
->hashtype
);
3163 plog(LLV_ERROR
, LOCATION
, NULL
,
3164 "invalid hash type %d.\n", iph1
->approval
->hashtype
);
3168 /* see isakmp-oakley-08 5.3. */
3169 if (iph1
->key
->l
<= iph1
->skeyid_e
->l
) {
3171 * if length(Ka) <= length(SKEYID_e)
3172 * Ka = first length(K) bit of SKEYID_e
3174 memcpy(iph1
->key
->v
, iph1
->skeyid_e
->v
, iph1
->key
->l
);
3176 vchar_t
*buf
= NULL
, *res
= NULL
;
3185 * K1 = prf(SKEYID_e, 0)
3186 * K2 = prf(SKEYID_e, K1)
3187 * K3 = prf(SKEYID_e, K2)
3189 plog(LLV_DEBUG
, LOCATION
, NULL
,
3190 "len(SKEYID_e) < len(Ka) (%zu < %zu), "
3191 "generating long key (Ka = K1 | K2 | ...)\n",
3192 iph1
->skeyid_e
->l
, iph1
->key
->l
);
3194 if ((buf
= vmalloc(prflen
>> 3)) == 0) {
3195 plog(LLV_ERROR
, LOCATION
, NULL
,
3196 "failed to get key buffer\n");
3199 p
= (u_char
*)iph1
->key
->v
;
3200 ep
= p
+ iph1
->key
->l
;
3204 if (p
== (u_char
*)iph1
->key
->v
) {
3205 /* just for computing K1 */
3209 res
= oakley_prf(iph1
->skeyid_e
, buf
, iph1
);
3214 plog(LLV_DEBUG
, LOCATION
, NULL
,
3215 "compute intermediate encryption key K%d\n",
3217 plogdump(LLV_DEBUG
, buf
->v
, buf
->l
);
3218 plogdump(LLV_DEBUG
, res
->v
, res
->l
);
3220 cplen
= (res
->l
< ep
- p
) ? res
->l
: ep
- p
;
3221 memcpy(p
, res
->v
, cplen
);
3224 buf
->l
= prflen
>> 3; /* to cancel K1 speciality */
3225 if (res
->l
!= buf
->l
) {
3226 plog(LLV_ERROR
, LOCATION
, NULL
,
3227 "internal error: res->l=%zu buf->l=%zu\n",
3233 memcpy(buf
->v
, res
->v
, res
->l
);
3242 * don't check any weak key or not.
3243 * draft-ietf-ipsec-ike-01.txt Appendix B.
3244 * draft-ietf-ipsec-ciph-aes-cbc-00.txt Section 2.3.
3248 if (iph1
->approval
->enctype
> ARRAYLEN(oakley_encdef
)
3249 || oakley_encdef
[iph1
->approval
->enctype
].weakkey
== NULL
) {
3250 plog(LLV_ERROR
, LOCATION
, NULL
,
3251 "encryption algoritym %d isn't supported.\n",
3252 iph1
->approval
->enctype
);
3255 if ((oakley_encdef
[iph1
->approval
->enctype
].weakkey
)(iph1
->key
)) {
3256 plog(LLV_ERROR
, LOCATION
, NULL
,
3257 "weakkey was generated.\n");
3262 plog(LLV_DEBUG
, LOCATION
, NULL
, "final encryption key computed:\n");
3263 plogdump(LLV_DEBUG
, iph1
->key
->v
, iph1
->key
->l
);
3271 /* allocated new buffer for CERT */
3277 new = racoon_calloc(1, sizeof(*new));
3279 plog(LLV_ERROR
, LOCATION
, NULL
,
3280 "failed to get cert's buffer\n");
3289 /* delete buffer for CERT */
3291 oakley_delcert(cert
)
3302 * compute IV and set to ph1handle
3303 * IV = hash(g^xi | g^xr)
3304 * see 4.1 Phase 1 state in draft-ietf-ipsec-ike.
3308 struct ph1handle
*iph1
;
3310 struct isakmp_ivm
*newivm
= NULL
;
3311 vchar_t
*buf
= NULL
, *bp
;
3316 len
= iph1
->dhpub
->l
+ iph1
->dhpub_p
->l
;
3319 plog(LLV_ERROR
, LOCATION
, NULL
,
3320 "failed to get iv buffer\n");
3326 bp
= (iph1
->side
== INITIATOR
? iph1
->dhpub
: iph1
->dhpub_p
);
3327 memcpy(p
, bp
->v
, bp
->l
);
3330 bp
= (iph1
->side
== INITIATOR
? iph1
->dhpub_p
: iph1
->dhpub
);
3331 memcpy(p
, bp
->v
, bp
->l
);
3335 newivm
= racoon_calloc(1, sizeof(struct isakmp_ivm
));
3336 if (newivm
== NULL
) {
3337 plog(LLV_ERROR
, LOCATION
, NULL
,
3338 "failed to get iv buffer\n");
3344 newivm
->iv
= oakley_hash(buf
, iph1
);
3345 if (newivm
->iv
== NULL
) {
3347 oakley_delivm(newivm
);
3351 /* adjust length of iv */
3352 newivm
->iv
->l
= alg_oakley_encdef_blocklen(iph1
->approval
->enctype
);
3353 if (newivm
->iv
->l
== -1) {
3354 plog(LLV_ERROR
, LOCATION
, NULL
,
3355 "invalid encryption algoriym %d.\n",
3356 iph1
->approval
->enctype
);
3358 oakley_delivm(newivm
);
3362 /* create buffer to save iv */
3363 if ((newivm
->ive
= vdup(newivm
->iv
)) == NULL
) {
3364 plog(LLV_ERROR
, LOCATION
, NULL
,
3365 "vdup (%s)\n", strerror(errno
));
3367 oakley_delivm(newivm
);
3373 plog(LLV_DEBUG
, LOCATION
, NULL
, "IV computed:\n");
3374 plogdump(LLV_DEBUG
, newivm
->iv
->v
, newivm
->iv
->l
);
3376 if (iph1
->ivm
!= NULL
)
3377 oakley_delivm(iph1
->ivm
);
3385 * compute IV for the payload after phase 1.
3386 * It's not limited for phase 2.
3387 * if pahse 1 was encrypted.
3388 * IV = hash(last CBC block of Phase 1 | M-ID)
3389 * if phase 1 was not encrypted.
3390 * IV = hash(phase 1 IV | M-ID)
3391 * see 4.2 Phase 2 state in draft-ietf-ipsec-ike.
3394 oakley_newiv2(iph1
, msgid
)
3395 struct ph1handle
*iph1
;
3398 struct isakmp_ivm
*newivm
= NULL
;
3399 vchar_t
*buf
= NULL
;
3405 len
= iph1
->ivm
->iv
->l
+ sizeof(msgid_t
);
3408 plog(LLV_ERROR
, LOCATION
, NULL
,
3409 "failed to get iv buffer\n");
3415 memcpy(p
, iph1
->ivm
->iv
->v
, iph1
->ivm
->iv
->l
);
3416 p
+= iph1
->ivm
->iv
->l
;
3418 memcpy(p
, &msgid
, sizeof(msgid
));
3420 plog(LLV_DEBUG
, LOCATION
, NULL
, "compute IV for phase2\n");
3421 plog(LLV_DEBUG
, LOCATION
, NULL
, "phase1 last IV:\n");
3422 plogdump(LLV_DEBUG
, buf
->v
, buf
->l
);
3425 newivm
= racoon_calloc(1, sizeof(struct isakmp_ivm
));
3426 if (newivm
== NULL
) {
3427 plog(LLV_ERROR
, LOCATION
, NULL
,
3428 "failed to get iv buffer\n");
3433 if ((newivm
->iv
= oakley_hash(buf
, iph1
)) == NULL
)
3436 /* adjust length of iv */
3437 newivm
->iv
->l
= alg_oakley_encdef_blocklen(iph1
->approval
->enctype
);
3438 if (newivm
->iv
->l
== -1) {
3439 plog(LLV_ERROR
, LOCATION
, NULL
,
3440 "invalid encryption algoriym %d.\n",
3441 iph1
->approval
->enctype
);
3445 /* create buffer to save new iv */
3446 if ((newivm
->ive
= vdup(newivm
->iv
)) == NULL
) {
3447 plog(LLV_ERROR
, LOCATION
, NULL
, "vdup (%s)\n", strerror(errno
));
3453 plog(LLV_DEBUG
, LOCATION
, NULL
, "phase2 IV computed:\n");
3454 plogdump(LLV_DEBUG
, newivm
->iv
->v
, newivm
->iv
->l
);
3457 if (error
&& newivm
!= NULL
){
3458 oakley_delivm(newivm
);
3468 struct isakmp_ivm
*ivm
;
3473 if (ivm
->iv
!= NULL
)
3475 if (ivm
->ive
!= NULL
)
3478 plog(LLV_DEBUG
, LOCATION
, NULL
, "IV freed\n");
3485 * save new iv and old iv.
3488 oakley_do_decrypt(iph1
, msg
, ivdp
, ivep
)
3489 struct ph1handle
*iph1
;
3490 vchar_t
*msg
, *ivdp
, *ivep
;
3492 vchar_t
*buf
= NULL
, *new = NULL
;
3499 plog(LLV_DEBUG
, LOCATION
, NULL
, "begin decryption.\n");
3501 blen
= alg_oakley_encdef_blocklen(iph1
->approval
->enctype
);
3503 plog(LLV_ERROR
, LOCATION
, NULL
,
3504 "invalid encryption algoriym %d.\n",
3505 iph1
->approval
->enctype
);
3509 /* save IV for next, but not sync. */
3510 memset(ivep
->v
, 0, ivep
->l
);
3511 memcpy(ivep
->v
, (caddr_t
)&msg
->v
[msg
->l
- blen
], blen
);
3513 plog(LLV_DEBUG
, LOCATION
, NULL
,
3514 "IV was saved for next processing:\n");
3515 plogdump(LLV_DEBUG
, ivep
->v
, ivep
->l
);
3517 pl
= msg
->v
+ sizeof(struct isakmp
);
3519 len
= msg
->l
- sizeof(struct isakmp
);
3524 plog(LLV_ERROR
, LOCATION
, NULL
,
3525 "failed to get buffer to decrypt.\n");
3528 memcpy(buf
->v
, pl
, len
);
3531 new = alg_oakley_encdef_decrypt(iph1
->approval
->enctype
,
3532 buf
, iph1
->key
, ivdp
);
3533 if (new == NULL
|| new->v
== NULL
|| new->l
== 0) {
3534 plog(LLV_ERROR
, LOCATION
, NULL
,
3535 "decryption %d failed.\n", iph1
->approval
->enctype
);
3538 plog(LLV_DEBUG
, LOCATION
, NULL
, "with key:\n");
3539 plogdump(LLV_DEBUG
, iph1
->key
->v
, iph1
->key
->l
);
3546 plog(LLV_DEBUG
, LOCATION
, NULL
, "decrypted payload by IV:\n");
3547 plogdump(LLV_DEBUG
, ivdp
->v
, ivdp
->l
);
3549 plog(LLV_DEBUG
, LOCATION
, NULL
,
3550 "decrypted payload, but not trimed.\n");
3551 plogdump(LLV_DEBUG
, new->v
, new->l
);
3553 /* get padding length */
3554 if (lcconf
->pad_excltail
)
3555 padlen
= new->v
[new->l
- 1] + 1;
3557 padlen
= new->v
[new->l
- 1];
3558 plog(LLV_DEBUG
, LOCATION
, NULL
, "padding len=%u\n", padlen
);
3561 if (lcconf
->pad_strict
) {
3562 if (padlen
> new->l
) {
3563 plog(LLV_ERROR
, LOCATION
, NULL
,
3564 "invalid padding len=%u, buflen=%zu.\n",
3566 plogdump(LLV_ERROR
, new->v
, new->l
);
3570 plog(LLV_DEBUG
, LOCATION
, NULL
, "trimmed padding\n");
3572 plog(LLV_DEBUG
, LOCATION
, NULL
, "skip to trim padding.\n");
3575 /* create new buffer */
3576 len
= sizeof(struct isakmp
) + new->l
;
3579 plog(LLV_ERROR
, LOCATION
, NULL
,
3580 "failed to get buffer to decrypt.\n");
3583 memcpy(buf
->v
, msg
->v
, sizeof(struct isakmp
));
3584 memcpy(buf
->v
+ sizeof(struct isakmp
), new->v
, new->l
);
3585 ((struct isakmp
*)buf
->v
)->len
= htonl(buf
->l
);
3587 plog(LLV_DEBUG
, LOCATION
, NULL
, "decrypted.\n");
3588 plogdump(LLV_DEBUG
, buf
->v
, buf
->l
);
3590 #ifdef HAVE_PRINT_ISAKMP_C
3591 isakmp_printpacket(buf
, iph1
->remote
, iph1
->local
, 1);
3597 if (error
&& buf
!= NULL
) {
3611 oakley_do_encrypt(iph1
, msg
, ivep
, ivp
)
3612 struct ph1handle
*iph1
;
3613 vchar_t
*msg
, *ivep
, *ivp
;
3615 vchar_t
*buf
= 0, *new = 0;
3622 plog(LLV_DEBUG
, LOCATION
, NULL
, "begin encryption.\n");
3624 /* set cbc block length */
3625 blen
= alg_oakley_encdef_blocklen(iph1
->approval
->enctype
);
3627 plog(LLV_ERROR
, LOCATION
, NULL
,
3628 "invalid encryption algoriym %d.\n",
3629 iph1
->approval
->enctype
);
3633 pl
= msg
->v
+ sizeof(struct isakmp
);
3634 len
= msg
->l
- sizeof(struct isakmp
);
3637 padlen
= oakley_padlen(len
, blen
);
3638 plog(LLV_DEBUG
, LOCATION
, NULL
, "pad length = %u\n", padlen
);
3641 buf
= vmalloc(len
+ padlen
);
3643 plog(LLV_ERROR
, LOCATION
, NULL
,
3644 "failed to get buffer to encrypt.\n");
3649 char *p
= &buf
->v
[len
];
3650 if (lcconf
->pad_random
) {
3651 for (i
= 0; i
< padlen
; i
++)
3652 *p
++ = eay_random() & 0xff;
3655 memcpy(buf
->v
, pl
, len
);
3657 /* make pad into tail */
3658 if (lcconf
->pad_excltail
)
3659 buf
->v
[len
+ padlen
- 1] = padlen
- 1;
3661 buf
->v
[len
+ padlen
- 1] = padlen
;
3663 plogdump(LLV_DEBUG
, buf
->v
, buf
->l
);
3666 new = alg_oakley_encdef_encrypt(iph1
->approval
->enctype
,
3667 buf
, iph1
->key
, ivep
);
3669 plog(LLV_ERROR
, LOCATION
, NULL
,
3670 "encryption %d failed.\n", iph1
->approval
->enctype
);
3673 plog(LLV_DEBUG
, LOCATION
, NULL
, "with key:\n");
3674 plogdump(LLV_DEBUG
, iph1
->key
->v
, iph1
->key
->l
);
3681 plog(LLV_DEBUG
, LOCATION
, NULL
, "encrypted payload by IV:\n");
3682 plogdump(LLV_DEBUG
, ivep
->v
, ivep
->l
);
3684 /* save IV for next */
3685 memset(ivp
->v
, 0, ivp
->l
);
3686 memcpy(ivp
->v
, (caddr_t
)&new->v
[new->l
- blen
], blen
);
3688 plog(LLV_DEBUG
, LOCATION
, NULL
, "save IV for next:\n");
3689 plogdump(LLV_DEBUG
, ivp
->v
, ivp
->l
);
3691 /* create new buffer */
3692 len
= sizeof(struct isakmp
) + new->l
;
3695 plog(LLV_ERROR
, LOCATION
, NULL
,
3696 "failed to get buffer to encrypt.\n");
3699 memcpy(buf
->v
, msg
->v
, sizeof(struct isakmp
));
3700 memcpy(buf
->v
+ sizeof(struct isakmp
), new->v
, new->l
);
3701 ((struct isakmp
*)buf
->v
)->len
= htonl(buf
->l
);
3705 plog(LLV_DEBUG
, LOCATION
, NULL
, "encrypted.\n");
3708 if (error
&& buf
!= NULL
) {
3718 /* culculate padding length */
3720 oakley_padlen(len
, base
)
3725 padlen
= base
- len
% base
;
3727 if (lcconf
->pad_randomlen
)
3728 padlen
+= ((eay_random() % (lcconf
->pad_maxsize
+ 1) + 1) *
3735 /* -----------------------------------------------------------------------------
3736 The base-64 encoding packs three 8-bit bytes into four 7-bit ASCII
3737 characters. If the number of bytes in the original data isn't divisable
3738 by three, "=" characters are used to pad the encoded data. The complete
3739 set of characters used in base-64 are:
3747 ----------------------------------------------------------------------------- */
3748 static const signed char base64_DecodeTable
[128] = {
3749 /* 000 */ -1, -1, -1, -1, -1, -1, -1, -1,
3750 /* 010 */ -1, -1, -1, -1, -1, -1, -1, -1,
3751 /* 020 */ -1, -1, -1, -1, -1, -1, -1, -1,
3752 /* 030 */ -1, -1, -1, -1, -1, -1, -1, -1,
3753 /* ' ' */ -1, -1, -1, -1, -1, -1, -1, -1,
3754 /* '(' */ -1, -1, -1, 62, -1, -1, -1, 63,
3755 /* '0' */ 52, 53, 54, 55, 56, 57, 58, 59,
3756 /* '8' */ 60, 61, -1, -1, -1, 0, -1, -1,
3757 /* '@' */ -1, 0, 1, 2, 3, 4, 5, 6,
3758 /* 'H' */ 7, 8, 9, 10, 11, 12, 13, 14,
3759 /* 'P' */ 15, 16, 17, 18, 19, 20, 21, 22,
3760 /* 'X' */ 23, 24, 25, -1, -1, -1, -1, -1,
3761 /* '`' */ -1, 26, 27, 28, 29, 30, 31, 32,
3762 /* 'h' */ 33, 34, 35, 36, 37, 38, 39, 40,
3763 /* 'p' */ 41, 42, 43, 44, 45, 46, 47, 48,
3764 /* 'x' */ 49, 50, 51, -1, -1, -1, -1, -1
3767 static int base64toCFData(vchar_t
*textin
, CFDataRef
*dataRef
)
3775 uint8_t *textcur
= textin
->v
;
3776 int len
= textin
->l
;
3779 tmpbuf
= malloc(len
); // len of result will be less than encoded len
3780 if (tmpbuf
== NULL
) {
3781 yyerror("memory error - could not allocate buffer for certificate reference conversion from base-64.");
3785 for (i
= 0; i
< len
; i
++) {
3789 else if (!isspace(c
))
3791 if (base64_DecodeTable
[c
] < 0)
3795 acc
+= base64_DecodeTable
[c
];
3796 if (0 == (cntr
& 0x3)) {
3797 tmpbuf
[tmpbufpos
++] = (acc
>> 16) & 0xff;
3799 tmpbuf
[tmpbufpos
++] = (acc
>> 8) & 0xff;
3801 tmpbuf
[tmpbufpos
++] = acc
& 0xff;
3804 *dataRef
= CFDataCreate(NULL
, tmpbuf
, tmpbufpos
);