]> git.proxmox.com Git - mirror_frr.git/blob - lib/keychain.c
[cleanup] Convert XMALLOC/memset to XCALLOC
[mirror_frr.git] / lib / keychain.c
1 /* key-chain for authentication.
2 Copyright (C) 2000 Kunihiro Ishiguro
3
4 This file is part of GNU Zebra.
5
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.
10
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.
15
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. */
20
21 #include <zebra.h>
22
23 #include "command.h"
24 #include "memory.h"
25 #include "linklist.h"
26 #include "keychain.h"
27
28 /* Master list of key chain. */
29 struct list *keychain_list;
30
31 static struct keychain *
32 keychain_new (void)
33 {
34 return XCALLOC (MTYPE_KEYCHAIN, sizeof (struct keychain));
35 }
36
37 static void
38 keychain_free (struct keychain *keychain)
39 {
40 XFREE (MTYPE_KEYCHAIN, keychain);
41 }
42
43 static struct key *
44 key_new (void)
45 {
46 return XCALLOC (MTYPE_KEY, sizeof (struct key));
47 }
48
49 static void
50 key_free (struct key *key)
51 {
52 XFREE (MTYPE_KEY, key);
53 }
54
55 struct keychain *
56 keychain_lookup (const char *name)
57 {
58 struct listnode *node;
59 struct keychain *keychain;
60
61 if (name == NULL)
62 return NULL;
63
64 for (ALL_LIST_ELEMENTS_RO (keychain_list, node, keychain))
65 {
66 if (strcmp (keychain->name, name) == 0)
67 return keychain;
68 }
69 return NULL;
70 }
71
72 static int
73 key_cmp_func (void *arg1, void *arg2)
74 {
75 const struct key *k1 = arg1;
76 const struct key *k2 = arg2;
77
78 if (k1->index > k2->index)
79 return 1;
80 if (k1->index < k2->index)
81 return -1;
82 return 0;
83 }
84
85 static void
86 key_delete_func (struct key *key)
87 {
88 if (key->string)
89 free (key->string);
90 key_free (key);
91 }
92
93 static struct keychain *
94 keychain_get (const char *name)
95 {
96 struct keychain *keychain;
97
98 keychain = keychain_lookup (name);
99
100 if (keychain)
101 return keychain;
102
103 keychain = keychain_new ();
104 keychain->name = strdup (name);
105 keychain->key = list_new ();
106 keychain->key->cmp = (int (*)(void *, void *)) key_cmp_func;
107 keychain->key->del = (void (*)(void *)) key_delete_func;
108 listnode_add (keychain_list, keychain);
109
110 return keychain;
111 }
112
113 static void
114 keychain_delete (struct keychain *keychain)
115 {
116 if (keychain->name)
117 free (keychain->name);
118
119 list_delete (keychain->key);
120 listnode_delete (keychain_list, keychain);
121 keychain_free (keychain);
122 }
123
124 static struct key *
125 key_lookup (const struct keychain *keychain, u_int32_t index)
126 {
127 struct listnode *node;
128 struct key *key;
129
130 for (ALL_LIST_ELEMENTS_RO (keychain->key, node, key))
131 {
132 if (key->index == index)
133 return key;
134 }
135 return NULL;
136 }
137
138 struct key *
139 key_lookup_for_accept (const struct keychain *keychain, u_int32_t index)
140 {
141 struct listnode *node;
142 struct key *key;
143 time_t now;
144
145 now = time (NULL);
146
147 for (ALL_LIST_ELEMENTS_RO (keychain->key, node, key))
148 {
149 if (key->index >= index)
150 {
151 if (key->accept.start == 0)
152 return key;
153
154 if (key->accept.start <= now)
155 if (key->accept.end >= now || key->accept.end == -1)
156 return key;
157 }
158 }
159 return NULL;
160 }
161
162 struct key *
163 key_match_for_accept (const struct keychain *keychain, const char *auth_str)
164 {
165 struct listnode *node;
166 struct key *key;
167 time_t now;
168
169 now = time (NULL);
170
171 for (ALL_LIST_ELEMENTS_RO (keychain->key, node, key))
172 {
173 if (key->accept.start == 0 ||
174 (key->accept.start <= now &&
175 (key->accept.end >= now || key->accept.end == -1)))
176 if (strncmp (key->string, auth_str, 16) == 0)
177 return key;
178 }
179 return NULL;
180 }
181
182 struct key *
183 key_lookup_for_send (const struct keychain *keychain)
184 {
185 struct listnode *node;
186 struct key *key;
187 time_t now;
188
189 now = time (NULL);
190
191 for (ALL_LIST_ELEMENTS_RO (keychain->key, node, key))
192 {
193 if (key->send.start == 0)
194 return key;
195
196 if (key->send.start <= now)
197 if (key->send.end >= now || key->send.end == -1)
198 return key;
199 }
200 return NULL;
201 }
202
203 static struct key *
204 key_get (const struct keychain *keychain, u_int32_t index)
205 {
206 struct key *key;
207
208 key = key_lookup (keychain, index);
209
210 if (key)
211 return key;
212
213 key = key_new ();
214 key->index = index;
215 listnode_add_sort (keychain->key, key);
216
217 return key;
218 }
219
220 static void
221 key_delete (struct keychain *keychain, struct key *key)
222 {
223 listnode_delete (keychain->key, key);
224
225 if (key->string)
226 free (key->string);
227 key_free (key);
228 }
229 \f
230 DEFUN (key_chain,
231 key_chain_cmd,
232 "key chain WORD",
233 "Authentication key management\n"
234 "Key-chain management\n"
235 "Key-chain name\n")
236 {
237 struct keychain *keychain;
238
239 keychain = keychain_get (argv[0]);
240 vty->index = keychain;
241 vty->node = KEYCHAIN_NODE;
242
243 return CMD_SUCCESS;
244 }
245
246 DEFUN (no_key_chain,
247 no_key_chain_cmd,
248 "no key chain WORD",
249 NO_STR
250 "Authentication key management\n"
251 "Key-chain management\n"
252 "Key-chain name\n")
253 {
254 struct keychain *keychain;
255
256 keychain = keychain_lookup (argv[0]);
257
258 if (! keychain)
259 {
260 vty_out (vty, "Can't find keychain %s%s", argv[0], VTY_NEWLINE);
261 return CMD_WARNING;
262 }
263
264 keychain_delete (keychain);
265
266 return CMD_SUCCESS;
267 }
268
269 DEFUN (key,
270 key_cmd,
271 "key <0-2147483647>",
272 "Configure a key\n"
273 "Key identifier number\n")
274 {
275 struct keychain *keychain;
276 struct key *key;
277 u_int32_t index;
278
279 keychain = vty->index;
280
281 VTY_GET_INTEGER ("key identifier", index, argv[0]);
282 key = key_get (keychain, index);
283 vty->index_sub = key;
284 vty->node = KEYCHAIN_KEY_NODE;
285
286 return CMD_SUCCESS;
287 }
288
289 DEFUN (no_key,
290 no_key_cmd,
291 "no key <0-2147483647>",
292 NO_STR
293 "Delete a key\n"
294 "Key identifier number\n")
295 {
296 struct keychain *keychain;
297 struct key *key;
298 u_int32_t index;
299
300 keychain = vty->index;
301
302 VTY_GET_INTEGER ("key identifier", index, argv[0]);
303 key = key_lookup (keychain, index);
304 if (! key)
305 {
306 vty_out (vty, "Can't find key %d%s", index, VTY_NEWLINE);
307 return CMD_WARNING;
308 }
309
310 key_delete (keychain, key);
311
312 vty->node = KEYCHAIN_NODE;
313
314 return CMD_SUCCESS;
315 }
316
317 DEFUN (key_string,
318 key_string_cmd,
319 "key-string LINE",
320 "Set key string\n"
321 "The key\n")
322 {
323 struct key *key;
324
325 key = vty->index_sub;
326
327 if (key->string)
328 free (key->string);
329 key->string = strdup (argv[0]);
330
331 return CMD_SUCCESS;
332 }
333
334 DEFUN (no_key_string,
335 no_key_string_cmd,
336 "no key-string [LINE]",
337 NO_STR
338 "Unset key string\n"
339 "The key\n")
340 {
341 struct key *key;
342
343 key = vty->index_sub;
344
345 if (key->string)
346 {
347 free (key->string);
348 key->string = NULL;
349 }
350
351 return CMD_SUCCESS;
352 }
353
354 /* Convert HH:MM:SS MON DAY YEAR to time_t value. -1 is returned when
355 given string is malformed. */
356 static time_t
357 key_str2time (const char *time_str, const char *day_str, const char *month_str,
358 const char *year_str)
359 {
360 int i = 0;
361 char *colon;
362 struct tm tm;
363 time_t time;
364 unsigned int sec, min, hour;
365 unsigned int day, month, year;
366
367 const char *month_name[] =
368 {
369 "January",
370 "February",
371 "March",
372 "April",
373 "May",
374 "June",
375 "July",
376 "August",
377 "September",
378 "October",
379 "November",
380 "December",
381 NULL
382 };
383
384 #define GET_LONG_RANGE(V,STR,MIN,MAX) \
385 { \
386 unsigned long tmpl; \
387 char *endptr = NULL; \
388 tmpl = strtoul ((STR), &endptr, 10); \
389 if (*endptr != '\0' || tmpl == ULONG_MAX) \
390 return -1; \
391 if ( tmpl < (MIN) || tmpl > (MAX)) \
392 return -1; \
393 (V) = tmpl; \
394 }
395
396 /* Check hour field of time_str. */
397 colon = strchr (time_str, ':');
398 if (colon == NULL)
399 return -1;
400 *colon = '\0';
401
402 /* Hour must be between 0 and 23. */
403 GET_LONG_RANGE (hour, time_str, 0, 23);
404
405 /* Check min field of time_str. */
406 time_str = colon + 1;
407 colon = strchr (time_str, ':');
408 if (*time_str == '\0' || colon == NULL)
409 return -1;
410 *colon = '\0';
411
412 /* Min must be between 0 and 59. */
413 GET_LONG_RANGE (min, time_str, 0, 59);
414
415 /* Check sec field of time_str. */
416 time_str = colon + 1;
417 if (*time_str == '\0')
418 return -1;
419
420 /* Sec must be between 0 and 59. */
421 GET_LONG_RANGE (sec, time_str, 0, 59);
422
423 /* Check day_str. Day must be <1-31>. */
424 GET_LONG_RANGE (day, day_str, 1, 31);
425
426 /* Check month_str. Month must match month_name. */
427 month = 0;
428 if (strlen (month_str) >= 3)
429 for (i = 0; month_name[i]; i++)
430 if (strncmp (month_str, month_name[i], strlen (month_str)) == 0)
431 {
432 month = i;
433 break;
434 }
435 if (! month_name[i])
436 return -1;
437
438 /* Check year_str. Year must be <1993-2035>. */
439 GET_LONG_RANGE (year, year_str, 1993, 2035);
440
441 memset (&tm, 0, sizeof (struct tm));
442 tm.tm_sec = sec;
443 tm.tm_min = min;
444 tm.tm_hour = hour;
445 tm.tm_mon = month;
446 tm.tm_mday = day;
447 tm.tm_year = year - 1900;
448
449 time = mktime (&tm);
450
451 return time;
452 #undef GET_LONG_RANGE
453 }
454
455 static int
456 key_lifetime_set (struct vty *vty, struct key_range *krange,
457 const char *stime_str, const char *sday_str,
458 const char *smonth_str, const char *syear_str,
459 const char *etime_str, const char *eday_str,
460 const char *emonth_str, const char *eyear_str)
461 {
462 time_t time_start;
463 time_t time_end;
464
465 time_start = key_str2time (stime_str, sday_str, smonth_str, syear_str);
466 if (time_start < 0)
467 {
468 vty_out (vty, "Malformed time value%s", VTY_NEWLINE);
469 return CMD_WARNING;
470 }
471 time_end = key_str2time (etime_str, eday_str, emonth_str, eyear_str);
472
473 if (time_end < 0)
474 {
475 vty_out (vty, "Malformed time value%s", VTY_NEWLINE);
476 return CMD_WARNING;
477 }
478
479 if (time_end <= time_start)
480 {
481 vty_out (vty, "Expire time is not later than start time%s", VTY_NEWLINE);
482 return CMD_WARNING;
483 }
484
485 krange->start = time_start;
486 krange->end = time_end;
487
488 return CMD_SUCCESS;
489 }
490
491 static int
492 key_lifetime_duration_set (struct vty *vty, struct key_range *krange,
493 const char *stime_str, const char *sday_str,
494 const char *smonth_str, const char *syear_str,
495 const char *duration_str)
496 {
497 time_t time_start;
498 u_int32_t duration;
499
500 time_start = key_str2time (stime_str, sday_str, smonth_str, syear_str);
501 if (time_start < 0)
502 {
503 vty_out (vty, "Malformed time value%s", VTY_NEWLINE);
504 return CMD_WARNING;
505 }
506 krange->start = time_start;
507
508 VTY_GET_INTEGER ("duration", duration, duration_str);
509 krange->duration = 1;
510 krange->end = time_start + duration;
511
512 return CMD_SUCCESS;
513 }
514
515 static int
516 key_lifetime_infinite_set (struct vty *vty, struct key_range *krange,
517 const char *stime_str, const char *sday_str,
518 const char *smonth_str, const char *syear_str)
519 {
520 time_t time_start;
521
522 time_start = key_str2time (stime_str, sday_str, smonth_str, syear_str);
523 if (time_start < 0)
524 {
525 vty_out (vty, "Malformed time value%s", VTY_NEWLINE);
526 return CMD_WARNING;
527 }
528 krange->start = time_start;
529
530 krange->end = -1;
531
532 return CMD_SUCCESS;
533 }
534 \f
535 DEFUN (accept_lifetime_day_month_day_month,
536 accept_lifetime_day_month_day_month_cmd,
537 "accept-lifetime HH:MM:SS <1-31> MONTH <1993-2035> HH:MM:SS <1-31> MONTH <1993-2035>",
538 "Set accept lifetime of the key\n"
539 "Time to start\n"
540 "Day of th month to start\n"
541 "Month of the year to start\n"
542 "Year to start\n"
543 "Time to expire\n"
544 "Day of th month to expire\n"
545 "Month of the year to expire\n"
546 "Year to expire\n")
547 {
548 struct key *key;
549
550 key = vty->index_sub;
551
552 return key_lifetime_set (vty, &key->accept, argv[0], argv[1], argv[2],
553 argv[3], argv[4], argv[5], argv[6], argv[7]);
554 }
555
556 DEFUN (accept_lifetime_day_month_month_day,
557 accept_lifetime_day_month_month_day_cmd,
558 "accept-lifetime HH:MM:SS <1-31> MONTH <1993-2035> HH:MM:SS MONTH <1-31> <1993-2035>",
559 "Set accept lifetime of the key\n"
560 "Time to start\n"
561 "Day of th month to start\n"
562 "Month of the year to start\n"
563 "Year to start\n"
564 "Time to expire\n"
565 "Month of the year to expire\n"
566 "Day of th month to expire\n"
567 "Year to expire\n")
568 {
569 struct key *key;
570
571 key = vty->index_sub;
572
573 return key_lifetime_set (vty, &key->accept, argv[0], argv[1], argv[2],
574 argv[3], argv[4], argv[6], argv[5], argv[7]);
575 }
576
577 DEFUN (accept_lifetime_month_day_day_month,
578 accept_lifetime_month_day_day_month_cmd,
579 "accept-lifetime HH:MM:SS MONTH <1-31> <1993-2035> HH:MM:SS <1-31> MONTH <1993-2035>",
580 "Set accept lifetime of the key\n"
581 "Time to start\n"
582 "Month of the year to start\n"
583 "Day of th month to start\n"
584 "Year to start\n"
585 "Time to expire\n"
586 "Day of th month to expire\n"
587 "Month of the year to expire\n"
588 "Year to expire\n")
589 {
590 struct key *key;
591
592 key = vty->index_sub;
593
594 return key_lifetime_set (vty, &key->accept, argv[0], argv[2], argv[1],
595 argv[3], argv[4], argv[5], argv[6], argv[7]);
596 }
597
598 DEFUN (accept_lifetime_month_day_month_day,
599 accept_lifetime_month_day_month_day_cmd,
600 "accept-lifetime HH:MM:SS MONTH <1-31> <1993-2035> HH:MM:SS MONTH <1-31> <1993-2035>",
601 "Set accept lifetime of the key\n"
602 "Time to start\n"
603 "Month of the year to start\n"
604 "Day of th month to start\n"
605 "Year to start\n"
606 "Time to expire\n"
607 "Month of the year to expire\n"
608 "Day of th month to expire\n"
609 "Year to expire\n")
610 {
611 struct key *key;
612
613 key = vty->index_sub;
614
615 return key_lifetime_set (vty, &key->accept, argv[0], argv[2], argv[1],
616 argv[3], argv[4], argv[6], argv[5], argv[7]);
617 }
618
619 DEFUN (accept_lifetime_infinite_day_month,
620 accept_lifetime_infinite_day_month_cmd,
621 "accept-lifetime HH:MM:SS <1-31> MONTH <1993-2035> infinite",
622 "Set accept lifetime of the key\n"
623 "Time to start\n"
624 "Day of th month to start\n"
625 "Month of the year to start\n"
626 "Year to start\n"
627 "Never expires")
628 {
629 struct key *key;
630
631 key = vty->index_sub;
632
633 return key_lifetime_infinite_set (vty, &key->accept, argv[0], argv[1],
634 argv[2], argv[3]);
635 }
636
637 DEFUN (accept_lifetime_infinite_month_day,
638 accept_lifetime_infinite_month_day_cmd,
639 "accept-lifetime HH:MM:SS MONTH <1-31> <1993-2035> infinite",
640 "Set accept lifetime of the key\n"
641 "Time to start\n"
642 "Month of the year to start\n"
643 "Day of th month to start\n"
644 "Year to start\n"
645 "Never expires")
646 {
647 struct key *key;
648
649 key = vty->index_sub;
650
651 return key_lifetime_infinite_set (vty, &key->accept, argv[0], argv[2],
652 argv[1], argv[3]);
653 }
654
655 DEFUN (accept_lifetime_duration_day_month,
656 accept_lifetime_duration_day_month_cmd,
657 "accept-lifetime HH:MM:SS <1-31> MONTH <1993-2035> duration <1-2147483646>",
658 "Set accept lifetime of the key\n"
659 "Time to start\n"
660 "Day of th month to start\n"
661 "Month of the year to start\n"
662 "Year to start\n"
663 "Duration of the key\n"
664 "Duration seconds\n")
665 {
666 struct key *key;
667
668 key = vty->index_sub;
669
670 return key_lifetime_duration_set (vty, &key->accept, argv[0], argv[1],
671 argv[2], argv[3], argv[4]);
672 }
673
674 DEFUN (accept_lifetime_duration_month_day,
675 accept_lifetime_duration_month_day_cmd,
676 "accept-lifetime HH:MM:SS MONTH <1-31> <1993-2035> duration <1-2147483646>",
677 "Set accept lifetime of the key\n"
678 "Time to start\n"
679 "Month of the year to start\n"
680 "Day of th month to start\n"
681 "Year to start\n"
682 "Duration of the key\n"
683 "Duration seconds\n")
684 {
685 struct key *key;
686
687 key = vty->index_sub;
688
689 return key_lifetime_duration_set (vty, &key->accept, argv[0], argv[2],
690 argv[1], argv[3], argv[4]);
691 }
692 \f
693 DEFUN (send_lifetime_day_month_day_month,
694 send_lifetime_day_month_day_month_cmd,
695 "send-lifetime HH:MM:SS <1-31> MONTH <1993-2035> HH:MM:SS <1-31> MONTH <1993-2035>",
696 "Set send lifetime of the key\n"
697 "Time to start\n"
698 "Day of th month to start\n"
699 "Month of the year to start\n"
700 "Year to start\n"
701 "Time to expire\n"
702 "Day of th month to expire\n"
703 "Month of the year to expire\n"
704 "Year to expire\n")
705 {
706 struct key *key;
707
708 key = vty->index_sub;
709
710 return key_lifetime_set (vty, &key->send, argv[0], argv[1], argv[2], argv[3],
711 argv[4], argv[5], argv[6], argv[7]);
712 }
713
714 DEFUN (send_lifetime_day_month_month_day,
715 send_lifetime_day_month_month_day_cmd,
716 "send-lifetime HH:MM:SS <1-31> MONTH <1993-2035> HH:MM:SS MONTH <1-31> <1993-2035>",
717 "Set send lifetime of the key\n"
718 "Time to start\n"
719 "Day of th month to start\n"
720 "Month of the year to start\n"
721 "Year to start\n"
722 "Time to expire\n"
723 "Month of the year to expire\n"
724 "Day of th month to expire\n"
725 "Year to expire\n")
726 {
727 struct key *key;
728
729 key = vty->index_sub;
730
731 return key_lifetime_set (vty, &key->send, argv[0], argv[1], argv[2], argv[3],
732 argv[4], argv[6], argv[5], argv[7]);
733 }
734
735 DEFUN (send_lifetime_month_day_day_month,
736 send_lifetime_month_day_day_month_cmd,
737 "send-lifetime HH:MM:SS MONTH <1-31> <1993-2035> HH:MM:SS <1-31> MONTH <1993-2035>",
738 "Set send lifetime of the key\n"
739 "Time to start\n"
740 "Month of the year to start\n"
741 "Day of th month to start\n"
742 "Year to start\n"
743 "Time to expire\n"
744 "Day of th month to expire\n"
745 "Month of the year to expire\n"
746 "Year to expire\n")
747 {
748 struct key *key;
749
750 key = vty->index_sub;
751
752 return key_lifetime_set (vty, &key->send, argv[0], argv[2], argv[1], argv[3],
753 argv[4], argv[5], argv[6], argv[7]);
754 }
755
756 DEFUN (send_lifetime_month_day_month_day,
757 send_lifetime_month_day_month_day_cmd,
758 "send-lifetime HH:MM:SS MONTH <1-31> <1993-2035> HH:MM:SS MONTH <1-31> <1993-2035>",
759 "Set send lifetime of the key\n"
760 "Time to start\n"
761 "Month of the year to start\n"
762 "Day of th month to start\n"
763 "Year to start\n"
764 "Time to expire\n"
765 "Month of the year to expire\n"
766 "Day of th month to expire\n"
767 "Year to expire\n")
768 {
769 struct key *key;
770
771 key = vty->index_sub;
772
773 return key_lifetime_set (vty, &key->send, argv[0], argv[2], argv[1], argv[3],
774 argv[4], argv[6], argv[5], argv[7]);
775 }
776
777 DEFUN (send_lifetime_infinite_day_month,
778 send_lifetime_infinite_day_month_cmd,
779 "send-lifetime HH:MM:SS <1-31> MONTH <1993-2035> infinite",
780 "Set send lifetime of the key\n"
781 "Time to start\n"
782 "Day of th month to start\n"
783 "Month of the year to start\n"
784 "Year to start\n"
785 "Never expires")
786 {
787 struct key *key;
788
789 key = vty->index_sub;
790
791 return key_lifetime_infinite_set (vty, &key->send, argv[0], argv[1], argv[2],
792 argv[3]);
793 }
794
795 DEFUN (send_lifetime_infinite_month_day,
796 send_lifetime_infinite_month_day_cmd,
797 "send-lifetime HH:MM:SS MONTH <1-31> <1993-2035> infinite",
798 "Set send lifetime of the key\n"
799 "Time to start\n"
800 "Month of the year to start\n"
801 "Day of th month to start\n"
802 "Year to start\n"
803 "Never expires")
804 {
805 struct key *key;
806
807 key = vty->index_sub;
808
809 return key_lifetime_infinite_set (vty, &key->send, argv[0], argv[2], argv[1],
810 argv[3]);
811 }
812
813 DEFUN (send_lifetime_duration_day_month,
814 send_lifetime_duration_day_month_cmd,
815 "send-lifetime HH:MM:SS <1-31> MONTH <1993-2035> duration <1-2147483646>",
816 "Set send lifetime of the key\n"
817 "Time to start\n"
818 "Day of th month to start\n"
819 "Month of the year to start\n"
820 "Year to start\n"
821 "Duration of the key\n"
822 "Duration seconds\n")
823 {
824 struct key *key;
825
826 key = vty->index_sub;
827
828 return key_lifetime_duration_set (vty, &key->send, argv[0], argv[1], argv[2],
829 argv[3], argv[4]);
830 }
831
832 DEFUN (send_lifetime_duration_month_day,
833 send_lifetime_duration_month_day_cmd,
834 "send-lifetime HH:MM:SS MONTH <1-31> <1993-2035> duration <1-2147483646>",
835 "Set send lifetime of the key\n"
836 "Time to start\n"
837 "Month of the year to start\n"
838 "Day of th month to start\n"
839 "Year to start\n"
840 "Duration of the key\n"
841 "Duration seconds\n")
842 {
843 struct key *key;
844
845 key = vty->index_sub;
846
847 return key_lifetime_duration_set (vty, &key->send, argv[0], argv[2], argv[1],
848 argv[3], argv[4]);
849 }
850 \f
851 struct cmd_node keychain_node =
852 {
853 KEYCHAIN_NODE,
854 "%s(config-keychain)# ",
855 1
856 };
857
858 struct cmd_node keychain_key_node =
859 {
860 KEYCHAIN_KEY_NODE,
861 "%s(config-keychain-key)# ",
862 1
863 };
864
865 static int
866 keychain_strftime (char *buf, int bufsiz, time_t *time)
867 {
868 struct tm *tm;
869 size_t len;
870
871 tm = localtime (time);
872
873 len = strftime (buf, bufsiz, "%T %b %d %Y", tm);
874
875 return len;
876 }
877
878 static int
879 keychain_config_write (struct vty *vty)
880 {
881 struct keychain *keychain;
882 struct key *key;
883 struct listnode *node;
884 struct listnode *knode;
885 char buf[BUFSIZ];
886
887 for (ALL_LIST_ELEMENTS_RO (keychain_list, node, keychain))
888 {
889 vty_out (vty, "key chain %s%s", keychain->name, VTY_NEWLINE);
890
891 for (ALL_LIST_ELEMENTS_RO (keychain->key, knode, key))
892 {
893 vty_out (vty, " key %d%s", key->index, VTY_NEWLINE);
894
895 if (key->string)
896 vty_out (vty, " key-string %s%s", key->string, VTY_NEWLINE);
897
898 if (key->accept.start)
899 {
900 keychain_strftime (buf, BUFSIZ, &key->accept.start);
901 vty_out (vty, " accept-lifetime %s", buf);
902
903 if (key->accept.end == -1)
904 vty_out (vty, " infinite");
905 else if (key->accept.duration)
906 vty_out (vty, " duration %ld",
907 (long)(key->accept.end - key->accept.start));
908 else
909 {
910 keychain_strftime (buf, BUFSIZ, &key->accept.end);
911 vty_out (vty, " %s", buf);
912 }
913 vty_out (vty, "%s", VTY_NEWLINE);
914 }
915
916 if (key->send.start)
917 {
918 keychain_strftime (buf, BUFSIZ, &key->send.start);
919 vty_out (vty, " send-lifetime %s", buf);
920
921 if (key->send.end == -1)
922 vty_out (vty, " infinite");
923 else if (key->send.duration)
924 vty_out (vty, " duration %ld", (long)(key->send.end - key->send.start));
925 else
926 {
927 keychain_strftime (buf, BUFSIZ, &key->send.end);
928 vty_out (vty, " %s", buf);
929 }
930 vty_out (vty, "%s", VTY_NEWLINE);
931 }
932 }
933 vty_out (vty, "!%s", VTY_NEWLINE);
934 }
935
936 return 0;
937 }
938
939 void
940 keychain_init ()
941 {
942 keychain_list = list_new ();
943
944 install_node (&keychain_node, keychain_config_write);
945 install_node (&keychain_key_node, NULL);
946
947 install_default (KEYCHAIN_NODE);
948 install_default (KEYCHAIN_KEY_NODE);
949
950 install_element (CONFIG_NODE, &key_chain_cmd);
951 install_element (CONFIG_NODE, &no_key_chain_cmd);
952 install_element (KEYCHAIN_NODE, &key_cmd);
953 install_element (KEYCHAIN_NODE, &no_key_cmd);
954
955 install_element (KEYCHAIN_NODE, &key_chain_cmd);
956 install_element (KEYCHAIN_NODE, &no_key_chain_cmd);
957
958 install_element (KEYCHAIN_KEY_NODE, &key_string_cmd);
959 install_element (KEYCHAIN_KEY_NODE, &no_key_string_cmd);
960
961 install_element (KEYCHAIN_KEY_NODE, &key_chain_cmd);
962 install_element (KEYCHAIN_KEY_NODE, &no_key_chain_cmd);
963
964 install_element (KEYCHAIN_KEY_NODE, &key_cmd);
965 install_element (KEYCHAIN_KEY_NODE, &no_key_cmd);
966
967 install_element (KEYCHAIN_KEY_NODE, &accept_lifetime_day_month_day_month_cmd);
968 install_element (KEYCHAIN_KEY_NODE, &accept_lifetime_day_month_month_day_cmd);
969 install_element (KEYCHAIN_KEY_NODE, &accept_lifetime_month_day_day_month_cmd);
970 install_element (KEYCHAIN_KEY_NODE, &accept_lifetime_month_day_month_day_cmd);
971 install_element (KEYCHAIN_KEY_NODE, &accept_lifetime_infinite_day_month_cmd);
972 install_element (KEYCHAIN_KEY_NODE, &accept_lifetime_infinite_month_day_cmd);
973 install_element (KEYCHAIN_KEY_NODE, &accept_lifetime_duration_day_month_cmd);
974 install_element (KEYCHAIN_KEY_NODE, &accept_lifetime_duration_month_day_cmd);
975
976 install_element (KEYCHAIN_KEY_NODE, &send_lifetime_day_month_day_month_cmd);
977 install_element (KEYCHAIN_KEY_NODE, &send_lifetime_day_month_month_day_cmd);
978 install_element (KEYCHAIN_KEY_NODE, &send_lifetime_month_day_day_month_cmd);
979 install_element (KEYCHAIN_KEY_NODE, &send_lifetime_month_day_month_day_cmd);
980 install_element (KEYCHAIN_KEY_NODE, &send_lifetime_infinite_day_month_cmd);
981 install_element (KEYCHAIN_KEY_NODE, &send_lifetime_infinite_month_day_cmd);
982 install_element (KEYCHAIN_KEY_NODE, &send_lifetime_duration_day_month_cmd);
983 install_element (KEYCHAIN_KEY_NODE, &send_lifetime_duration_month_day_cmd);
984 }