keychain.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:24k
源码类别:

网络

开发平台:

Unix_Linux

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