Annotation of embedaddon/quagga/lib/keychain.c, revision 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>