File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / lib / keychain.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:12 2012 UTC (12 years, 4 months ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_22p0, v0_99_22, v0_99_21, v0_99_20_1, v0_99_20, HEAD
quagga

    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>