Back to index

glibc  2.9
Defines | Functions
files-key.c File Reference
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <rpc/key_prot.h>
#include "nsswitch.h"

Go to the source code of this file.

Defines

#define DATAFILE   "/etc/publickey"

Functions

int xdecrypt (char *, char *)
static enum nss_status search (const char *netname, char *result, int *errnop, int secret)
enum nss_status _nss_files_getpublickey (const char *netname, char *pkey, int *errnop)
enum nss_status _nss_files_getsecretkey (const char *netname, char *skey, char *passwd, int *errnop)

Define Documentation

#define DATAFILE   "/etc/publickey"

Definition at line 27 of file files-key.c.


Function Documentation

enum nss_status _nss_files_getpublickey ( const char *  netname,
char *  pkey,
int errnop 
)

Definition at line 88 of file files-key.c.

{
  return search (netname, pkey, errnop, 0);
}

Here is the call graph for this function:

enum nss_status _nss_files_getsecretkey ( const char *  netname,
char *  skey,
char *  passwd,
int errnop 
)

Definition at line 94 of file files-key.c.

{
  enum nss_status status;
  char buf[HEXKEYBYTES + KEYCHECKSUMSIZE + 16];

  skey[0] = 0;

  status = search (netname, buf, errnop, 1);
  if (status != NSS_STATUS_SUCCESS)
    return status;

  if (!xdecrypt (buf, passwd))
    return NSS_STATUS_SUCCESS;

  if (memcmp (buf, &(buf[HEXKEYBYTES]), KEYCHECKSUMSIZE) != 0)
    return NSS_STATUS_SUCCESS;

  buf[HEXKEYBYTES] = 0;
  strcpy (skey, buf);

  return NSS_STATUS_SUCCESS;
}

Here is the call graph for this function:

static enum nss_status search ( const char *  netname,
char *  result,
int errnop,
int  secret 
) [static]

Definition at line 34 of file files-key.c.

{
  FILE *stream;

  stream = fopen (DATAFILE, "r");
  if (stream == NULL)
    return errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;

  for (;;)
    {
      char buffer[HEXKEYBYTES * 2 + KEYCHECKSUMSIZE + MAXNETNAMELEN + 17];
      char *p;
      char *save_ptr;

      buffer[sizeof (buffer) - 1] = '\xff';
      p = fgets (buffer, sizeof (buffer), stream);
      if (p == NULL)
       {
         /* End of file or read error.  */
         *errnop = errno;
         fclose (stream);
         return NSS_STATUS_NOTFOUND;
       }
      else if (buffer[sizeof (buffer) - 1] != '\xff')
       {
         /* Invalid line in file?  Skip remainder of line.  */
         if (buffer[sizeof (buffer) - 2] != '\0')
           while (getc (stream) != '\n')
             continue;
         continue;
       }

      /* Parse line.  */
      p = __strtok_r (buffer, "# \t:\n", &save_ptr);
      if (p == NULL) /* Skip empty and comment lines.  */
       continue;
      if (strcmp (p, netname) != 0)
       continue;

      /* A hit!  Find the field we want and return.  */
      p = __strtok_r (NULL, ":\n", &save_ptr);
      if (p == NULL)  /* malformed line? */
       continue;
      if (secret)
       p = __strtok_r (NULL, ":\n", &save_ptr);
      if (p == NULL)  /* malformed line? */
       continue;
      fclose (stream);
      strcpy (result, p);
      return NSS_STATUS_SUCCESS;
    }
}

Here is the call graph for this function:

int xdecrypt ( char *  ,
char *   
)

Definition at line 139 of file xcrypt.c.

{
  char key[8];
  char ivec[8];
  char *buf;
  int err;
  int len;

  len = strlen (secret) / 2;
  buf = malloc ((unsigned) len);

  hex2bin (len, secret, buf);
  passwd2des_internal (passwd, key);
  memset (ivec, 0, 8);

  err = cbc_crypt (key, buf, len, DES_DECRYPT | DES_HW, ivec);
  if (DES_FAILED (err))
    {
      free (buf);
      return 0;
    }
  bin2hex (len, (unsigned char *) buf, secret);
  free (buf);
  return 1;
}

Here is the call graph for this function: