(bindresvport): Try harder to find a port. If we tried looking at the
[kopensolaris-gnu/glibc.git] / sunrpc / auth_des.c
index 8ad4882..7fe96ca 100644 (file)
@@ -1,6 +1,3 @@
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)auth_des.c 2.2 88/07/29 4.0 RPCSRC; from 1.9 88/02/08 SMI";
-#endif
 /*
  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  * unrestricted use provided that this legend is included on all tape
@@ -55,27 +52,21 @@ static char sccsid[] = "@(#)auth_des.c      2.2 88/07/29 4.0 RPCSRC; from 1.9 88/02/0
 
 #define debug(msg)             /* printf("%s\n", msg) */
 
-extern int rtime (struct sockaddr_in *, struct timeval *, struct timeval *);
-extern bool_t xdr_authdes_cred (XDR *, struct authdes_cred *);
-extern bool_t xdr_authdes_verf (XDR *, struct authdes_verf *);
+extern bool_t INTUSE(xdr_authdes_cred) (XDR *, struct authdes_cred *);
+extern bool_t INTUSE(xdr_authdes_verf) (XDR *, struct authdes_verf *);
 
 /*
  * DES authenticator operations vector
  */
-AUTH *authdes_create (const char *, u_int, struct sockaddr *,
-                     des_block *);
-AUTH *authdes_pk_create (const char *, netobj *, u_int,
-                        struct sockaddr *, des_block *);
 static void authdes_nextverf (AUTH *);
 static bool_t authdes_marshal (AUTH *, XDR *);
 static bool_t authdes_validate (AUTH *, struct opaque_auth *);
 static bool_t authdes_refresh (AUTH *);
 static void authdes_destroy (AUTH *);
-static bool_t synchronize (struct sockaddr *, struct timeval *)
+static bool_t synchronize (struct sockaddr *, struct rpc_timeval *)
      internal_function;
 
-static struct auth_ops authdes_ops =
-{
+static struct auth_ops authdes_ops = {
   authdes_nextverf,
   authdes_marshal,
   authdes_validate,
@@ -87,23 +78,22 @@ static struct auth_ops authdes_ops =
 /*
  * This struct is pointed to by the ah_private field of an "AUTH *"
  */
-struct ad_private
-  {
-    char *ad_fullname;         /* client's full name */
-    u_int ad_fullnamelen;      /* length of name, rounded up */
-    char *ad_servername;       /* server's full name */
-    u_int ad_servernamelen;    /* length of name, rounded up */
-    u_int ad_window;           /* client specified window */
-    bool_t ad_dosync;          /* synchronize? */
-    struct sockaddr ad_syncaddr;       /* remote host to synch with */
-    struct timeval ad_timediff;        /* server's time - client's time */
-    u_long ad_nickname;                /* server's nickname for client */
-    struct authdes_cred ad_cred;       /* storage for credential */
-    struct authdes_verf ad_verf;       /* storage for verifier */
-    struct timeval ad_timestamp;       /* timestamp sent */
-    des_block ad_xkey;         /* encrypted conversation key */
-    u_char ad_pkey[1024];      /* Servers actual public key */
-  };
+struct ad_private {
+  char *ad_fullname;           /* client's full name */
+  u_int ad_fullnamelen;                /* length of name, rounded up */
+  char *ad_servername;         /* server's full name */
+  u_int ad_servernamelen;      /* length of name, rounded up */
+  uint32_t ad_window;          /* client specified window */
+  bool_t ad_dosync;            /* synchronize? */
+  struct sockaddr ad_syncaddr; /* remote host to synch with */
+  struct rpc_timeval ad_timediff;      /* server's time - client's time */
+  uint32_t ad_nickname;                /* server's nickname for client */
+  struct authdes_cred ad_cred; /* storage for credential */
+  struct authdes_verf ad_verf; /* storage for verifier */
+  struct rpc_timeval ad_timestamp;     /* timestamp sent */
+  des_block ad_xkey;           /* encrypted conversation key */
+  u_char ad_pkey[1024];                /* Servers actual public key */
+};
 
 
 /*
@@ -111,26 +101,26 @@ struct ad_private
  */
 AUTH *
 authdes_create (const char *servername, u_int window,
-               struct sockaddr *syncaddr, des_block * ckey)
+               struct sockaddr *syncaddr, des_block *ckey)
   /* servername - network name of server */
   /* window     - time to live */
   /* syncaddr   - optional addr of host to sync with */
   /* ckey       - optional conversation key to use */
 {
-  u_char pkey_data[1024];
+  char pkey_data[1024];
   netobj pkey;
 
   if (!getpublickey (servername, pkey_data))
-    return (NULL);
+    return NULL;
 
-  pkey.n_bytes = (char *) pkey_data;
-  pkey.n_len = strlen ((char *) pkey_data) + 1;
-  return authdes_pk_create (servername, &pkey, window, syncaddr, ckey);
+  pkey.n_bytes = pkey_data;
+  pkey.n_len = strlen (pkey_data) + 1;
+  return INTUSE(authdes_pk_create) (servername, &pkey, window, syncaddr, ckey);
 }
 
 AUTH *
-authdes_pk_create (const char *servername, netobj * pkey, u_int window,
-                  struct sockaddr * syncaddr, des_block * ckey)
+authdes_pk_create (const char *servername, netobj *pkey, u_int window,
+                  struct sockaddr *syncaddr, des_block *ckey)
 {
   AUTH *auth;
   struct ad_private *ad;
@@ -141,6 +131,14 @@ authdes_pk_create (const char *servername, netobj * pkey, u_int window,
    */
   auth = ALLOC (AUTH);
   ad = ALLOC (struct ad_private);
+
+  if (auth == NULL || ad == NULL)
+    {
+      debug ("authdes_create: out of memory");
+      goto failed;
+    }
+
+  memset (ad, 0, sizeof (struct ad_private));
   memcpy (ad->ad_pkey, pkey->n_bytes, pkey->n_len);
   if (!getnetname (namebuf))
     goto failed;
@@ -150,8 +148,7 @@ authdes_pk_create (const char *servername, netobj * pkey, u_int window,
   ad->ad_servernamelen = strlen (servername);
   ad->ad_servername = mem_alloc (ad->ad_servernamelen + 1);
 
-  if (auth == NULL || ad == NULL || ad->ad_fullname == NULL ||
-      ad->ad_servername == NULL)
+  if (ad->ad_fullname == NULL || ad->ad_servername == NULL)
     {
       debug ("authdes_create: out of memory");
       goto failed;
@@ -160,8 +157,8 @@ authdes_pk_create (const char *servername, netobj * pkey, u_int window,
   /*
    * Set up private data
    */
-  bcopy (namebuf, ad->ad_fullname, ad->ad_fullnamelen + 1);
-  bcopy (servername, ad->ad_servername, ad->ad_servernamelen + 1);
+  memcpy (ad->ad_fullname, namebuf, ad->ad_fullnamelen + 1);
+  memcpy (ad->ad_servername, servername, ad->ad_servernamelen + 1);
   ad->ad_timediff.tv_sec = ad->ad_timediff.tv_usec = 0;
   if (syncaddr != NULL)
     {
@@ -177,7 +174,7 @@ authdes_pk_create (const char *servername, netobj * pkey, u_int window,
       if (key_gendes (&auth->ah_key) < 0)
        {
          debug ("authdes_create: unable to gen conversation key");
-         return (NULL);
+         return NULL;
        }
     }
   else
@@ -194,21 +191,22 @@ authdes_pk_create (const char *servername, netobj * pkey, u_int window,
   if (!authdes_refresh (auth))
     goto failed;
 
-  return (auth);
+  return auth;
 
 failed:
   if (auth != NULL)
     FREE (auth, sizeof (AUTH));
   if (ad != NULL)
     {
-      FREE (ad, sizeof (struct ad_private));
       if (ad->ad_fullname != NULL)
        FREE (ad->ad_fullname, ad->ad_fullnamelen + 1);
       if (ad->ad_servername != NULL)
        FREE (ad->ad_servername, ad->ad_servernamelen + 1);
+      FREE (ad, sizeof (struct ad_private));
     }
-  return (NULL);
+  return NULL;
 }
+INTDEF(authdes_pk_create)
 
 /*
  * Implement the five authentication operations
@@ -220,7 +218,7 @@ failed:
  */
 /*ARGSUSED */
 static void
-authdes_nextverf (AUTH * auth)
+authdes_nextverf (AUTH *auth)
 {
   /* what the heck am I supposed to do??? */
 }
@@ -231,7 +229,7 @@ authdes_nextverf (AUTH * auth)
  * 2. Marshal
  */
 static bool_t
-authdes_marshal (AUTH * auth, XDR * xdrs)
+authdes_marshal (AUTH *auth, XDR *xdrs)
 {
   struct ad_private *ad = AUTH_PRIVATE (auth);
   struct authdes_cred *cred = &ad->ad_cred;
@@ -240,15 +238,16 @@ authdes_marshal (AUTH * auth, XDR * xdrs)
   des_block ivec;
   int status;
   int len;
-  register long *ixdr;
+  register int32_t *ixdr;
+  struct timeval tval;
 
   /*
    * Figure out the "time", accounting for any time difference
    * with the server if necessary.
    */
-  gettimeofday (&ad->ad_timestamp, (struct timezone *) NULL);
-  ad->ad_timestamp.tv_sec += ad->ad_timediff.tv_sec;
-  ad->ad_timestamp.tv_usec += ad->ad_timediff.tv_usec;
+  __gettimeofday (&tval, (struct timezone *) NULL);
+  ad->ad_timestamp.tv_sec = tval.tv_sec + ad->ad_timediff.tv_sec;
+  ad->ad_timestamp.tv_usec = tval.tv_usec + ad->ad_timediff.tv_usec;
   if (ad->ad_timestamp.tv_usec >= MILLION)
     {
       ad->ad_timestamp.tv_usec -= MILLION;
@@ -258,27 +257,27 @@ authdes_marshal (AUTH * auth, XDR * xdrs)
   /*
    * XDR the timestamp and possibly some other things, then
    * encrypt them.
+   * XXX We have a real Year 2038 problem here.
    */
-  ixdr = (long *) cryptbuf;
-  IXDR_PUT_LONG (ixdr, ad->ad_timestamp.tv_sec);
-  IXDR_PUT_LONG (ixdr, ad->ad_timestamp.tv_usec);
+  ixdr = (int32_t *) cryptbuf;
+  IXDR_PUT_INT32 (ixdr, ad->ad_timestamp.tv_sec);
+  IXDR_PUT_INT32 (ixdr, ad->ad_timestamp.tv_usec);
   if (ad->ad_cred.adc_namekind == ADN_FULLNAME)
     {
-      IXDR_PUT_U_LONG (ixdr, ad->ad_window);
-      IXDR_PUT_U_LONG (ixdr, ad->ad_window - 1);
+      IXDR_PUT_U_INT32 (ixdr, ad->ad_window);
+      IXDR_PUT_U_INT32 (ixdr, ad->ad_window - 1);
       ivec.key.high = ivec.key.low = 0;
       status = cbc_crypt ((char *) &auth->ah_key, (char *) cryptbuf,
              2 * sizeof (des_block), DES_ENCRYPT | DES_HW, (char *) &ivec);
     }
   else
-    {
-      status = ecb_crypt ((char *) &auth->ah_key, (char *) cryptbuf,
-                         sizeof (des_block), DES_ENCRYPT | DES_HW);
-    }
+    status = ecb_crypt ((char *) &auth->ah_key, (char *) cryptbuf,
+                       sizeof (des_block), DES_ENCRYPT | DES_HW);
+
   if (DES_FAILED (status))
     {
       debug ("authdes_marshal: DES encryption failure");
-      return (FALSE);
+      return FALSE;
     }
   ad->ad_verf.adv_xtimestamp = cryptbuf[0];
   if (ad->ad_cred.adc_namekind == ADN_FULLNAME)
@@ -297,39 +296,36 @@ authdes_marshal (AUTH * auth, XDR * xdrs)
    * authentication data.
    */
   if (ad->ad_cred.adc_namekind == ADN_FULLNAME)
-    {
-      len = ((1 + 1 + 2 + 1) * BYTES_PER_XDR_UNIT + ad->ad_fullnamelen);
-    }
+    len = ((1 + 1 + 2 + 1) * BYTES_PER_XDR_UNIT + ad->ad_fullnamelen);
   else
-    {
-      len = (1 + 1) * BYTES_PER_XDR_UNIT;
-    }
+    len = (1 + 1) * BYTES_PER_XDR_UNIT;
 
   if ((ixdr = xdr_inline (xdrs, 2 * BYTES_PER_XDR_UNIT)) != NULL)
     {
-      IXDR_PUT_LONG (ixdr, AUTH_DES);
-      IXDR_PUT_LONG (ixdr, len);
+      IXDR_PUT_INT32 (ixdr, AUTH_DES);
+      IXDR_PUT_U_INT32 (ixdr, len);
     }
   else
     {
-      ATTEMPT (xdr_putlong (xdrs, (long *)&auth->ah_cred.oa_flavor));
-      ATTEMPT (xdr_putlong (xdrs, (long *)&len));
+      ATTEMPT (xdr_putint32 (xdrs, &auth->ah_cred.oa_flavor));
+      ATTEMPT (xdr_putint32 (xdrs, &len));
     }
-  ATTEMPT (xdr_authdes_cred (xdrs, cred));
+  ATTEMPT (INTUSE(xdr_authdes_cred) (xdrs, cred));
 
   len = (2 + 1) * BYTES_PER_XDR_UNIT;
   if ((ixdr = xdr_inline (xdrs, 2 * BYTES_PER_XDR_UNIT)) != NULL)
     {
-      IXDR_PUT_LONG (ixdr, AUTH_DES);
-      IXDR_PUT_LONG (ixdr, len);
+      IXDR_PUT_INT32 (ixdr, AUTH_DES);
+      IXDR_PUT_U_INT32 (ixdr, len);
     }
   else
     {
-      ATTEMPT (xdr_putlong (xdrs, (long *)&auth->ah_verf.oa_flavor));
-      ATTEMPT (xdr_putlong (xdrs, (long *)&len));
+      ATTEMPT (xdr_putint32 (xdrs, &auth->ah_verf.oa_flavor));
+      ATTEMPT (xdr_putint32 (xdrs, &len));
     }
-  ATTEMPT (xdr_authdes_verf (xdrs, verf));
-  return (TRUE);
+  ATTEMPT (INTUSE(xdr_authdes_verf) (xdrs, verf));
+
+  return TRUE;
 }
 
 
@@ -337,20 +333,20 @@ authdes_marshal (AUTH * auth, XDR * xdrs)
  * 3. Validate
  */
 static bool_t
-authdes_validate (AUTH * auth, struct opaque_auth *rverf)
+authdes_validate (AUTH *auth, struct opaque_auth *rverf)
 {
   struct ad_private *ad = AUTH_PRIVATE (auth);
   struct authdes_verf verf;
   int status;
-  register u_long *ixdr;
+  register uint32_t *ixdr;
 
   if (rverf->oa_length != (2 + 1) * BYTES_PER_XDR_UNIT)
-    return (FALSE);
+    return FALSE;
 
-  ixdr = (u_long *) rverf->oa_base;
-  verf.adv_xtimestamp.key.high = (u_long) * ixdr++;
-  verf.adv_xtimestamp.key.low = (u_long) * ixdr++;
-  verf.adv_int_u = (u_long) * ixdr++;  /* nickname not XDR'd ! */
+  ixdr = (uint32_t *) rverf->oa_base;
+  verf.adv_xtimestamp.key.high = *ixdr++;
+  verf.adv_xtimestamp.key.low = *ixdr++;
+  verf.adv_int_u = *ixdr++;    /* nickname not XDR'd ! */
 
   /*
    * Decrypt the timestamp
@@ -361,24 +357,24 @@ authdes_validate (AUTH * auth, struct opaque_auth *rverf)
   if (DES_FAILED (status))
     {
       debug ("authdes_validate: DES decryption failure");
-      return (FALSE);
+      return FALSE;
     }
 
   /*
    * xdr the decrypted timestamp
    */
-  ixdr = (u_long *) verf.adv_xtimestamp.c;
-  verf.adv_timestamp.tv_sec = IXDR_GET_LONG (ixdr) + 1;
-  verf.adv_timestamp.tv_usec = IXDR_GET_LONG (ixdr);
+  ixdr = (uint32_t *) verf.adv_xtimestamp.c;
+  verf.adv_timestamp.tv_sec = IXDR_GET_U_INT32 (ixdr) + 1;
+  verf.adv_timestamp.tv_usec = IXDR_GET_U_INT32 (ixdr);
 
   /*
    * validate
    */
-  if (bcmp ((char *) &ad->ad_timestamp, (char *) &verf.adv_timestamp,
-           sizeof (struct timeval)) != 0)
+  if (memcmp ((char *) &ad->ad_timestamp, (char *) &verf.adv_timestamp,
+             sizeof (struct rpc_timeval)) != 0)
     {
       debug ("authdes_validate: verifier mismatch\n");
-      return (FALSE);
+      return FALSE;
     }
 
   /*
@@ -386,21 +382,20 @@ authdes_validate (AUTH * auth, struct opaque_auth *rverf)
    */
   ad->ad_nickname = verf.adv_nickname;
   ad->ad_cred.adc_namekind = ADN_NICKNAME;
-  return (TRUE);
+  return TRUE;
 }
 
 /*
  * 4. Refresh
  */
 static bool_t
-authdes_refresh (AUTH * auth)
+authdes_refresh (AUTH *auth)
 {
   netobj pkey;
   struct ad_private *ad = AUTH_PRIVATE (auth);
   struct authdes_cred *cred = &ad->ad_cred;
 
-  if (ad->ad_dosync &&
-      !synchronize (&ad->ad_syncaddr, &ad->ad_timediff))
+  if (ad->ad_dosync && !synchronize (&ad->ad_syncaddr, &ad->ad_timediff))
     {
       /*
        * Hope the clocks are synced!
@@ -414,19 +409,19 @@ authdes_refresh (AUTH * auth)
   if (key_encryptsession_pk (ad->ad_servername, &pkey, &ad->ad_xkey) < 0)
     {
       debug ("authdes_create: unable to encrypt conversation key");
-      return (FALSE);
+      return FALSE;
     }
   cred->adc_fullname.key = ad->ad_xkey;
   cred->adc_namekind = ADN_FULLNAME;
   cred->adc_fullname.name = ad->ad_fullname;
-  return (TRUE);
+  return TRUE;
 }
 
 /*
  * 5. Destroy
  */
 static void
-authdes_destroy (AUTH * auth)
+authdes_destroy (AUTH *auth)
 {
   struct ad_private *ad = AUTH_PRIVATE (auth);
 
@@ -442,17 +437,17 @@ authdes_destroy (AUTH * auth)
  */
 static bool_t
 internal_function
-synchronize (struct sockaddr *syncaddr, struct timeval *timep)
+synchronize (struct sockaddr *syncaddr, struct rpc_timeval *timep)
 {
   struct timeval mytime;
-  struct timeval timeout;
+  struct rpc_timeval timeout;
 
   timeout.tv_sec = RTIME_TIMEOUT;
   timeout.tv_usec = 0;
   if (rtime ((struct sockaddr_in *) syncaddr, timep, &timeout) < 0)
-    return (FALSE);
+    return FALSE;
 
-  gettimeofday (&mytime, (struct timezone *) NULL);
+  __gettimeofday (&mytime, (struct timezone *) NULL);
   timep->tv_sec -= mytime.tv_sec;
   if (mytime.tv_usec > timep->tv_usec)
     {
@@ -460,5 +455,5 @@ synchronize (struct sockaddr *syncaddr, struct timeval *timep)
       timep->tv_usec += MILLION;
     }
   timep->tv_usec -= mytime.tv_usec;
-  return (TRUE);
+  return TRUE;
 }