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 /* Master list of key chain. */
32 struct list
*keychain_list
;
34 static struct keychain
*
37 return XCALLOC (MTYPE_KEYCHAIN
, sizeof (struct keychain
));
41 keychain_free (struct keychain
*keychain
)
43 XFREE (MTYPE_KEYCHAIN
, keychain
);
49 return XCALLOC (MTYPE_KEY
, sizeof (struct key
));
53 key_free (struct key
*key
)
55 XFREE (MTYPE_KEY
, key
);
59 keychain_lookup (const char *name
)
61 struct listnode
*node
;
62 struct keychain
*keychain
;
67 for (ALL_LIST_ELEMENTS_RO (keychain_list
, node
, keychain
))
69 if (strcmp (keychain
->name
, name
) == 0)
76 key_cmp_func (void *arg1
, void *arg2
)
78 const struct key
*k1
= arg1
;
79 const struct key
*k2
= arg2
;
81 if (k1
->index
> k2
->index
)
83 if (k1
->index
< k2
->index
)
89 key_delete_func (struct key
*key
)
96 static struct keychain
*
97 keychain_get (const char *name
)
99 struct keychain
*keychain
;
101 keychain
= keychain_lookup (name
);
106 keychain
= keychain_new ();
107 keychain
->name
= XSTRDUP(MTYPE_KEYCHAIN
, name
);
108 keychain
->key
= list_new ();
109 keychain
->key
->cmp
= (int (*)(void *, void *)) key_cmp_func
;
110 keychain
->key
->del
= (void (*)(void *)) key_delete_func
;
111 listnode_add (keychain_list
, keychain
);
117 keychain_delete (struct keychain
*keychain
)
120 XFREE(MTYPE_KEYCHAIN
, keychain
->name
);
122 list_delete (keychain
->key
);
123 listnode_delete (keychain_list
, keychain
);
124 keychain_free (keychain
);
128 key_lookup (const struct keychain
*keychain
, u_int32_t index
)
130 struct listnode
*node
;
133 for (ALL_LIST_ELEMENTS_RO (keychain
->key
, node
, key
))
135 if (key
->index
== index
)
142 key_lookup_for_accept (const struct keychain
*keychain
, u_int32_t index
)
144 struct listnode
*node
;
150 for (ALL_LIST_ELEMENTS_RO (keychain
->key
, node
, key
))
152 if (key
->index
>= index
)
154 if (key
->accept
.start
== 0)
157 if (key
->accept
.start
<= now
)
158 if (key
->accept
.end
>= now
|| key
->accept
.end
== -1)
166 key_match_for_accept (const struct keychain
*keychain
, const char *auth_str
)
168 struct listnode
*node
;
174 for (ALL_LIST_ELEMENTS_RO (keychain
->key
, node
, key
))
176 if (key
->accept
.start
== 0 ||
177 (key
->accept
.start
<= now
&&
178 (key
->accept
.end
>= now
|| key
->accept
.end
== -1)))
179 if (strncmp (key
->string
, auth_str
, 16) == 0)
186 key_lookup_for_send (const struct keychain
*keychain
)
188 struct listnode
*node
;
194 for (ALL_LIST_ELEMENTS_RO (keychain
->key
, node
, key
))
196 if (key
->send
.start
== 0)
199 if (key
->send
.start
<= now
)
200 if (key
->send
.end
>= now
|| key
->send
.end
== -1)
207 key_get (const struct keychain
*keychain
, u_int32_t index
)
211 key
= key_lookup (keychain
, index
);
218 listnode_add_sort (keychain
->key
, key
);
224 key_delete (struct keychain
*keychain
, struct key
*key
)
226 listnode_delete (keychain
->key
, key
);
229 XFREE(MTYPE_KEY
, key
->string
);
236 "Authentication key management\n"
237 "Key-chain management\n"
240 struct keychain
*keychain
;
242 keychain
= keychain_get (argv
[0]);
243 vty
->index
= keychain
;
244 vty
->node
= KEYCHAIN_NODE
;
253 "Authentication key management\n"
254 "Key-chain management\n"
257 struct keychain
*keychain
;
259 keychain
= keychain_lookup (argv
[0]);
263 vty_out (vty
, "Can't find keychain %s%s", argv
[0], VTY_NEWLINE
);
267 keychain_delete (keychain
);
274 "key <0-2147483647>",
276 "Key identifier number\n")
278 struct keychain
*keychain
;
282 keychain
= vty
->index
;
284 VTY_GET_INTEGER ("key identifier", index
, argv
[0]);
285 key
= key_get (keychain
, index
);
286 vty
->index_sub
= key
;
287 vty
->node
= KEYCHAIN_KEY_NODE
;
294 "no key <0-2147483647>",
297 "Key identifier number\n")
299 struct keychain
*keychain
;
303 keychain
= vty
->index
;
305 VTY_GET_INTEGER ("key identifier", index
, argv
[0]);
306 key
= key_lookup (keychain
, index
);
309 vty_out (vty
, "Can't find key %d%s", index
, VTY_NEWLINE
);
313 key_delete (keychain
, key
);
315 vty
->node
= KEYCHAIN_NODE
;
328 key
= vty
->index_sub
;
331 XFREE(MTYPE_KEY
, key
->string
);
332 key
->string
= XSTRDUP(MTYPE_KEY
, argv
[0]);
337 DEFUN (no_key_string
,
339 "no key-string [LINE]",
346 key
= vty
->index_sub
;
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"
557 key
= vty
->index_sub
;
559 return key_lifetime_set (vty
, &key
->accept
, argv
[0], argv
[1], argv
[2],
560 argv
[3], argv
[4], argv
[5], argv
[6], argv
[7]);
563 DEFUN (accept_lifetime_day_month_month_day
,
564 accept_lifetime_day_month_month_day_cmd
,
565 "accept-lifetime HH:MM:SS <1-31> MONTH <1993-2035> HH:MM:SS MONTH <1-31> <1993-2035>",
566 "Set accept lifetime of the key\n"
568 "Day of th month to start\n"
569 "Month of the year to start\n"
572 "Month of the year to expire\n"
573 "Day of th month to expire\n"
578 key
= vty
->index_sub
;
580 return key_lifetime_set (vty
, &key
->accept
, argv
[0], argv
[1], argv
[2],
581 argv
[3], argv
[4], argv
[6], argv
[5], argv
[7]);
584 DEFUN (accept_lifetime_month_day_day_month
,
585 accept_lifetime_month_day_day_month_cmd
,
586 "accept-lifetime HH:MM:SS MONTH <1-31> <1993-2035> HH:MM:SS <1-31> MONTH <1993-2035>",
587 "Set accept lifetime of the key\n"
589 "Month of the year to start\n"
590 "Day of th month to start\n"
593 "Day of th month to expire\n"
594 "Month of the year to expire\n"
599 key
= vty
->index_sub
;
601 return key_lifetime_set (vty
, &key
->accept
, argv
[0], argv
[2], argv
[1],
602 argv
[3], argv
[4], argv
[5], argv
[6], argv
[7]);
605 DEFUN (accept_lifetime_month_day_month_day
,
606 accept_lifetime_month_day_month_day_cmd
,
607 "accept-lifetime HH:MM:SS MONTH <1-31> <1993-2035> HH:MM:SS MONTH <1-31> <1993-2035>",
608 "Set accept lifetime of the key\n"
610 "Month of the year to start\n"
611 "Day of th month to start\n"
614 "Month of the year to expire\n"
615 "Day of th month to expire\n"
620 key
= vty
->index_sub
;
622 return key_lifetime_set (vty
, &key
->accept
, argv
[0], argv
[2], argv
[1],
623 argv
[3], argv
[4], argv
[6], argv
[5], argv
[7]);
626 DEFUN (accept_lifetime_infinite_day_month
,
627 accept_lifetime_infinite_day_month_cmd
,
628 "accept-lifetime HH:MM:SS <1-31> MONTH <1993-2035> infinite",
629 "Set accept lifetime of the key\n"
631 "Day of th month to start\n"
632 "Month of the year to start\n"
638 key
= vty
->index_sub
;
640 return key_lifetime_infinite_set (vty
, &key
->accept
, argv
[0], argv
[1],
644 DEFUN (accept_lifetime_infinite_month_day
,
645 accept_lifetime_infinite_month_day_cmd
,
646 "accept-lifetime HH:MM:SS MONTH <1-31> <1993-2035> infinite",
647 "Set accept lifetime of the key\n"
649 "Month of the year to start\n"
650 "Day of th month to start\n"
656 key
= vty
->index_sub
;
658 return key_lifetime_infinite_set (vty
, &key
->accept
, argv
[0], argv
[2],
662 DEFUN (accept_lifetime_duration_day_month
,
663 accept_lifetime_duration_day_month_cmd
,
664 "accept-lifetime HH:MM:SS <1-31> MONTH <1993-2035> duration <1-2147483646>",
665 "Set accept lifetime of the key\n"
667 "Day of th month to start\n"
668 "Month of the year to start\n"
670 "Duration of the key\n"
671 "Duration seconds\n")
675 key
= vty
->index_sub
;
677 return key_lifetime_duration_set (vty
, &key
->accept
, argv
[0], argv
[1],
678 argv
[2], argv
[3], argv
[4]);
681 DEFUN (accept_lifetime_duration_month_day
,
682 accept_lifetime_duration_month_day_cmd
,
683 "accept-lifetime HH:MM:SS MONTH <1-31> <1993-2035> duration <1-2147483646>",
684 "Set accept lifetime of the key\n"
686 "Month of the year to start\n"
687 "Day of th month to start\n"
689 "Duration of the key\n"
690 "Duration seconds\n")
694 key
= vty
->index_sub
;
696 return key_lifetime_duration_set (vty
, &key
->accept
, argv
[0], argv
[2],
697 argv
[1], argv
[3], argv
[4]);
700 DEFUN (send_lifetime_day_month_day_month
,
701 send_lifetime_day_month_day_month_cmd
,
702 "send-lifetime HH:MM:SS <1-31> MONTH <1993-2035> HH:MM:SS <1-31> MONTH <1993-2035>",
703 "Set send lifetime of the key\n"
705 "Day of th month to start\n"
706 "Month of the year to start\n"
709 "Day of th month to expire\n"
710 "Month of the year to expire\n"
715 key
= vty
->index_sub
;
717 return key_lifetime_set (vty
, &key
->send
, argv
[0], argv
[1], argv
[2], argv
[3],
718 argv
[4], argv
[5], argv
[6], argv
[7]);
721 DEFUN (send_lifetime_day_month_month_day
,
722 send_lifetime_day_month_month_day_cmd
,
723 "send-lifetime HH:MM:SS <1-31> MONTH <1993-2035> HH:MM:SS MONTH <1-31> <1993-2035>",
724 "Set send lifetime of the key\n"
726 "Day of th month to start\n"
727 "Month of the year to start\n"
730 "Month of the year to expire\n"
731 "Day of th month to expire\n"
736 key
= vty
->index_sub
;
738 return key_lifetime_set (vty
, &key
->send
, argv
[0], argv
[1], argv
[2], argv
[3],
739 argv
[4], argv
[6], argv
[5], argv
[7]);
742 DEFUN (send_lifetime_month_day_day_month
,
743 send_lifetime_month_day_day_month_cmd
,
744 "send-lifetime HH:MM:SS MONTH <1-31> <1993-2035> HH:MM:SS <1-31> MONTH <1993-2035>",
745 "Set send lifetime of the key\n"
747 "Month of the year to start\n"
748 "Day of th month to start\n"
751 "Day of th month to expire\n"
752 "Month of the year to expire\n"
757 key
= vty
->index_sub
;
759 return key_lifetime_set (vty
, &key
->send
, argv
[0], argv
[2], argv
[1], argv
[3],
760 argv
[4], argv
[5], argv
[6], argv
[7]);
763 DEFUN (send_lifetime_month_day_month_day
,
764 send_lifetime_month_day_month_day_cmd
,
765 "send-lifetime HH:MM:SS MONTH <1-31> <1993-2035> HH:MM:SS MONTH <1-31> <1993-2035>",
766 "Set send lifetime of the key\n"
768 "Month of the year to start\n"
769 "Day of th month to start\n"
772 "Month of the year to expire\n"
773 "Day of th month to expire\n"
778 key
= vty
->index_sub
;
780 return key_lifetime_set (vty
, &key
->send
, argv
[0], argv
[2], argv
[1], argv
[3],
781 argv
[4], argv
[6], argv
[5], argv
[7]);
784 DEFUN (send_lifetime_infinite_day_month
,
785 send_lifetime_infinite_day_month_cmd
,
786 "send-lifetime HH:MM:SS <1-31> MONTH <1993-2035> infinite",
787 "Set send lifetime of the key\n"
789 "Day of th month to start\n"
790 "Month of the year to start\n"
796 key
= vty
->index_sub
;
798 return key_lifetime_infinite_set (vty
, &key
->send
, argv
[0], argv
[1], argv
[2],
802 DEFUN (send_lifetime_infinite_month_day
,
803 send_lifetime_infinite_month_day_cmd
,
804 "send-lifetime HH:MM:SS MONTH <1-31> <1993-2035> infinite",
805 "Set send lifetime of the key\n"
807 "Month of the year to start\n"
808 "Day of th month to start\n"
814 key
= vty
->index_sub
;
816 return key_lifetime_infinite_set (vty
, &key
->send
, argv
[0], argv
[2], argv
[1],
820 DEFUN (send_lifetime_duration_day_month
,
821 send_lifetime_duration_day_month_cmd
,
822 "send-lifetime HH:MM:SS <1-31> MONTH <1993-2035> duration <1-2147483646>",
823 "Set send lifetime of the key\n"
825 "Day of th month to start\n"
826 "Month of the year to start\n"
828 "Duration of the key\n"
829 "Duration seconds\n")
833 key
= vty
->index_sub
;
835 return key_lifetime_duration_set (vty
, &key
->send
, argv
[0], argv
[1], argv
[2],
839 DEFUN (send_lifetime_duration_month_day
,
840 send_lifetime_duration_month_day_cmd
,
841 "send-lifetime HH:MM:SS MONTH <1-31> <1993-2035> duration <1-2147483646>",
842 "Set send lifetime of the key\n"
844 "Month of the year to start\n"
845 "Day of th month to start\n"
847 "Duration of the key\n"
848 "Duration seconds\n")
852 key
= vty
->index_sub
;
854 return key_lifetime_duration_set (vty
, &key
->send
, argv
[0], argv
[2], argv
[1],
858 static struct cmd_node keychain_node
=
861 "%s(config-keychain)# ",
865 static struct cmd_node keychain_key_node
=
868 "%s(config-keychain-key)# ",
873 keychain_strftime (char *buf
, int bufsiz
, time_t *time
)
878 tm
= localtime (time
);
880 len
= strftime (buf
, bufsiz
, "%T %b %d %Y", tm
);
886 keychain_config_write (struct vty
*vty
)
888 struct keychain
*keychain
;
890 struct listnode
*node
;
891 struct listnode
*knode
;
894 for (ALL_LIST_ELEMENTS_RO (keychain_list
, node
, keychain
))
896 vty_out (vty
, "key chain %s%s", keychain
->name
, VTY_NEWLINE
);
898 for (ALL_LIST_ELEMENTS_RO (keychain
->key
, knode
, key
))
900 vty_out (vty
, " key %d%s", key
->index
, VTY_NEWLINE
);
903 vty_out (vty
, " key-string %s%s", key
->string
, VTY_NEWLINE
);
905 if (key
->accept
.start
)
907 keychain_strftime (buf
, BUFSIZ
, &key
->accept
.start
);
908 vty_out (vty
, " accept-lifetime %s", buf
);
910 if (key
->accept
.end
== -1)
911 vty_out (vty
, " infinite");
912 else if (key
->accept
.duration
)
913 vty_out (vty
, " duration %ld",
914 (long)(key
->accept
.end
- key
->accept
.start
));
917 keychain_strftime (buf
, BUFSIZ
, &key
->accept
.end
);
918 vty_out (vty
, " %s", buf
);
920 vty_out (vty
, "%s", VTY_NEWLINE
);
925 keychain_strftime (buf
, BUFSIZ
, &key
->send
.start
);
926 vty_out (vty
, " send-lifetime %s", buf
);
928 if (key
->send
.end
== -1)
929 vty_out (vty
, " infinite");
930 else if (key
->send
.duration
)
931 vty_out (vty
, " duration %ld", (long)(key
->send
.end
- key
->send
.start
));
934 keychain_strftime (buf
, BUFSIZ
, &key
->send
.end
);
935 vty_out (vty
, " %s", buf
);
937 vty_out (vty
, "%s", VTY_NEWLINE
);
940 vty_out (vty
, "!%s", VTY_NEWLINE
);
949 keychain_list
= list_new ();
951 install_node (&keychain_node
, keychain_config_write
);
952 install_node (&keychain_key_node
, NULL
);
954 install_default (KEYCHAIN_NODE
);
955 install_default (KEYCHAIN_KEY_NODE
);
957 install_element (CONFIG_NODE
, &key_chain_cmd
);
958 install_element (CONFIG_NODE
, &no_key_chain_cmd
);
959 install_element (KEYCHAIN_NODE
, &key_cmd
);
960 install_element (KEYCHAIN_NODE
, &no_key_cmd
);
962 install_element (KEYCHAIN_NODE
, &key_chain_cmd
);
963 install_element (KEYCHAIN_NODE
, &no_key_chain_cmd
);
965 install_element (KEYCHAIN_KEY_NODE
, &key_string_cmd
);
966 install_element (KEYCHAIN_KEY_NODE
, &no_key_string_cmd
);
968 install_element (KEYCHAIN_KEY_NODE
, &key_chain_cmd
);
969 install_element (KEYCHAIN_KEY_NODE
, &no_key_chain_cmd
);
971 install_element (KEYCHAIN_KEY_NODE
, &key_cmd
);
972 install_element (KEYCHAIN_KEY_NODE
, &no_key_cmd
);
974 install_element (KEYCHAIN_KEY_NODE
, &accept_lifetime_day_month_day_month_cmd
);
975 install_element (KEYCHAIN_KEY_NODE
, &accept_lifetime_day_month_month_day_cmd
);
976 install_element (KEYCHAIN_KEY_NODE
, &accept_lifetime_month_day_day_month_cmd
);
977 install_element (KEYCHAIN_KEY_NODE
, &accept_lifetime_month_day_month_day_cmd
);
978 install_element (KEYCHAIN_KEY_NODE
, &accept_lifetime_infinite_day_month_cmd
);
979 install_element (KEYCHAIN_KEY_NODE
, &accept_lifetime_infinite_month_day_cmd
);
980 install_element (KEYCHAIN_KEY_NODE
, &accept_lifetime_duration_day_month_cmd
);
981 install_element (KEYCHAIN_KEY_NODE
, &accept_lifetime_duration_month_day_cmd
);
983 install_element (KEYCHAIN_KEY_NODE
, &send_lifetime_day_month_day_month_cmd
);
984 install_element (KEYCHAIN_KEY_NODE
, &send_lifetime_day_month_month_day_cmd
);
985 install_element (KEYCHAIN_KEY_NODE
, &send_lifetime_month_day_day_month_cmd
);
986 install_element (KEYCHAIN_KEY_NODE
, &send_lifetime_month_day_month_day_cmd
);
987 install_element (KEYCHAIN_KEY_NODE
, &send_lifetime_infinite_day_month_cmd
);
988 install_element (KEYCHAIN_KEY_NODE
, &send_lifetime_infinite_month_day_cmd
);
989 install_element (KEYCHAIN_KEY_NODE
, &send_lifetime_duration_day_month_cmd
);
990 install_element (KEYCHAIN_KEY_NODE
, &send_lifetime_duration_month_day_cmd
);