1 /* key-chain for authentication.
2 Copyright (C) 2000 Kunihiro Ishiguro
4 This file is part of GNU Zebra.
6 GNU Zebra is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published
8 by the Free Software Foundation; either version 2, or (at your
9 option) any later version.
11 GNU Zebra is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Zebra; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
28 DEFINE_MTYPE_STATIC(LIB
, KEY
, "Key")
29 DEFINE_MTYPE_STATIC(LIB
, KEYCHAIN
, "Key chain")
31 DEFINE_QOBJ_TYPE(keychain
)
34 /* Master list of key chain. */
35 struct list
*keychain_list
;
37 static struct keychain
*
40 struct keychain
*keychain
;
41 keychain
= XCALLOC (MTYPE_KEYCHAIN
, sizeof (struct keychain
));
42 QOBJ_REG (keychain
, keychain
);
47 keychain_free (struct keychain
*keychain
)
49 QOBJ_UNREG (keychain
);
50 XFREE (MTYPE_KEYCHAIN
, keychain
);
56 struct key
*key
= XCALLOC (MTYPE_KEY
, sizeof (struct key
));
62 key_free (struct key
*key
)
65 XFREE (MTYPE_KEY
, key
);
69 keychain_lookup (const char *name
)
71 struct listnode
*node
;
72 struct keychain
*keychain
;
77 for (ALL_LIST_ELEMENTS_RO (keychain_list
, node
, keychain
))
79 if (strcmp (keychain
->name
, name
) == 0)
86 key_cmp_func (void *arg1
, void *arg2
)
88 const struct key
*k1
= arg1
;
89 const struct key
*k2
= arg2
;
91 if (k1
->index
> k2
->index
)
93 if (k1
->index
< k2
->index
)
99 key_delete_func (struct key
*key
)
106 static struct keychain
*
107 keychain_get (const char *name
)
109 struct keychain
*keychain
;
111 keychain
= keychain_lookup (name
);
116 keychain
= keychain_new ();
117 keychain
->name
= XSTRDUP(MTYPE_KEYCHAIN
, name
);
118 keychain
->key
= list_new ();
119 keychain
->key
->cmp
= (int (*)(void *, void *)) key_cmp_func
;
120 keychain
->key
->del
= (void (*)(void *)) key_delete_func
;
121 listnode_add (keychain_list
, keychain
);
127 keychain_delete (struct keychain
*keychain
)
130 XFREE(MTYPE_KEYCHAIN
, keychain
->name
);
132 list_delete (keychain
->key
);
133 listnode_delete (keychain_list
, keychain
);
134 keychain_free (keychain
);
138 key_lookup (const struct keychain
*keychain
, u_int32_t index
)
140 struct listnode
*node
;
143 for (ALL_LIST_ELEMENTS_RO (keychain
->key
, node
, key
))
145 if (key
->index
== index
)
152 key_lookup_for_accept (const struct keychain
*keychain
, u_int32_t index
)
154 struct listnode
*node
;
160 for (ALL_LIST_ELEMENTS_RO (keychain
->key
, node
, key
))
162 if (key
->index
>= index
)
164 if (key
->accept
.start
== 0)
167 if (key
->accept
.start
<= now
)
168 if (key
->accept
.end
>= now
|| key
->accept
.end
== -1)
176 key_match_for_accept (const struct keychain
*keychain
, const char *auth_str
)
178 struct listnode
*node
;
184 for (ALL_LIST_ELEMENTS_RO (keychain
->key
, node
, key
))
186 if (key
->accept
.start
== 0 ||
187 (key
->accept
.start
<= now
&&
188 (key
->accept
.end
>= now
|| key
->accept
.end
== -1)))
189 if (strncmp (key
->string
, auth_str
, 16) == 0)
196 key_lookup_for_send (const struct keychain
*keychain
)
198 struct listnode
*node
;
204 for (ALL_LIST_ELEMENTS_RO (keychain
->key
, node
, key
))
206 if (key
->send
.start
== 0)
209 if (key
->send
.start
<= now
)
210 if (key
->send
.end
>= now
|| key
->send
.end
== -1)
217 key_get (const struct keychain
*keychain
, u_int32_t index
)
221 key
= key_lookup (keychain
, index
);
228 listnode_add_sort (keychain
->key
, key
);
234 key_delete (struct keychain
*keychain
, struct key
*key
)
236 listnode_delete (keychain
->key
, key
);
239 XFREE(MTYPE_KEY
, key
->string
);
246 "Authentication key management\n"
247 "Key-chain management\n"
250 struct keychain
*keychain
;
252 keychain
= keychain_get (argv
[0]);
253 VTY_PUSH_CONTEXT_COMPAT (KEYCHAIN_NODE
, keychain
);
262 "Authentication key management\n"
263 "Key-chain management\n"
266 struct keychain
*keychain
;
268 keychain
= keychain_lookup (argv
[0]);
272 vty_out (vty
, "Can't find keychain %s%s", argv
[0], VTY_NEWLINE
);
276 keychain_delete (keychain
);
283 "key <0-2147483647>",
285 "Key identifier number\n")
287 VTY_DECLVAR_CONTEXT (keychain
, keychain
);
291 VTY_GET_INTEGER ("key identifier", index
, argv
[0]);
292 key
= key_get (keychain
, index
);
293 VTY_PUSH_CONTEXT_SUB (KEYCHAIN_KEY_NODE
, key
);
300 "no key <0-2147483647>",
303 "Key identifier number\n")
305 VTY_DECLVAR_CONTEXT (keychain
, keychain
);
309 VTY_GET_INTEGER ("key identifier", index
, argv
[0]);
310 key
= key_lookup (keychain
, index
);
313 vty_out (vty
, "Can't find key %d%s", index
, VTY_NEWLINE
);
317 key_delete (keychain
, key
);
319 vty
->node
= KEYCHAIN_NODE
;
330 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
333 XFREE(MTYPE_KEY
, key
->string
);
334 key
->string
= XSTRDUP(MTYPE_KEY
, argv
[0]);
339 DEFUN (no_key_string
,
341 "no key-string [LINE]",
346 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
350 XFREE(MTYPE_KEY
, key
->string
);
357 /* Convert HH:MM:SS MON DAY YEAR to time_t value. -1 is returned when
358 given string is malformed. */
360 key_str2time (const char *time_str
, const char *day_str
, const char *month_str
,
361 const char *year_str
)
367 unsigned int sec
, min
, hour
;
368 unsigned int day
, month
, year
;
370 const char *month_name
[] =
387 #define _GET_LONG_RANGE(V,STR,MMCOND) \
389 unsigned long tmpl; \
390 char *endptr = NULL; \
391 tmpl = strtoul ((STR), &endptr, 10); \
392 if (*endptr != '\0' || tmpl == ULONG_MAX) \
398 #define GET_LONG_RANGE(V,STR,MIN,MAX) \
399 _GET_LONG_RANGE(V,STR,tmpl < (MIN) || tmpl > (MAX))
400 #define GET_LONG_RANGE0(V,STR,MAX) \
401 _GET_LONG_RANGE(V,STR,tmpl > (MAX))
403 /* Check hour field of time_str. */
404 colon
= strchr (time_str
, ':');
409 /* Hour must be between 0 and 23. */
410 GET_LONG_RANGE0 (hour
, time_str
, 23);
412 /* Check min field of time_str. */
413 time_str
= colon
+ 1;
414 colon
= strchr (time_str
, ':');
415 if (*time_str
== '\0' || colon
== NULL
)
419 /* Min must be between 0 and 59. */
420 GET_LONG_RANGE0 (min
, time_str
, 59);
422 /* Check sec field of time_str. */
423 time_str
= colon
+ 1;
424 if (*time_str
== '\0')
427 /* Sec must be between 0 and 59. */
428 GET_LONG_RANGE0 (sec
, time_str
, 59);
430 /* Check day_str. Day must be <1-31>. */
431 GET_LONG_RANGE (day
, day_str
, 1, 31);
433 /* Check month_str. Month must match month_name. */
435 if (strlen (month_str
) >= 3)
436 for (i
= 0; month_name
[i
]; i
++)
437 if (strncmp (month_str
, month_name
[i
], strlen (month_str
)) == 0)
445 /* Check year_str. Year must be <1993-2035>. */
446 GET_LONG_RANGE (year
, year_str
, 1993, 2035);
448 memset (&tm
, 0, sizeof (struct tm
));
454 tm
.tm_year
= year
- 1900;
459 #undef GET_LONG_RANGE
463 key_lifetime_set (struct vty
*vty
, struct key_range
*krange
,
464 const char *stime_str
, const char *sday_str
,
465 const char *smonth_str
, const char *syear_str
,
466 const char *etime_str
, const char *eday_str
,
467 const char *emonth_str
, const char *eyear_str
)
472 time_start
= key_str2time (stime_str
, sday_str
, smonth_str
, syear_str
);
475 vty_out (vty
, "Malformed time value%s", VTY_NEWLINE
);
478 time_end
= key_str2time (etime_str
, eday_str
, emonth_str
, eyear_str
);
482 vty_out (vty
, "Malformed time value%s", VTY_NEWLINE
);
486 if (time_end
<= time_start
)
488 vty_out (vty
, "Expire time is not later than start time%s", VTY_NEWLINE
);
492 krange
->start
= time_start
;
493 krange
->end
= time_end
;
499 key_lifetime_duration_set (struct vty
*vty
, struct key_range
*krange
,
500 const char *stime_str
, const char *sday_str
,
501 const char *smonth_str
, const char *syear_str
,
502 const char *duration_str
)
507 time_start
= key_str2time (stime_str
, sday_str
, smonth_str
, syear_str
);
510 vty_out (vty
, "Malformed time value%s", VTY_NEWLINE
);
513 krange
->start
= time_start
;
515 VTY_GET_INTEGER ("duration", duration
, duration_str
);
516 krange
->duration
= 1;
517 krange
->end
= time_start
+ duration
;
523 key_lifetime_infinite_set (struct vty
*vty
, struct key_range
*krange
,
524 const char *stime_str
, const char *sday_str
,
525 const char *smonth_str
, const char *syear_str
)
529 time_start
= key_str2time (stime_str
, sday_str
, smonth_str
, syear_str
);
532 vty_out (vty
, "Malformed time value%s", VTY_NEWLINE
);
535 krange
->start
= time_start
;
542 DEFUN (accept_lifetime_day_month_day_month
,
543 accept_lifetime_day_month_day_month_cmd
,
544 "accept-lifetime HH:MM:SS <1-31> MONTH <1993-2035> HH:MM:SS <1-31> MONTH <1993-2035>",
545 "Set accept lifetime of the key\n"
547 "Day of th month to start\n"
548 "Month of the year to start\n"
551 "Day of th month to expire\n"
552 "Month of the year to expire\n"
555 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
557 return key_lifetime_set (vty
, &key
->accept
, argv
[0], argv
[1], argv
[2],
558 argv
[3], argv
[4], argv
[5], argv
[6], argv
[7]);
561 DEFUN (accept_lifetime_day_month_month_day
,
562 accept_lifetime_day_month_month_day_cmd
,
563 "accept-lifetime HH:MM:SS <1-31> MONTH <1993-2035> HH:MM:SS MONTH <1-31> <1993-2035>",
564 "Set accept lifetime of the key\n"
566 "Day of th month to start\n"
567 "Month of the year to start\n"
570 "Month of the year to expire\n"
571 "Day of th month to expire\n"
574 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
576 return key_lifetime_set (vty
, &key
->accept
, argv
[0], argv
[1], argv
[2],
577 argv
[3], argv
[4], argv
[6], argv
[5], argv
[7]);
580 DEFUN (accept_lifetime_month_day_day_month
,
581 accept_lifetime_month_day_day_month_cmd
,
582 "accept-lifetime HH:MM:SS MONTH <1-31> <1993-2035> HH:MM:SS <1-31> MONTH <1993-2035>",
583 "Set accept lifetime of the key\n"
585 "Month of the year to start\n"
586 "Day of th month to start\n"
589 "Day of th month to expire\n"
590 "Month of the year to expire\n"
593 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
595 return key_lifetime_set (vty
, &key
->accept
, argv
[0], argv
[2], argv
[1],
596 argv
[3], argv
[4], argv
[5], argv
[6], argv
[7]);
599 DEFUN (accept_lifetime_month_day_month_day
,
600 accept_lifetime_month_day_month_day_cmd
,
601 "accept-lifetime HH:MM:SS MONTH <1-31> <1993-2035> HH:MM:SS MONTH <1-31> <1993-2035>",
602 "Set accept lifetime of the key\n"
604 "Month of the year to start\n"
605 "Day of th month to start\n"
608 "Month of the year to expire\n"
609 "Day of th month to expire\n"
612 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
614 return key_lifetime_set (vty
, &key
->accept
, argv
[0], argv
[2], argv
[1],
615 argv
[3], argv
[4], argv
[6], argv
[5], argv
[7]);
618 DEFUN (accept_lifetime_infinite_day_month
,
619 accept_lifetime_infinite_day_month_cmd
,
620 "accept-lifetime HH:MM:SS <1-31> MONTH <1993-2035> infinite",
621 "Set accept lifetime of the key\n"
623 "Day of th month to start\n"
624 "Month of the year to start\n"
628 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
630 return key_lifetime_infinite_set (vty
, &key
->accept
, argv
[0], argv
[1],
634 DEFUN (accept_lifetime_infinite_month_day
,
635 accept_lifetime_infinite_month_day_cmd
,
636 "accept-lifetime HH:MM:SS MONTH <1-31> <1993-2035> infinite",
637 "Set accept lifetime of the key\n"
639 "Month of the year to start\n"
640 "Day of th month to start\n"
644 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
646 return key_lifetime_infinite_set (vty
, &key
->accept
, argv
[0], argv
[2],
650 DEFUN (accept_lifetime_duration_day_month
,
651 accept_lifetime_duration_day_month_cmd
,
652 "accept-lifetime HH:MM:SS <1-31> MONTH <1993-2035> duration <1-2147483646>",
653 "Set accept lifetime of the key\n"
655 "Day of th month to start\n"
656 "Month of the year to start\n"
658 "Duration of the key\n"
659 "Duration seconds\n")
661 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
663 return key_lifetime_duration_set (vty
, &key
->accept
, argv
[0], argv
[1],
664 argv
[2], argv
[3], argv
[4]);
667 DEFUN (accept_lifetime_duration_month_day
,
668 accept_lifetime_duration_month_day_cmd
,
669 "accept-lifetime HH:MM:SS MONTH <1-31> <1993-2035> duration <1-2147483646>",
670 "Set accept lifetime of the key\n"
672 "Month of the year to start\n"
673 "Day of th month to start\n"
675 "Duration of the key\n"
676 "Duration seconds\n")
678 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
680 return key_lifetime_duration_set (vty
, &key
->accept
, argv
[0], argv
[2],
681 argv
[1], argv
[3], argv
[4]);
684 DEFUN (send_lifetime_day_month_day_month
,
685 send_lifetime_day_month_day_month_cmd
,
686 "send-lifetime HH:MM:SS <1-31> MONTH <1993-2035> HH:MM:SS <1-31> MONTH <1993-2035>",
687 "Set send lifetime of the key\n"
689 "Day of th month to start\n"
690 "Month of the year to start\n"
693 "Day of th month to expire\n"
694 "Month of the year to expire\n"
697 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
699 return key_lifetime_set (vty
, &key
->send
, argv
[0], argv
[1], argv
[2], argv
[3],
700 argv
[4], argv
[5], argv
[6], argv
[7]);
703 DEFUN (send_lifetime_day_month_month_day
,
704 send_lifetime_day_month_month_day_cmd
,
705 "send-lifetime HH:MM:SS <1-31> MONTH <1993-2035> HH:MM:SS MONTH <1-31> <1993-2035>",
706 "Set send lifetime of the key\n"
708 "Day of th month to start\n"
709 "Month of the year to start\n"
712 "Month of the year to expire\n"
713 "Day of th month to expire\n"
716 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
718 return key_lifetime_set (vty
, &key
->send
, argv
[0], argv
[1], argv
[2], argv
[3],
719 argv
[4], argv
[6], argv
[5], argv
[7]);
722 DEFUN (send_lifetime_month_day_day_month
,
723 send_lifetime_month_day_day_month_cmd
,
724 "send-lifetime HH:MM:SS MONTH <1-31> <1993-2035> HH:MM:SS <1-31> MONTH <1993-2035>",
725 "Set send lifetime of the key\n"
727 "Month of the year to start\n"
728 "Day of th month to start\n"
731 "Day of th month to expire\n"
732 "Month of the year to expire\n"
735 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
737 return key_lifetime_set (vty
, &key
->send
, argv
[0], argv
[2], argv
[1], argv
[3],
738 argv
[4], argv
[5], argv
[6], argv
[7]);
741 DEFUN (send_lifetime_month_day_month_day
,
742 send_lifetime_month_day_month_day_cmd
,
743 "send-lifetime HH:MM:SS MONTH <1-31> <1993-2035> HH:MM:SS MONTH <1-31> <1993-2035>",
744 "Set send lifetime of the key\n"
746 "Month of the year to start\n"
747 "Day of th month to start\n"
750 "Month of the year to expire\n"
751 "Day of th month to expire\n"
754 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
756 return key_lifetime_set (vty
, &key
->send
, argv
[0], argv
[2], argv
[1], argv
[3],
757 argv
[4], argv
[6], argv
[5], argv
[7]);
760 DEFUN (send_lifetime_infinite_day_month
,
761 send_lifetime_infinite_day_month_cmd
,
762 "send-lifetime HH:MM:SS <1-31> MONTH <1993-2035> infinite",
763 "Set send lifetime of the key\n"
765 "Day of th month to start\n"
766 "Month of the year to start\n"
770 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
772 return key_lifetime_infinite_set (vty
, &key
->send
, argv
[0], argv
[1], argv
[2],
776 DEFUN (send_lifetime_infinite_month_day
,
777 send_lifetime_infinite_month_day_cmd
,
778 "send-lifetime HH:MM:SS MONTH <1-31> <1993-2035> infinite",
779 "Set send lifetime of the key\n"
781 "Month of the year to start\n"
782 "Day of th month to start\n"
786 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
788 return key_lifetime_infinite_set (vty
, &key
->send
, argv
[0], argv
[2], argv
[1],
792 DEFUN (send_lifetime_duration_day_month
,
793 send_lifetime_duration_day_month_cmd
,
794 "send-lifetime HH:MM:SS <1-31> MONTH <1993-2035> duration <1-2147483646>",
795 "Set send lifetime of the key\n"
797 "Day of th month to start\n"
798 "Month of the year to start\n"
800 "Duration of the key\n"
801 "Duration seconds\n")
803 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
805 return key_lifetime_duration_set (vty
, &key
->send
, argv
[0], argv
[1], argv
[2],
809 DEFUN (send_lifetime_duration_month_day
,
810 send_lifetime_duration_month_day_cmd
,
811 "send-lifetime HH:MM:SS MONTH <1-31> <1993-2035> duration <1-2147483646>",
812 "Set send lifetime of the key\n"
814 "Month of the year to start\n"
815 "Day of th month to start\n"
817 "Duration of the key\n"
818 "Duration seconds\n")
820 VTY_DECLVAR_CONTEXT_SUB (key
, key
);
822 return key_lifetime_duration_set (vty
, &key
->send
, argv
[0], argv
[2], argv
[1],
826 static struct cmd_node keychain_node
=
829 "%s(config-keychain)# ",
833 static struct cmd_node keychain_key_node
=
836 "%s(config-keychain-key)# ",
841 keychain_strftime (char *buf
, int bufsiz
, time_t *time
)
846 tm
= localtime (time
);
848 len
= strftime (buf
, bufsiz
, "%T %b %d %Y", tm
);
854 keychain_config_write (struct vty
*vty
)
856 struct keychain
*keychain
;
858 struct listnode
*node
;
859 struct listnode
*knode
;
862 for (ALL_LIST_ELEMENTS_RO (keychain_list
, node
, keychain
))
864 vty_out (vty
, "key chain %s%s", keychain
->name
, VTY_NEWLINE
);
866 for (ALL_LIST_ELEMENTS_RO (keychain
->key
, knode
, key
))
868 vty_out (vty
, " key %d%s", key
->index
, VTY_NEWLINE
);
871 vty_out (vty
, " key-string %s%s", key
->string
, VTY_NEWLINE
);
873 if (key
->accept
.start
)
875 keychain_strftime (buf
, BUFSIZ
, &key
->accept
.start
);
876 vty_out (vty
, " accept-lifetime %s", buf
);
878 if (key
->accept
.end
== -1)
879 vty_out (vty
, " infinite");
880 else if (key
->accept
.duration
)
881 vty_out (vty
, " duration %ld",
882 (long)(key
->accept
.end
- key
->accept
.start
));
885 keychain_strftime (buf
, BUFSIZ
, &key
->accept
.end
);
886 vty_out (vty
, " %s", buf
);
888 vty_out (vty
, "%s", VTY_NEWLINE
);
893 keychain_strftime (buf
, BUFSIZ
, &key
->send
.start
);
894 vty_out (vty
, " send-lifetime %s", buf
);
896 if (key
->send
.end
== -1)
897 vty_out (vty
, " infinite");
898 else if (key
->send
.duration
)
899 vty_out (vty
, " duration %ld", (long)(key
->send
.end
- key
->send
.start
));
902 keychain_strftime (buf
, BUFSIZ
, &key
->send
.end
);
903 vty_out (vty
, " %s", buf
);
905 vty_out (vty
, "%s", VTY_NEWLINE
);
908 vty_out (vty
, "!%s", VTY_NEWLINE
);
917 keychain_list
= list_new ();
919 install_node (&keychain_node
, keychain_config_write
);
920 install_node (&keychain_key_node
, NULL
);
922 install_default (KEYCHAIN_NODE
);
923 install_default (KEYCHAIN_KEY_NODE
);
925 install_element (CONFIG_NODE
, &key_chain_cmd
);
926 install_element (CONFIG_NODE
, &no_key_chain_cmd
);
927 install_element (KEYCHAIN_NODE
, &key_cmd
);
928 install_element (KEYCHAIN_NODE
, &no_key_cmd
);
930 install_element (KEYCHAIN_NODE
, &key_chain_cmd
);
931 install_element (KEYCHAIN_NODE
, &no_key_chain_cmd
);
933 install_element (KEYCHAIN_KEY_NODE
, &key_string_cmd
);
934 install_element (KEYCHAIN_KEY_NODE
, &no_key_string_cmd
);
936 install_element (KEYCHAIN_KEY_NODE
, &key_chain_cmd
);
937 install_element (KEYCHAIN_KEY_NODE
, &no_key_chain_cmd
);
939 install_element (KEYCHAIN_KEY_NODE
, &key_cmd
);
940 install_element (KEYCHAIN_KEY_NODE
, &no_key_cmd
);
942 install_element (KEYCHAIN_KEY_NODE
, &accept_lifetime_day_month_day_month_cmd
);
943 install_element (KEYCHAIN_KEY_NODE
, &accept_lifetime_day_month_month_day_cmd
);
944 install_element (KEYCHAIN_KEY_NODE
, &accept_lifetime_month_day_day_month_cmd
);
945 install_element (KEYCHAIN_KEY_NODE
, &accept_lifetime_month_day_month_day_cmd
);
946 install_element (KEYCHAIN_KEY_NODE
, &accept_lifetime_infinite_day_month_cmd
);
947 install_element (KEYCHAIN_KEY_NODE
, &accept_lifetime_infinite_month_day_cmd
);
948 install_element (KEYCHAIN_KEY_NODE
, &accept_lifetime_duration_day_month_cmd
);
949 install_element (KEYCHAIN_KEY_NODE
, &accept_lifetime_duration_month_day_cmd
);
951 install_element (KEYCHAIN_KEY_NODE
, &send_lifetime_day_month_day_month_cmd
);
952 install_element (KEYCHAIN_KEY_NODE
, &send_lifetime_day_month_month_day_cmd
);
953 install_element (KEYCHAIN_KEY_NODE
, &send_lifetime_month_day_day_month_cmd
);
954 install_element (KEYCHAIN_KEY_NODE
, &send_lifetime_month_day_month_day_cmd
);
955 install_element (KEYCHAIN_KEY_NODE
, &send_lifetime_infinite_day_month_cmd
);
956 install_element (KEYCHAIN_KEY_NODE
, &send_lifetime_infinite_month_day_cmd
);
957 install_element (KEYCHAIN_KEY_NODE
, &send_lifetime_duration_day_month_cmd
);
958 install_element (KEYCHAIN_KEY_NODE
, &send_lifetime_duration_month_day_cmd
);