This source file includes following definitions.
- import_sa
- export_sa
- import_lifetime
- export_lifetime
- import_flow
- export_encap
- export_flow
- import_address
- export_address
- import_auth
- import_credentials
- import_identity
- export_credentials
- export_auth
- export_identity
- import_key
- export_key
- import_udpencap
- export_udpencap
- import_tag
- export_tag
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 #include "pf.h"
95
96 #include <sys/types.h>
97 #include <sys/param.h>
98 #include <sys/systm.h>
99 #include <sys/mbuf.h>
100 #include <sys/kernel.h>
101 #include <sys/socket.h>
102 #include <net/route.h>
103 #include <net/if.h>
104
105 #if NPF > 0
106 #include <net/pfvar.h>
107 #endif
108
109 #include <netinet/ip_ipsp.h>
110 #ifdef INET6
111 #include <netinet6/in6_var.h>
112 #endif
113 #include <net/pfkeyv2.h>
114 #include <crypto/cryptodev.h>
115 #include <crypto/xform.h>
116
117
118
119
120
121 void
122 import_sa(struct tdb *tdb, struct sadb_sa *sadb_sa, struct ipsecinit *ii)
123 {
124 if (!sadb_sa)
125 return;
126
127 if (ii) {
128 ii->ii_encalg = sadb_sa->sadb_sa_encrypt;
129 ii->ii_authalg = sadb_sa->sadb_sa_auth;
130 ii->ii_compalg = sadb_sa->sadb_sa_encrypt;
131
132 tdb->tdb_spi = sadb_sa->sadb_sa_spi;
133 tdb->tdb_wnd = sadb_sa->sadb_sa_replay;
134
135 if (sadb_sa->sadb_sa_flags & SADB_SAFLAGS_PFS)
136 tdb->tdb_flags |= TDBF_PFS;
137
138 if (sadb_sa->sadb_sa_flags & SADB_X_SAFLAGS_HALFIV)
139 tdb->tdb_flags |= TDBF_HALFIV;
140
141 if (sadb_sa->sadb_sa_flags & SADB_X_SAFLAGS_TUNNEL)
142 tdb->tdb_flags |= TDBF_TUNNELING;
143
144 if (sadb_sa->sadb_sa_flags & SADB_X_SAFLAGS_RANDOMPADDING)
145 tdb->tdb_flags |= TDBF_RANDOMPADDING;
146
147 if (sadb_sa->sadb_sa_flags & SADB_X_SAFLAGS_NOREPLAY)
148 tdb->tdb_flags |= TDBF_NOREPLAY;
149
150 if (sadb_sa->sadb_sa_flags & SADB_X_SAFLAGS_UDPENCAP)
151 tdb->tdb_flags |= TDBF_UDPENCAP;
152 }
153
154 if (sadb_sa->sadb_sa_state != SADB_SASTATE_MATURE)
155 tdb->tdb_flags |= TDBF_INVALID;
156 }
157
158
159
160
161 void
162 export_sa(void **p, struct tdb *tdb)
163 {
164 struct sadb_sa *sadb_sa = (struct sadb_sa *) *p;
165
166 sadb_sa->sadb_sa_len = sizeof(struct sadb_sa) / sizeof(uint64_t);
167
168 sadb_sa->sadb_sa_spi = tdb->tdb_spi;
169 sadb_sa->sadb_sa_replay = tdb->tdb_wnd;
170
171 if (tdb->tdb_flags & TDBF_INVALID)
172 sadb_sa->sadb_sa_state = SADB_SASTATE_LARVAL;
173 else
174 sadb_sa->sadb_sa_state = SADB_SASTATE_MATURE;
175
176 if (tdb->tdb_sproto == IPPROTO_IPCOMP &&
177 tdb->tdb_compalgxform != NULL) {
178 switch (tdb->tdb_compalgxform->type) {
179 case CRYPTO_DEFLATE_COMP:
180 sadb_sa->sadb_sa_encrypt = SADB_X_CALG_DEFLATE;
181 break;
182 case CRYPTO_LZS_COMP:
183 sadb_sa->sadb_sa_encrypt = SADB_X_CALG_LZS;
184 break;
185 }
186 }
187
188 if (tdb->tdb_authalgxform) {
189 switch (tdb->tdb_authalgxform->type) {
190 case CRYPTO_MD5_HMAC:
191 sadb_sa->sadb_sa_auth = SADB_AALG_MD5HMAC;
192 break;
193
194 case CRYPTO_SHA1_HMAC:
195 sadb_sa->sadb_sa_auth = SADB_AALG_SHA1HMAC;
196 break;
197
198 case CRYPTO_RIPEMD160_HMAC:
199 sadb_sa->sadb_sa_auth = SADB_X_AALG_RIPEMD160HMAC;
200 break;
201
202 case CRYPTO_SHA2_256_HMAC:
203 sadb_sa->sadb_sa_auth = SADB_X_AALG_SHA2_256;
204 break;
205
206 case CRYPTO_SHA2_384_HMAC:
207 sadb_sa->sadb_sa_auth = SADB_X_AALG_SHA2_384;
208 break;
209
210 case CRYPTO_SHA2_512_HMAC:
211 sadb_sa->sadb_sa_auth = SADB_X_AALG_SHA2_512;
212 break;
213
214 case CRYPTO_MD5_KPDK:
215 sadb_sa->sadb_sa_auth = SADB_X_AALG_MD5;
216 break;
217
218 case CRYPTO_SHA1_KPDK:
219 sadb_sa->sadb_sa_auth = SADB_X_AALG_SHA1;
220 break;
221 }
222 }
223
224 if (tdb->tdb_encalgxform) {
225 switch (tdb->tdb_encalgxform->type) {
226 case CRYPTO_NULL:
227 sadb_sa->sadb_sa_encrypt = SADB_EALG_NULL;
228 break;
229
230 case CRYPTO_DES_CBC:
231 sadb_sa->sadb_sa_encrypt = SADB_EALG_DESCBC;
232 break;
233
234 case CRYPTO_3DES_CBC:
235 sadb_sa->sadb_sa_encrypt = SADB_EALG_3DESCBC;
236 break;
237
238 case CRYPTO_AES_CBC:
239 sadb_sa->sadb_sa_encrypt = SADB_X_EALG_AES;
240 break;
241
242 case CRYPTO_AES_CTR:
243 sadb_sa->sadb_sa_encrypt = SADB_X_EALG_AESCTR;
244 break;
245
246 case CRYPTO_CAST_CBC:
247 sadb_sa->sadb_sa_encrypt = SADB_X_EALG_CAST;
248 break;
249
250 case CRYPTO_BLF_CBC:
251 sadb_sa->sadb_sa_encrypt = SADB_X_EALG_BLF;
252 break;
253
254 case CRYPTO_SKIPJACK_CBC:
255 sadb_sa->sadb_sa_encrypt = SADB_X_EALG_SKIPJACK;
256 break;
257 }
258 }
259
260 if (tdb->tdb_flags & TDBF_PFS)
261 sadb_sa->sadb_sa_flags |= SADB_SAFLAGS_PFS;
262
263
264 if (tdb->tdb_flags & TDBF_HALFIV)
265 sadb_sa->sadb_sa_flags |= SADB_X_SAFLAGS_HALFIV;
266
267 if (tdb->tdb_flags & TDBF_TUNNELING)
268 sadb_sa->sadb_sa_flags |= SADB_X_SAFLAGS_TUNNEL;
269
270 if (tdb->tdb_flags & TDBF_RANDOMPADDING)
271 sadb_sa->sadb_sa_flags |= SADB_X_SAFLAGS_RANDOMPADDING;
272
273 if (tdb->tdb_flags & TDBF_NOREPLAY)
274 sadb_sa->sadb_sa_flags |= SADB_X_SAFLAGS_NOREPLAY;
275
276 *p += sizeof(struct sadb_sa);
277 }
278
279
280
281
282 void
283 import_lifetime(struct tdb *tdb, struct sadb_lifetime *sadb_lifetime, int type)
284 {
285 struct timeval tv;
286
287 if (!sadb_lifetime)
288 return;
289
290 getmicrotime(&tv);
291
292 switch (type) {
293 case PFKEYV2_LIFETIME_HARD:
294 if ((tdb->tdb_exp_allocations =
295 sadb_lifetime->sadb_lifetime_allocations) != 0)
296 tdb->tdb_flags |= TDBF_ALLOCATIONS;
297 else
298 tdb->tdb_flags &= ~TDBF_ALLOCATIONS;
299
300 if ((tdb->tdb_exp_bytes =
301 sadb_lifetime->sadb_lifetime_bytes) != 0)
302 tdb->tdb_flags |= TDBF_BYTES;
303 else
304 tdb->tdb_flags &= ~TDBF_BYTES;
305
306 if ((tdb->tdb_exp_timeout =
307 sadb_lifetime->sadb_lifetime_addtime) != 0) {
308 tdb->tdb_flags |= TDBF_TIMER;
309 if (tv.tv_sec + tdb->tdb_exp_timeout < tv.tv_sec)
310 tv.tv_sec = ((unsigned long) -1) / 2;
311 else
312 tv.tv_sec += tdb->tdb_exp_timeout;
313 timeout_add(&tdb->tdb_timer_tmo, hzto(&tv));
314 } else
315 tdb->tdb_flags &= ~TDBF_TIMER;
316
317 if ((tdb->tdb_exp_first_use =
318 sadb_lifetime->sadb_lifetime_usetime) != 0)
319 tdb->tdb_flags |= TDBF_FIRSTUSE;
320 else
321 tdb->tdb_flags &= ~TDBF_FIRSTUSE;
322 break;
323
324 case PFKEYV2_LIFETIME_SOFT:
325 if ((tdb->tdb_soft_allocations =
326 sadb_lifetime->sadb_lifetime_allocations) != 0)
327 tdb->tdb_flags |= TDBF_SOFT_ALLOCATIONS;
328 else
329 tdb->tdb_flags &= ~TDBF_SOFT_ALLOCATIONS;
330
331 if ((tdb->tdb_soft_bytes =
332 sadb_lifetime->sadb_lifetime_bytes) != 0)
333 tdb->tdb_flags |= TDBF_SOFT_BYTES;
334 else
335 tdb->tdb_flags &= ~TDBF_SOFT_BYTES;
336
337 if ((tdb->tdb_soft_timeout =
338 sadb_lifetime->sadb_lifetime_addtime) != 0) {
339 tdb->tdb_flags |= TDBF_SOFT_TIMER;
340 if (tv.tv_sec + tdb->tdb_soft_timeout < tv.tv_sec)
341 tv.tv_sec = ((unsigned long) -1) / 2;
342 else
343 tv.tv_sec += tdb->tdb_soft_timeout;
344 timeout_add(&tdb->tdb_stimer_tmo, hzto(&tv));
345 } else
346 tdb->tdb_flags &= ~TDBF_SOFT_TIMER;
347
348 if ((tdb->tdb_soft_first_use =
349 sadb_lifetime->sadb_lifetime_usetime) != 0)
350 tdb->tdb_flags |= TDBF_SOFT_FIRSTUSE;
351 else
352 tdb->tdb_flags &= ~TDBF_SOFT_FIRSTUSE;
353 break;
354
355 case PFKEYV2_LIFETIME_CURRENT:
356 tdb->tdb_cur_allocations =
357 sadb_lifetime->sadb_lifetime_allocations;
358 tdb->tdb_cur_bytes = sadb_lifetime->sadb_lifetime_bytes;
359 tdb->tdb_established = sadb_lifetime->sadb_lifetime_addtime;
360 tdb->tdb_first_use = sadb_lifetime->sadb_lifetime_usetime;
361 }
362 }
363
364
365
366
367 void
368 export_lifetime(void **p, struct tdb *tdb, int type)
369 {
370 struct sadb_lifetime *sadb_lifetime = (struct sadb_lifetime *) *p;
371
372 sadb_lifetime->sadb_lifetime_len = sizeof(struct sadb_lifetime) /
373 sizeof(uint64_t);
374
375 switch (type) {
376 case PFKEYV2_LIFETIME_HARD:
377 if (tdb->tdb_flags & TDBF_ALLOCATIONS)
378 sadb_lifetime->sadb_lifetime_allocations =
379 tdb->tdb_exp_allocations;
380
381 if (tdb->tdb_flags & TDBF_BYTES)
382 sadb_lifetime->sadb_lifetime_bytes =
383 tdb->tdb_exp_bytes;
384
385 if (tdb->tdb_flags & TDBF_TIMER)
386 sadb_lifetime->sadb_lifetime_addtime =
387 tdb->tdb_exp_timeout;
388
389 if (tdb->tdb_flags & TDBF_FIRSTUSE)
390 sadb_lifetime->sadb_lifetime_usetime =
391 tdb->tdb_exp_first_use;
392 break;
393
394 case PFKEYV2_LIFETIME_SOFT:
395 if (tdb->tdb_flags & TDBF_SOFT_ALLOCATIONS)
396 sadb_lifetime->sadb_lifetime_allocations =
397 tdb->tdb_soft_allocations;
398
399 if (tdb->tdb_flags & TDBF_SOFT_BYTES)
400 sadb_lifetime->sadb_lifetime_bytes =
401 tdb->tdb_soft_bytes;
402
403 if (tdb->tdb_flags & TDBF_SOFT_TIMER)
404 sadb_lifetime->sadb_lifetime_addtime =
405 tdb->tdb_soft_timeout;
406
407 if (tdb->tdb_flags & TDBF_SOFT_FIRSTUSE)
408 sadb_lifetime->sadb_lifetime_usetime =
409 tdb->tdb_soft_first_use;
410 break;
411
412 case PFKEYV2_LIFETIME_CURRENT:
413 sadb_lifetime->sadb_lifetime_allocations =
414 tdb->tdb_cur_allocations;
415 sadb_lifetime->sadb_lifetime_bytes = tdb->tdb_cur_bytes;
416 sadb_lifetime->sadb_lifetime_addtime = tdb->tdb_established;
417 sadb_lifetime->sadb_lifetime_usetime = tdb->tdb_first_use;
418 break;
419
420 case PFKEYV2_LIFETIME_LASTUSE:
421 sadb_lifetime->sadb_lifetime_allocations = 0;
422 sadb_lifetime->sadb_lifetime_bytes = 0;
423 sadb_lifetime->sadb_lifetime_addtime = 0;
424 sadb_lifetime->sadb_lifetime_usetime = tdb->tdb_last_used;
425 break;
426 }
427
428 *p += sizeof(struct sadb_lifetime);
429 }
430
431
432
433
434
435 void
436 import_flow(struct sockaddr_encap *flow, struct sockaddr_encap *flowmask,
437 struct sadb_address *ssrc, struct sadb_address *ssrcmask,
438 struct sadb_address *ddst, struct sadb_address *ddstmask,
439 struct sadb_protocol *sab, struct sadb_protocol *ftype)
440 {
441 u_int8_t transproto = 0;
442 union sockaddr_union *src = (union sockaddr_union *)(ssrc + 1);
443 union sockaddr_union *dst = (union sockaddr_union *)(ddst + 1);
444 union sockaddr_union *srcmask = (union sockaddr_union *)(ssrcmask + 1);
445 union sockaddr_union *dstmask = (union sockaddr_union *)(ddstmask + 1);
446
447 if (ssrc == NULL)
448 return;
449
450 bzero(flow, sizeof(*flow));
451 bzero(flowmask, sizeof(*flowmask));
452
453 if (sab != NULL)
454 transproto = sab->sadb_protocol_proto;
455
456
457
458
459
460 if ((src->sa.sa_family != dst->sa.sa_family) ||
461 (src->sa.sa_family != srcmask->sa.sa_family) ||
462 (src->sa.sa_family != dstmask->sa.sa_family))
463 return;
464
465
466
467
468
469 flow->sen_family = flowmask->sen_family = PF_KEY;
470 flow->sen_len = flowmask->sen_len = SENT_LEN;
471
472 switch (src->sa.sa_family)
473 {
474 #ifdef INET
475 case AF_INET:
476
477 rt_maskedcopy(&src->sa, &src->sa, &srcmask->sa);
478 rt_maskedcopy(&dst->sa, &dst->sa, &dstmask->sa);
479
480 flow->sen_type = SENT_IP4;
481 flow->sen_direction = ftype->sadb_protocol_direction;
482 flow->sen_ip_src = src->sin.sin_addr;
483 flow->sen_ip_dst = dst->sin.sin_addr;
484 flow->sen_proto = transproto;
485 flow->sen_sport = src->sin.sin_port;
486 flow->sen_dport = dst->sin.sin_port;
487
488 flowmask->sen_type = SENT_IP4;
489 flowmask->sen_direction = 0xff;
490 flowmask->sen_ip_src = srcmask->sin.sin_addr;
491 flowmask->sen_ip_dst = dstmask->sin.sin_addr;
492 flowmask->sen_sport = srcmask->sin.sin_port;
493 flowmask->sen_dport = dstmask->sin.sin_port;
494 if (transproto)
495 flowmask->sen_proto = 0xff;
496 break;
497 #endif
498
499 #ifdef INET6
500 case AF_INET6:
501 in6_embedscope(&src->sin6.sin6_addr, &src->sin6,
502 NULL, NULL);
503 in6_embedscope(&dst->sin6.sin6_addr, &dst->sin6,
504 NULL, NULL);
505
506
507 rt_maskedcopy(&src->sa, &src->sa, &srcmask->sa);
508 rt_maskedcopy(&dst->sa, &dst->sa, &dstmask->sa);
509
510 flow->sen_type = SENT_IP6;
511 flow->sen_ip6_direction = ftype->sadb_protocol_direction;
512 flow->sen_ip6_src = src->sin6.sin6_addr;
513 flow->sen_ip6_dst = dst->sin6.sin6_addr;
514 flow->sen_ip6_proto = transproto;
515 flow->sen_ip6_sport = src->sin6.sin6_port;
516 flow->sen_ip6_dport = dst->sin6.sin6_port;
517
518 flowmask->sen_type = SENT_IP6;
519 flowmask->sen_ip6_direction = 0xff;
520 flowmask->sen_ip6_src = srcmask->sin6.sin6_addr;
521 flowmask->sen_ip6_dst = dstmask->sin6.sin6_addr;
522 flowmask->sen_ip6_sport = srcmask->sin6.sin6_port;
523 flowmask->sen_ip6_dport = dstmask->sin6.sin6_port;
524 if (transproto)
525 flowmask->sen_ip6_proto = 0xff;
526 break;
527 #endif
528 }
529 }
530
531
532
533
534 static void
535 export_encap(void **p, struct sockaddr_encap *encap, int type)
536 {
537 struct sadb_address *saddr = (struct sadb_address *)*p;
538 union sockaddr_union *sunion;
539
540 *p += sizeof(struct sadb_address);
541 sunion = (union sockaddr_union *)*p;
542
543 switch (encap->sen_type) {
544 case SENT_IP4:
545 saddr->sadb_address_len = (sizeof(struct sadb_address) +
546 PADUP(sizeof(struct sockaddr_in))) / sizeof(uint64_t);
547 sunion->sa.sa_len = sizeof(struct sockaddr_in);
548 sunion->sa.sa_family = AF_INET;
549 if (type == SADB_X_EXT_SRC_FLOW ||
550 type == SADB_X_EXT_SRC_MASK) {
551 sunion->sin.sin_addr = encap->sen_ip_src;
552 sunion->sin.sin_port = encap->sen_sport;
553 } else {
554 sunion->sin.sin_addr = encap->sen_ip_dst;
555 sunion->sin.sin_port = encap->sen_dport;
556 }
557 *p += PADUP(sizeof(struct sockaddr_in));
558 break;
559 case SENT_IP6:
560 saddr->sadb_address_len = (sizeof(struct sadb_address)
561 + PADUP(sizeof(struct sockaddr_in6))) / sizeof(uint64_t);
562 sunion->sa.sa_len = sizeof(struct sockaddr_in6);
563 sunion->sa.sa_family = AF_INET6;
564 if (type == SADB_X_EXT_SRC_FLOW ||
565 type == SADB_X_EXT_SRC_MASK) {
566 sunion->sin6.sin6_addr = encap->sen_ip6_src;
567 sunion->sin6.sin6_port = encap->sen_ip6_sport;
568 } else {
569 sunion->sin6.sin6_addr = encap->sen_ip6_dst;
570 sunion->sin6.sin6_port = encap->sen_ip6_dport;
571 }
572 *p += PADUP(sizeof(struct sockaddr_in6));
573 break;
574 }
575 }
576
577
578
579
580 void
581 export_flow(void **p, u_int8_t ftype, struct sockaddr_encap *flow,
582 struct sockaddr_encap *flowmask, void **headers)
583 {
584 struct sadb_protocol *sab;
585
586 headers[SADB_X_EXT_FLOW_TYPE] = *p;
587 sab = (struct sadb_protocol *)*p;
588 sab->sadb_protocol_len = sizeof(struct sadb_protocol) /
589 sizeof(uint64_t);
590
591 switch (ftype) {
592 case IPSP_IPSEC_USE:
593 sab->sadb_protocol_proto = SADB_X_FLOW_TYPE_USE;
594 break;
595 case IPSP_IPSEC_ACQUIRE:
596 sab->sadb_protocol_proto = SADB_X_FLOW_TYPE_ACQUIRE;
597 break;
598 case IPSP_IPSEC_REQUIRE:
599 sab->sadb_protocol_proto = SADB_X_FLOW_TYPE_REQUIRE;
600 break;
601 case IPSP_DENY:
602 sab->sadb_protocol_proto = SADB_X_FLOW_TYPE_DENY;
603 break;
604 case IPSP_PERMIT:
605 sab->sadb_protocol_proto = SADB_X_FLOW_TYPE_BYPASS;
606 break;
607 case IPSP_IPSEC_DONTACQ:
608 sab->sadb_protocol_proto = SADB_X_FLOW_TYPE_DONTACQ;
609 break;
610 default:
611 sab->sadb_protocol_proto = 0;
612 break;
613 }
614
615 switch (flow->sen_type) {
616 #ifdef INET
617 case SENT_IP4:
618 sab->sadb_protocol_direction = flow->sen_direction;
619 break;
620 #endif
621 #ifdef INET6
622 case SENT_IP6:
623 sab->sadb_protocol_direction = flow->sen_ip6_direction;
624 break;
625 #endif
626 }
627 *p += sizeof(struct sadb_protocol);
628
629 headers[SADB_X_EXT_PROTOCOL] = *p;
630 sab = (struct sadb_protocol *)*p;
631 sab->sadb_protocol_len = sizeof(struct sadb_protocol) /
632 sizeof(uint64_t);
633 switch (flow->sen_type) {
634 #ifdef INET
635 case SENT_IP4:
636 sab->sadb_protocol_proto = flow->sen_proto;
637 break;
638 #endif
639 #ifdef INET6
640 case SENT_IP6:
641 sab->sadb_protocol_proto = flow->sen_ip6_proto;
642 break;
643 #endif
644 }
645 *p += sizeof(struct sadb_protocol);
646
647 headers[SADB_X_EXT_SRC_FLOW] = *p;
648 export_encap(p, flow, SADB_X_EXT_SRC_FLOW);
649
650 headers[SADB_X_EXT_SRC_MASK] = *p;
651 export_encap(p, flowmask, SADB_X_EXT_SRC_MASK);
652
653 headers[SADB_X_EXT_DST_FLOW] = *p;
654 export_encap(p, flow, SADB_X_EXT_DST_FLOW);
655
656 headers[SADB_X_EXT_DST_MASK] = *p;
657 export_encap(p, flowmask, SADB_X_EXT_DST_MASK);
658 }
659
660
661
662
663 void
664 import_address(struct sockaddr *sa, struct sadb_address *sadb_address)
665 {
666 int salen;
667 struct sockaddr *ssa = (struct sockaddr *)((void *) sadb_address +
668 sizeof(struct sadb_address));
669
670 if (!sadb_address)
671 return;
672
673 if (ssa->sa_len)
674 salen = ssa->sa_len;
675 else
676 switch (ssa->sa_family) {
677 #ifdef INET
678 case AF_INET:
679 salen = sizeof(struct sockaddr_in);
680 break;
681 #endif
682
683 #if INET6
684 case AF_INET6:
685 salen = sizeof(struct sockaddr_in6);
686 break;
687 #endif
688
689 default:
690 return;
691 }
692
693 bcopy(ssa, sa, salen);
694 sa->sa_len = salen;
695 }
696
697
698
699
700 void
701 export_address(void **p, struct sockaddr *sa)
702 {
703 struct sadb_address *sadb_address = (struct sadb_address *) *p;
704
705 sadb_address->sadb_address_len = (sizeof(struct sadb_address) +
706 PADUP(SA_LEN(sa))) / sizeof(uint64_t);
707
708 *p += sizeof(struct sadb_address);
709 bcopy(sa, *p, SA_LEN(sa));
710 ((struct sockaddr *) *p)->sa_family = sa->sa_family;
711 *p += PADUP(SA_LEN(sa));
712 }
713
714
715
716
717 void
718 import_auth(struct tdb *tdb, struct sadb_x_cred *sadb_auth, int dstauth)
719 {
720 struct ipsec_ref **ipr;
721
722 if (!sadb_auth)
723 return;
724
725 if (dstauth == PFKEYV2_AUTH_REMOTE)
726 ipr = &tdb->tdb_remote_auth;
727 else
728 ipr = &tdb->tdb_local_auth;
729
730 MALLOC(*ipr, struct ipsec_ref *, EXTLEN(sadb_auth) -
731 sizeof(struct sadb_x_cred) + sizeof(struct ipsec_ref),
732 M_CREDENTIALS, M_WAITOK);
733 (*ipr)->ref_len = EXTLEN(sadb_auth) - sizeof(struct sadb_x_cred);
734
735 switch (sadb_auth->sadb_x_cred_type) {
736 case SADB_X_AUTHTYPE_PASSPHRASE:
737 (*ipr)->ref_type = IPSP_AUTH_PASSPHRASE;
738 break;
739 case SADB_X_AUTHTYPE_RSA:
740 (*ipr)->ref_type = IPSP_AUTH_RSA;
741 break;
742 default:
743 FREE(*ipr, M_CREDENTIALS);
744 *ipr = NULL;
745 return;
746 }
747 (*ipr)->ref_count = 1;
748 (*ipr)->ref_malloctype = M_CREDENTIALS;
749 bcopy((void *) sadb_auth + sizeof(struct sadb_x_cred),
750 (*ipr) + 1, (*ipr)->ref_len);
751 }
752
753
754
755
756 void
757 import_credentials(struct tdb *tdb, struct sadb_x_cred *sadb_cred, int dstcred)
758 {
759 struct ipsec_ref **ipr;
760
761 if (!sadb_cred)
762 return;
763
764 if (dstcred == PFKEYV2_CRED_REMOTE)
765 ipr = &tdb->tdb_remote_cred;
766 else
767 ipr = &tdb->tdb_local_cred;
768
769 MALLOC(*ipr, struct ipsec_ref *, EXTLEN(sadb_cred) -
770 sizeof(struct sadb_x_cred) + sizeof(struct ipsec_ref),
771 M_CREDENTIALS, M_WAITOK);
772 (*ipr)->ref_len = EXTLEN(sadb_cred) - sizeof(struct sadb_x_cred);
773
774 switch (sadb_cred->sadb_x_cred_type) {
775 case SADB_X_CREDTYPE_X509:
776 (*ipr)->ref_type = IPSP_CRED_X509;
777 break;
778 case SADB_X_CREDTYPE_KEYNOTE:
779 (*ipr)->ref_type = IPSP_CRED_KEYNOTE;
780 break;
781 default:
782 FREE(*ipr, M_CREDENTIALS);
783 *ipr = NULL;
784 return;
785 }
786 (*ipr)->ref_count = 1;
787 (*ipr)->ref_malloctype = M_CREDENTIALS;
788 bcopy((void *) sadb_cred + sizeof(struct sadb_x_cred),
789 (*ipr) + 1, (*ipr)->ref_len);
790 }
791
792
793
794
795 void
796 import_identity(struct tdb *tdb, struct sadb_ident *sadb_ident, int type)
797 {
798 struct ipsec_ref **ipr;
799
800 if (!sadb_ident)
801 return;
802
803 if (type == PFKEYV2_IDENTITY_SRC)
804 ipr = &tdb->tdb_srcid;
805 else
806 ipr = &tdb->tdb_dstid;
807
808 MALLOC(*ipr, struct ipsec_ref *, EXTLEN(sadb_ident) -
809 sizeof(struct sadb_ident) + sizeof(struct ipsec_ref),
810 M_CREDENTIALS, M_WAITOK);
811 (*ipr)->ref_len = EXTLEN(sadb_ident) - sizeof(struct sadb_ident);
812
813 switch (sadb_ident->sadb_ident_type) {
814 case SADB_IDENTTYPE_PREFIX:
815 (*ipr)->ref_type = IPSP_IDENTITY_PREFIX;
816 break;
817 case SADB_IDENTTYPE_FQDN:
818 (*ipr)->ref_type = IPSP_IDENTITY_FQDN;
819 break;
820 case SADB_IDENTTYPE_USERFQDN:
821 (*ipr)->ref_type = IPSP_IDENTITY_USERFQDN;
822 break;
823 case SADB_X_IDENTTYPE_CONNECTION:
824 (*ipr)->ref_type = IPSP_IDENTITY_CONNECTION;
825 break;
826 default:
827 FREE(*ipr, M_CREDENTIALS);
828 *ipr = NULL;
829 return;
830 }
831 (*ipr)->ref_count = 1;
832 (*ipr)->ref_malloctype = M_CREDENTIALS;
833 bcopy((void *) sadb_ident + sizeof(struct sadb_ident), (*ipr) + 1,
834 (*ipr)->ref_len);
835 }
836
837 void
838 export_credentials(void **p, struct tdb *tdb, int dstcred)
839 {
840 struct ipsec_ref **ipr;
841 struct sadb_x_cred *sadb_cred = (struct sadb_x_cred *) *p;
842
843 if (dstcred == PFKEYV2_CRED_REMOTE)
844 ipr = &tdb->tdb_remote_cred;
845 else
846 ipr = &tdb->tdb_local_cred;
847
848 sadb_cred->sadb_x_cred_len = (sizeof(struct sadb_x_cred) +
849 PADUP((*ipr)->ref_len)) / sizeof(uint64_t);
850
851 switch ((*ipr)->ref_type) {
852 case IPSP_CRED_KEYNOTE:
853 sadb_cred->sadb_x_cred_type = SADB_X_CREDTYPE_KEYNOTE;
854 break;
855 case IPSP_CRED_X509:
856 sadb_cred->sadb_x_cred_type = SADB_X_CREDTYPE_X509;
857 break;
858 }
859 *p += sizeof(struct sadb_x_cred);
860 bcopy((*ipr) + 1, *p, (*ipr)->ref_len);
861 *p += PADUP((*ipr)->ref_len);
862 }
863
864 void
865 export_auth(void **p, struct tdb *tdb, int dstauth)
866 {
867 struct ipsec_ref **ipr;
868 struct sadb_x_cred *sadb_auth = (struct sadb_x_cred *) *p;
869
870 if (dstauth == PFKEYV2_AUTH_REMOTE)
871 ipr = &tdb->tdb_remote_auth;
872 else
873 ipr = &tdb->tdb_local_auth;
874
875 sadb_auth->sadb_x_cred_len = (sizeof(struct sadb_x_cred) +
876 PADUP((*ipr)->ref_len)) / sizeof(uint64_t);
877
878 switch ((*ipr)->ref_type) {
879 case IPSP_AUTH_PASSPHRASE:
880 sadb_auth->sadb_x_cred_type = SADB_X_AUTHTYPE_PASSPHRASE;
881 break;
882 case IPSP_AUTH_RSA:
883 sadb_auth->sadb_x_cred_type = SADB_X_AUTHTYPE_RSA;
884 break;
885 }
886 *p += sizeof(struct sadb_x_cred);
887 bcopy((*ipr) + 1, *p, (*ipr)->ref_len);
888 *p += PADUP((*ipr)->ref_len);
889 }
890
891 void
892 export_identity(void **p, struct tdb *tdb, int type)
893 {
894 struct ipsec_ref **ipr;
895 struct sadb_ident *sadb_ident = (struct sadb_ident *) *p;
896
897 if (type == PFKEYV2_IDENTITY_SRC)
898 ipr = &tdb->tdb_srcid;
899 else
900 ipr = &tdb->tdb_dstid;
901
902 sadb_ident->sadb_ident_len = (sizeof(struct sadb_ident) +
903 PADUP((*ipr)->ref_len)) / sizeof(uint64_t);
904
905 switch ((*ipr)->ref_type) {
906 case IPSP_IDENTITY_PREFIX:
907 sadb_ident->sadb_ident_type = SADB_IDENTTYPE_PREFIX;
908 break;
909 case IPSP_IDENTITY_FQDN:
910 sadb_ident->sadb_ident_type = SADB_IDENTTYPE_FQDN;
911 break;
912 case IPSP_IDENTITY_USERFQDN:
913 sadb_ident->sadb_ident_type = SADB_IDENTTYPE_USERFQDN;
914 break;
915 case IPSP_IDENTITY_CONNECTION:
916 sadb_ident->sadb_ident_type = SADB_X_IDENTTYPE_CONNECTION;
917 break;
918 }
919 *p += sizeof(struct sadb_ident);
920 bcopy((*ipr) + 1, *p, (*ipr)->ref_len);
921 *p += PADUP((*ipr)->ref_len);
922 }
923
924
925 void
926 import_key(struct ipsecinit *ii, struct sadb_key *sadb_key, int type)
927 {
928 if (!sadb_key)
929 return;
930
931 if (type == PFKEYV2_ENCRYPTION_KEY) {
932 ii->ii_enckeylen = sadb_key->sadb_key_bits / 8;
933 ii->ii_enckey = (void *)sadb_key + sizeof(struct sadb_key);
934 } else {
935 ii->ii_authkeylen = sadb_key->sadb_key_bits / 8;
936 ii->ii_authkey = (void *)sadb_key + sizeof(struct sadb_key);
937 }
938 }
939
940 void
941 export_key(void **p, struct tdb *tdb, int type)
942 {
943 struct sadb_key *sadb_key = (struct sadb_key *) *p;
944
945 if (type == PFKEYV2_ENCRYPTION_KEY) {
946 sadb_key->sadb_key_len = (sizeof(struct sadb_key) +
947 PADUP(tdb->tdb_emxkeylen)) /
948 sizeof(uint64_t);
949 sadb_key->sadb_key_bits = tdb->tdb_emxkeylen * 8;
950 *p += sizeof(struct sadb_key);
951 bcopy(tdb->tdb_emxkey, *p, tdb->tdb_emxkeylen);
952 *p += PADUP(tdb->tdb_emxkeylen);
953 } else {
954 sadb_key->sadb_key_len = (sizeof(struct sadb_key) +
955 PADUP(tdb->tdb_amxkeylen)) /
956 sizeof(uint64_t);
957 sadb_key->sadb_key_bits = tdb->tdb_amxkeylen * 8;
958 *p += sizeof(struct sadb_key);
959 bcopy(tdb->tdb_amxkey, *p, tdb->tdb_amxkeylen);
960 *p += PADUP(tdb->tdb_amxkeylen);
961 }
962 }
963
964
965 void
966 import_udpencap(struct tdb *tdb, struct sadb_x_udpencap *sadb_udpencap)
967 {
968 if (sadb_udpencap)
969 tdb->tdb_udpencap_port = sadb_udpencap->sadb_x_udpencap_port;
970 }
971
972 void
973 export_udpencap(void **p, struct tdb *tdb)
974 {
975 struct sadb_x_udpencap *sadb_udpencap = (struct sadb_x_udpencap *) *p;
976
977 sadb_udpencap->sadb_x_udpencap_port = tdb->tdb_udpencap_port;
978 sadb_udpencap->sadb_x_udpencap_reserved = 0;
979 sadb_udpencap->sadb_x_udpencap_len =
980 sizeof(struct sadb_x_udpencap) / sizeof(uint64_t);
981 *p += sizeof(struct sadb_x_udpencap);
982 }
983
984 #if NPF > 0
985
986 void
987 import_tag(struct tdb *tdb, struct sadb_x_tag *stag)
988 {
989 char *s;
990
991 if (stag) {
992 s = (char *)(stag + 1);
993 tdb->tdb_tag = pf_tagname2tag(s);
994 }
995 }
996
997
998 void
999 export_tag(void **p, struct tdb *tdb)
1000 {
1001 struct sadb_x_tag *stag = (struct sadb_x_tag *)*p;
1002 char *s = (char *)(stag + 1);
1003
1004 pf_tag2tagname(tdb->tdb_tag, s);
1005 stag->sadb_x_tag_taglen = strlen(s) + 1;
1006 stag->sadb_x_tag_len = (sizeof(struct sadb_x_tag) +
1007 PADUP(stag->sadb_x_tag_taglen)) / sizeof(uint64_t);
1008 *p += PADUP(stag->sadb_x_tag_taglen) + sizeof(struct sadb_x_tag);
1009 }
1010 #endif