static ipmi_config_err_t
k_g_checkout (ipmi_config_state_data_t *state_data,
	      const char *section_name,
              struct ipmi_config_keyvalue *kv)
{
  uint8_t k_g[IPMI_MAX_K_G_LENGTH];
  char k_g_str[IPMI_MAX_K_G_LENGTH*2+3];
  ipmi_config_err_t ret;

  assert (state_data);
  assert (section_name);
  assert (kv);

  memset (k_g, 0, IPMI_MAX_K_G_LENGTH);

  if ((ret = _get_key (state_data,
                       section_name,
                       IPMI_CHANNEL_SECURITY_KEYS_KEY_ID_K_G,
                       k_g,
                       IPMI_MAX_K_G_LENGTH)) != IPMI_CONFIG_ERR_SUCCESS)
    return (ret);

  /* a printable k_g key can have two representations, so compare the
   * binary keys and return what the user passed in if they are the
   * same.
   */

  if (state_data->prog_data->args->action == IPMI_CONFIG_ACTION_DIFF)
    {
      uint8_t kv_k_g[IPMI_MAX_K_G_LENGTH+1];

      memset (kv_k_g, '\0', IPMI_MAX_K_G_LENGTH);
      if (parse_kg (kv_k_g, IPMI_MAX_K_G_LENGTH + 1, kv->value_input) < 0)
        return (IPMI_CONFIG_ERR_FATAL_ERROR);

      if (!memcmp (kv_k_g, k_g, IPMI_MAX_K_G_LENGTH))
        {
          if (ipmi_config_section_update_keyvalue_output (state_data,
                                                          kv,
                                                          kv->value_input) < 0)
            return (IPMI_CONFIG_ERR_FATAL_ERROR);

          return (IPMI_CONFIG_ERR_SUCCESS);
        }
      /* else, fall through and return the default checked out value */
    }

  memset (k_g_str, '\0', IPMI_MAX_K_G_LENGTH*2+3);
  if (!format_kg (k_g_str, IPMI_MAX_K_G_LENGTH*2+3, k_g))
    return (IPMI_CONFIG_ERR_FATAL_ERROR);

  if (ipmi_config_section_update_keyvalue_output (state_data,
                                                  kv,
                                                  k_g_str) < 0)
    return (IPMI_CONFIG_ERR_FATAL_ERROR);

  return (IPMI_CONFIG_ERR_SUCCESS);
}
static config_err_t
k_g_checkout (const char *section_name,
	      struct config_keyvalue *kv,
              void *arg)
{
  bmc_config_state_data_t *state_data = (bmc_config_state_data_t *)arg;
  uint8_t k_g[IPMI_MAX_K_G_LENGTH];
  char k_g_str[IPMI_MAX_K_G_LENGTH*2+3];
  config_err_t ret;

  memset (k_g, 0, IPMI_MAX_K_G_LENGTH);
  
  if ((ret = _get_key (state_data, 
                       IPMI_CHANNEL_SECURITY_KEYS_KEY_ID_K_G,
                       k_g, 
                       IPMI_MAX_K_G_LENGTH)) != CONFIG_ERR_SUCCESS)
    return ret;

  /* a printable k_g key can have two representations, so compare the
   * binary keys and return what the user passed in if they are the
   * same.
   */

  if (state_data->prog_data->args->config_args.action == CONFIG_ACTION_DIFF)
    {
      uint8_t kv_k_g[IPMI_MAX_K_G_LENGTH+1];

      memset (kv_k_g, '\0', IPMI_MAX_K_G_LENGTH);
      if (parse_kg(kv_k_g, IPMI_MAX_K_G_LENGTH + 1, kv->value_input) < 0)
        return CONFIG_ERR_FATAL_ERROR;

      if (!memcmp (kv_k_g, k_g, IPMI_MAX_K_G_LENGTH)) 
        {
          if (config_section_update_keyvalue_output(state_data->pstate,
                                                    kv, 
                                                    kv->value_input) < 0)
            return CONFIG_ERR_FATAL_ERROR;

          return CONFIG_ERR_SUCCESS;
        }
      /* else, fall through and return the default checked out value */
    }

  memset(k_g_str, '\0', IPMI_MAX_K_G_LENGTH*2+3);
  if (!format_kg(k_g_str, IPMI_MAX_K_G_LENGTH*2+3, (unsigned char *)k_g))
    return CONFIG_ERR_FATAL_ERROR;
  
  if (config_section_update_keyvalue_output(state_data->pstate,
                                            kv, 
                                            (char *)k_g_str) < 0)
    return CONFIG_ERR_FATAL_ERROR;

  return CONFIG_ERR_SUCCESS;
}