Annotation of embedaddon/quagga/lib/keychain.c, revision 1.1.1.1
1.1 misho 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:
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:
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:
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:
851: static struct cmd_node keychain_node =
852: {
853: KEYCHAIN_NODE,
854: "%s(config-keychain)# ",
855: 1
856: };
857:
858: static 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: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>