resurrecting
authorTom Yu <tlyu@mit.edu>
Mon, 21 Sep 1998 22:30:28 +0000 (22:30 +0000)
committerTom Yu <tlyu@mit.edu>
Mon, 21 Sep 1998 22:30:28 +0000 (22:30 +0000)
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@10933 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/crypto/os/.Sanitize [new file with mode: 0644]
src/lib/crypto/os/ChangeLog [new file with mode: 0644]
src/lib/crypto/os/c_localaddr.c [new file with mode: 0644]
src/lib/crypto/os/c_ustime.c [new file with mode: 0644]
src/lib/crypto/os/rnd_confoun.c [new file with mode: 0644]

diff --git a/src/lib/crypto/os/.Sanitize b/src/lib/crypto/os/.Sanitize
new file mode 100644 (file)
index 0000000..2e24ee6
--- /dev/null
@@ -0,0 +1,39 @@
+# Sanitize.in for Kerberos V5
+
+# Each directory to survive it's way into a release will need a file
+# like this one called "./.Sanitize".  All keyword lines must exist,
+# and must exist in the order specified by this file.  Each directory
+# in the tree will be processed, top down, in the following order.
+
+# Hash started lines like this one are comments and will be deleted
+# before anything else is done.  Blank lines will also be squashed
+# out.
+
+# The lines between the "Do-first:" line and the "Things-to-keep:"
+# line are executed as a /bin/sh shell script before anything else is
+# done in this 
+
+Do-first:
+
+# All files listed between the "Things-to-keep:" line and the
+# "Files-to-sed:" line will be kept.  All other files will be removed.
+# Directories listed in this section will have their own Sanitize
+# called.  Directories not listed will be removed in their entirety
+# with rm -rf.
+
+Things-to-keep:
+
+.cvsignore
+ChangeLog
+Makefile.in
+configure
+configure.in
+c_localaddr.c
+c_ustime.c
+rnd_confoun.c
+
+Things-to-lose:
+
+Do-last:
+
+# End of file.
diff --git a/src/lib/crypto/os/ChangeLog b/src/lib/crypto/os/ChangeLog
new file mode 100644 (file)
index 0000000..ebcb593
--- /dev/null
@@ -0,0 +1,204 @@
+Wed Feb 18 16:08:30 1998  Tom Yu  <tlyu@mit.edu>
+
+       * Makefile.in: Remove trailing slash from thisconfigdir.  Fix up
+       BUILDTOP for new conventions.
+
+Fri Feb 13 15:20:54 1998  Theodore Ts'o  <tytso@rsts-11.mit.edu>
+
+       * Makefile.in (thisconfigdir), configure.in: Point the
+               configuration directory at our parent, and remove our
+               local configure.in
+
+Mon Feb  2 17:02:29 1998  Theodore Ts'o  <tytso@rsts-11.mit.edu>
+
+       * Makefile.in: Define BUILDTOP and thisconfigdir in the Makefile
+
+Fri Nov 28 21:23:42 1997  Tom Yu  <tlyu@mit.edu>
+
+       * configure.in: Add AC_PROG_LN_S to deal with symlinking in
+       memmove.c.  This is a kludge, as we really should have a more sane
+       way to deal with missing posix functions.
+
+Thu Sep 25 21:53:11 1997  Tom Yu  <tlyu@mit.edu>
+
+       * c_localaddr.c: Replace KRB5_USE_INET with something more sane.
+
+Tue Aug 12 09:09:14 1997  Ezra Peisach  <epeisach@mit.edu>
+
+       * Makefile.in (SRCS): Add $(srcdir) as needed.
+
+Fri Jul  4 00:13:02 1997  Theodore Y. Ts'o  <tytso@mit.edu>
+
+       * c_localaddr.c (local_addr_fallback_kludge): Added Winsock
+               kludge for finding your local IP address.  May not work
+               for all stacks, so we use it as a fallback.
+       
+Sat Feb 22 18:54:53 1997  Richard Basch  <basch@lehman.com>
+
+       * Makefile.in: Use some of the new library list build rules in
+               win-post.in
+
+Mon Feb 17 17:24:41 1997  Richard Basch  <basch@lehman.com>
+
+       * c_ustime.c: Fixed microsecond adjustment code (win32)
+
+Thu Nov 21 00:58:04 EST 1996    Richard Basch   <basch@lehman.com>
+
+        * Makefile.in: Win32 build
+
+       * c_ustime.c: The Win32 time calculation is different from DOS'
+               so the DOS version shouldn't be trying to use the same
+               part of the ifdef.
+
+       * rnd_confoun.c: Fix function declaration (win32)
+
+Sun Dec 29 21:54:42 1996  Tom Yu  <tlyu@mit.edu>
+
+       * Makefile.in:
+       * configure.in: Update to use new library building procedure.
+
+Wed Jun 12 00:12:52 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>
+
+       * c_ustime.c: Fix WIN32 to be _WIN32
+
+       * c_localaddr.c: Add #ifdef _WIN32 in places where we had #ifdef _MSDOS
+       
+
+Sat Feb 24 00:34:15 1996  Theodore Y. Ts'o  <tytso@dcl>
+
+       * c_ustime.c (krb5_crypto_us_timeofday): Add Windows 95/NT time
+               function.  (Does this time function work under Windows?
+               We'll find out....)
+
+Thu Feb 15 10:57:27 1996  Ezra Peisach  <epeisach@kangaroo.mit.edu>
+
+       * c_localaddr.c: Set magic number in krb5_address.
+
+Fri Oct  6 22:00:48 1995  Theodore Y. Ts'o  <tytso@dcl>
+
+       * Makefile.in: Remove ##DOS!include of config/windows.in.
+               config/windows.in is now included by wconfig.
+
+Mon Sep 25 16:49:15 1995  Theodore Y. Ts'o  <tytso@dcl>
+
+       * Makefile.in: Removed "foo:: foo-$(WHAT)" lines from the
+               Makefile. 
+
+Fri Sep 22 12:00:00 1995  James Mattly  <mattly@fusion.com>
+
+       * c_localaddr.c:  change close on a socket to closesocket, sockets on
+               macintosh arn't files
+
+Wed Sep 13 10:33:53 1995 Keith Vetter (keithv@fusion.com)
+
+       * Makefile.in: PC builds all C files because of function name changes.
+       * c_localtime.c, c_ustime.c: removed INTERFACE keyword.
+
+Wed Sep 13 17:32:36 1995  Theodore Y. Ts'o  <tytso@dcl>
+
+       * c_localaddr.c (krb5_crypto_os_localaddr): Clear the buffer
+               before calling the SIOCGIFCONF ioctl.  This makes purify
+               happy.
+
+Thu Sep  7 12:00:00 1995  James Mattly <mattly@fusion.com>
+       
+       * Renamed ustime.c to c_ustime.c
+       * Renamed localaddr.c to c_localaddr.c because Mac can't have
+         two files with the same name.
+       * Makefile.in, .Sanitize updated for the above change.
+
+Thu Aug 24 18:40:48 1995  Theodore Y. Ts'o  <tytso@dcl>
+
+       * .Sanitize: Update file list
+
+Sat Jul 29 03:17:21 1995  Tom Yu  <tlyu@lothlorien.MIT.EDU>
+
+       * localaddr.c (krb5_crypto_os_localaddr): Don't bash the return
+               from SIOCGIFCONF with the output of a SIOCGIFFLAGS.  Duh.
+
+Wed Jul 19 17:17:54 1995  Tom Yu  <tlyu@lothlorien.MIT.EDU>
+
+       * localaddr.c: also add definition of max if it's not there.
+
+       * localaddr.c: fix definition of ifreq_size so it actually works
+
+Mon Jul 17 16:04:00 1995  Sam Hartman  <hartmans@tertius.mit.edu>
+
+       * localaddr.c (krb5_crypto_os_localaddr): Deal with variable sized
+        ifreq structures if sockaddr contains sa_len field.
+
+       * configure.in: Check to see if struct sockaddr has sa_len.
+
+Thu Jul  6 17:13:11 1995  Tom Yu  <tlyu@lothlorien.MIT.EDU>
+
+       * localaddr.c: migrated from lib/krb5/os
+
+       * ustime.c: migrated from lib/krb5/os; removed context variable
+               from arglist.
+
+       * Makefile.in: don't copy or remove localaddr.c and ustime.c;
+               they're local now.
+
+Fri Jun  9 19:18:41 1995    <tytso@rsx-11.mit.edu>
+
+       * configure.in: Remove standardized set of autoconf macros, which
+               are now handled by CONFIG_RULES.
+
+Thu May 25 22:16:35 1995  Theodore Y. Ts'o  (tytso@dcl)
+
+       * configure.in, Makefile.in: Add support for shared libraries.
+
+Thu Apr 13 15:49:16 1995 Keith Vetter (keithv@fusion.com)
+
+       * *.[ch]: removed unneeded INTERFACE from non-api functions.
+
+Sat Mar 25 15:38:23 1995  Mark Eichin  <eichin@cygnus.com>
+
+       * Makefile.in (memmove.c): memmove.c is in krb5/posix, not krb5/os.
+
+Wed Mar 22 11:44:07 1995    <tytso@rsx-11.mit.edu>
+
+       * Makefile.in: Use $(SRCTOP) instead of $(srcdir), since Mac's
+               don't like dealing with $(U)$(U).
+
+Fri Mar 17 16:21:46 1995  Theodore Y. Ts'o  (tytso@dcl)
+
+       * Makefile.in: Fix rules for localdr.c, ustime.c, and memmove.c so
+               that they reference $(srcdir) where appropriate.
+
+Thu Mar 16 21:24:43 1995  John Gilmore  (gnu at toad.com)
+
+       * Makefile.in (LDFLAGS):  Eliminate, comes in from pre.in.
+       (all-mac):  Add.
+       (localaddr.c, ustime.c, memmove.c):  Fix paths to work on Mac.
+
+Tue Mar 14 17:23:02 1995 Keith Vetter (keithv@fusion.com)
+
+       * Makefile.in: no longer need to bring in ustime and localaddr for
+          windows since everything's going into one DLL in the end.
+
+Thu Mar 2 17:56:48 1995 Keith Vetter (keithv@fusion.com)
+
+       * Makefile.in: changed LIBNAME for the PC, and  brought in ustime
+           and localaddr from the krb/os directory.
+        * rnd_conf.c: added cast to the seed assignment.
+
+Mon Feb 20 16:25:36 1995 Keith Vetter (keithv@fusion.com)
+
+       * Makfile.in: made to work for the PC
+        * rnd_confoun.c: added windows INTERFACE keyword
+
+Wed Jan 25 20:24:35 1995  John Gilmore  (gnu at toad.com)
+
+       * rnd_confoun.c: Replace <.../...> includes with "..."s.
+
+Mon Oct 24 14:58:14 1994    (tytso@rsx-11)
+
+       * configure.in:
+       * rnd_confoun.c (krb5_random_confounder): Use the srand48/lrand48
+               functions if available.
+
+Fri Oct 14 00:21:05 1994  Theodore Y. Ts'o  (tytso@dcl)
+
+       * Makefile.in: Remove symlinked files on make clean.
+
diff --git a/src/lib/crypto/os/c_localaddr.c b/src/lib/crypto/os/c_localaddr.c
new file mode 100644 (file)
index 0000000..3b3bcb4
--- /dev/null
@@ -0,0 +1,348 @@
+/*
+ * lib/crypto/os/c_localaddr.c
+ *
+ * Copyright 1990,1991 by the Massachusetts Institute of Technology.
+ * All Rights Reserved.
+ *
+ * Export of this software from the United States of America may
+ *   require a specific license from the United States Government.
+ *   It is the responsibility of any person or organization contemplating
+ *   export to obtain such a license before exporting.
+ * 
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
+ * distribute this software and its documentation for any purpose and
+ * without fee is hereby granted, provided that the above copyright
+ * notice appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation, and that
+ * the name of M.I.T. not be used in advertising or publicity pertaining
+ * to distribution of the software without specific, written prior
+ * permission.  M.I.T. makes no representations about the suitability of
+ * this software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ * 
+ *
+ * Return the protocol addresses supported by this host.
+ *
+ * XNS support is untested, but "Should just work".
+ */
+
+
+#define NEED_SOCKETS
+#include "k5-int.h"
+
+#if !defined(HAVE_MACSOCK_H) && !defined(_MSDOS) && !defined(_WIN32)
+
+/* needed for solaris, harmless elsewhere... */
+#define BSD_COMP
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <errno.h>
+
+/*
+ * The SIOCGIF* ioctls require a socket.
+ * It doesn't matter *what* kind of socket they use, but it has to be
+ * a socket.
+ *
+ * Of course, you can't just ask the kernel for a socket of arbitrary
+ * type; you have to ask for one with a valid type.
+ *
+ */
+#ifdef HAVE_NETINET_IN_H
+
+#include <netinet/in.h>
+
+#ifndef USE_AF
+#define USE_AF AF_INET
+#define USE_TYPE SOCK_DGRAM
+#define USE_PROTO 0
+#endif
+
+#endif
+
+#ifdef KRB5_USE_NS
+
+#include <netns/ns.h>
+
+#ifndef USE_AF
+#define USE_AF AF_NS
+#define USE_TYPE SOCK_DGRAM
+#define USE_PROTO 0            /* guess */
+#endif
+
+#endif
+/*
+ * Add more address families here.
+ */
+
+/*
+ * BSD 4.4 defines the size of an ifreq to be
+ * max(sizeof(ifreq), sizeof(ifreq.ifr_name)+ifreq.ifr_addr.sa_len
+ * However, under earlier systems, sa_len isn't present, so the size is 
+ * just sizeof(struct ifreq)
+ */
+#ifdef HAVE_SA_LEN
+#ifndef max
+#define max(a,b) ((a) > (b) ? (a) : (b))
+#endif
+#define ifreq_size(i) max(sizeof(struct ifreq),\
+     sizeof((i).ifr_name)+(i).ifr_addr.sa_len)
+#else
+#define ifreq_size(i) sizeof(struct ifreq)
+#endif /* HAVE_SA_LEN*/
+
+
+
+extern int errno;
+
+/*
+ * Return all the protocol addresses of this host.
+ *
+ * We could kludge up something to return all addresses, assuming that
+ * they're valid kerberos protocol addresses, but we wouldn't know the
+ * real size of the sockaddr or know which part of it was actually the
+ * host part.
+ *
+ * This uses the SIOCGIFCONF, SIOCGIFFLAGS, and SIOCGIFADDR ioctl's.
+ */
+
+krb5_error_code
+krb5_crypto_os_localaddr(addr)
+    krb5_address ***addr;
+{
+    struct ifreq *ifr, ifreq;
+    struct ifconf ifc;
+    int s, code, n, i;
+    char buf[1024];
+    krb5_address *addr_temp [ 1024/sizeof(struct ifreq) ];
+    int n_found;
+    int mem_err = 0;
+    
+    memset(buf, 0, sizeof(buf));
+    ifc.ifc_len = sizeof(buf);
+    ifc.ifc_buf = buf;
+    
+    s = socket (USE_AF, USE_TYPE, USE_PROTO);
+    if (s < 0)
+       return errno;
+
+    code = ioctl (s, SIOCGIFCONF, (char *)&ifc);
+    if (code < 0) {
+       int retval = errno;
+       closesocket (s);
+       return retval;
+    }
+    n = ifc.ifc_len;
+    
+n_found = 0;
+    for (i = 0; i < n; i+= ifreq_size(*ifr) ) {
+       krb5_address *address;
+       ifr = (struct ifreq *)((caddr_t) ifc.ifc_buf+i);
+
+       strncpy(ifreq.ifr_name, ifr->ifr_name, sizeof (ifreq.ifr_name));
+       if (ioctl (s, SIOCGIFFLAGS, (char *)&ifreq) < 0)
+           continue;
+
+#ifdef IFF_LOOPBACK
+       if (ifreq.ifr_flags & IFF_LOOPBACK) 
+           continue;
+#endif
+
+       if (!(ifreq.ifr_flags & IFF_UP)) 
+           /* interface is down; skip */
+           continue;
+
+       /* ifr->ifr_addr has what we want! */
+       switch (ifr->ifr_addr.sa_family) {
+#ifdef HAVE_NETINET_IN_H
+       case AF_INET:
+           {
+               struct sockaddr_in *in =
+                   (struct sockaddr_in *)&ifr->ifr_addr;
+               
+               address = (krb5_address *)
+                   malloc (sizeof(krb5_address));
+               if (address) {
+                   address->magic = KV5M_ADDRESS;
+                   address->addrtype = ADDRTYPE_INET;
+                   address->length = sizeof(struct in_addr);
+                   address->contents = (unsigned char *)malloc(address->length);
+                   if (!address->contents) {
+                       krb5_xfree(address);
+                       address = 0;
+                       mem_err++;
+                   } else {
+                       memcpy ((char *)address->contents,
+                               (char *)&in->sin_addr, 
+                               address->length);
+                       break;
+                   }
+               } else mem_err++;
+           }
+#endif
+#ifdef KRB5_USE_NS
+           case AF_XNS:
+           {  
+               struct sockaddr_ns *ns =
+                   (struct sockaddr_ns *)&ifr->ifr_addr;
+               address = (krb5_address *)
+                   malloc (sizeof (krb5_address) + sizeof (struct ns_addr));
+               if (address) {
+                   address->magic = KV5M_ADDRESS;
+                   address->addrtype = ADDRTYPE_XNS; 
+
+                   /* XXX should we perhaps use ns_host instead? */
+
+                   address->length = sizeof(struct ns_addr);
+                   address->contents = (unsigned char *)malloc(address->length);
+                   if (!address->contents) {
+                       krb5_xfree(address);
+                       address = 0;
+                       mem_err++;
+                   } else {
+                       memcpy ((char *)address->contents,
+                               (char *)&ns->sns_addr,
+                               address->length);
+                       break;
+                   }
+               } else mem_err++;
+               break;
+           }
+#endif
+       /*
+        * Add more address families here..
+        */
+       default:
+           continue;
+       }
+       if (address)
+           addr_temp[n_found++] = address;
+       address = 0;
+    }
+    closesocket(s);
+
+    *addr = (krb5_address **)malloc (sizeof (krb5_address *) * (n_found+1));
+    if (*addr == 0)
+       mem_err++;
+    
+    if (mem_err) {
+       for (i=0; i<n_found; i++) {
+           krb5_xfree(addr_temp[i]);
+           addr_temp[i] = 0;
+       }
+       return ENOMEM;
+    }
+    
+    for (i=0; i<n_found; i++) {
+       (*addr)[i] = addr_temp[i];
+    }
+    (*addr)[n_found] = 0;
+    return 0;
+}
+
+#else /* Windows/Mac version */
+
+/*
+ * Hold on to your lunch!  Backup kludge method of obtaining your
+ * local IP address, courtesy of Windows Socket Network Programming,
+ * by Robert Quinn
+ */
+#if defined(_MSDOS) || defined(_WIN32)
+static struct hostent *local_addr_fallback_kludge()
+{
+       static struct hostent   host;
+       static SOCKADDR_IN      addr;
+       static char *           ip_ptrs[2];
+       SOCKET                  sock;
+       int                     size = sizeof(SOCKADDR);
+       int                     err;
+
+       sock = socket(AF_INET, SOCK_DGRAM, 0);
+       if (sock == INVALID_SOCKET)
+               return NULL;
+
+       /* connect to arbitrary port and address (NOT loopback) */
+       addr.sin_family = AF_INET;
+       addr.sin_port = htons(IPPORT_ECHO);
+       addr.sin_addr.s_addr = inet_addr("204.137.220.51");
+
+       err = connect(sock, (LPSOCKADDR) &addr, sizeof(SOCKADDR));
+       if (err == SOCKET_ERROR)
+               return NULL;
+
+       err = getsockname(sock, (LPSOCKADDR) &addr, (int FAR *) size);
+       if (err == SOCKET_ERROR)
+               return NULL;
+
+       closesocket(sock);
+
+       host.h_name = 0;
+       host.h_aliases = 0;
+       host.h_addrtype = AF_INET;
+       host.h_length = 4;
+       host.h_addr_list = ip_ptrs;
+       ip_ptrs[0] = (char *) &addr.sin_addr.s_addr;
+       ip_ptrs[1] = NULL;
+
+       return &host;
+}
+#endif
+
+/* No ioctls in winsock so we just assume there is only one networking 
+ * card per machine, so gethostent is good enough. 
+ */
+krb5_error_code
+krb5_crypto_os_localaddr (krb5_address ***addr) {
+    char host[64];                              /* Name of local machine */
+    struct hostent *hostrec;
+    int err;
+
+    *addr = calloc (2, sizeof (krb5_address *));
+    if (*addr == NULL)
+        return ENOMEM;
+
+#ifdef HAVE_MACSOCK_H
+    hostrec = getmyipaddr();
+#else /* HAVE_MACSOCK_H */
+    err = 0;
+    
+    if (gethostname (host, sizeof(host))) {
+        err = WSAGetLastError();
+    }
+
+    if (!err) {
+           hostrec = gethostbyname (host);
+           if (hostrec == NULL) {
+                   err = WSAGetLastError();
+           }
+    }
+
+    if (err) {
+           hostrec = local_addr_fallback_kludge();
+           if (!hostrec)
+                   return err;
+    }
+#endif /* HAVE_MACSOCK_H */
+
+    (*addr)[0] = calloc (1, sizeof(krb5_address));
+    if ((*addr)[0] == NULL) {
+        free (*addr);
+        return ENOMEM;
+    }
+    (*addr)[0]->magic = KV5M_ADDRESS;
+    (*addr)[0]->addrtype = hostrec->h_addrtype;
+    (*addr)[0]->length = hostrec->h_length;
+    (*addr)[0]->contents = (unsigned char *)malloc((*addr)[0]->length);
+    if (!(*addr)[0]->contents) {
+        free((*addr)[0]);
+        free(*addr);
+        return ENOMEM;
+    } else {
+        memcpy ((*addr)[0]->contents,
+                hostrec->h_addr,
+                (*addr)[0]->length);
+    }
+       /* FIXME, deal with the case where gethostent returns multiple addrs */
+
+    return(0);
+}
+#endif
diff --git a/src/lib/crypto/os/c_ustime.c b/src/lib/crypto/os/c_ustime.c
new file mode 100644 (file)
index 0000000..e790acc
--- /dev/null
@@ -0,0 +1,316 @@
+/*
+ * lib/crypto/os/c_ustime.c
+ *
+ * Copyright 1990,1991 by the Massachusetts Institute of Technology.
+ * All Rights Reserved.
+ *
+ * Export of this software from the United States of America may
+ *   require a specific license from the United States Government.
+ *   It is the responsibility of any person or organization contemplating
+ *   export to obtain such a license before exporting.
+ * 
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
+ * distribute this software and its documentation for any purpose and
+ * without fee is hereby granted, provided that the above copyright
+ * notice appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation, and that
+ * the name of M.I.T. not be used in advertising or publicity pertaining
+ * to distribution of the software without specific, written prior
+ * permission.  M.I.T. makes no representations about the suitability of
+ * this software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ * 
+ *
+ * krb5_mstimeofday for BSD 4.3
+ */
+
+#define        NEED_SOCKETS
+#include "k5-int.h"
+
+#ifdef macintosh
+
+/* We're a Macintosh -- do Mac time things.  */
+
+/*
+ * This code is derived from kerberos/src/lib/des/mac_time.c from
+ * the Cygnus Support release of Kerberos V4:
+ *
+ * mac_time.c
+ * (Originally time_stuff.c)
+ * Copyright 1989 by the Massachusetts Institute of Technology.
+ * Macintosh ooperating system interface for Kerberos.
+ */
+
+#include "AddressXlation.h"    /* for ip_addr, for #if 0'd net-time stuff  */
+
+#include <script.h>            /* Defines MachineLocation, used by getTimeZoneOffset */
+#include <ToolUtils.h>         /* Defines BitTst(), called by getTimeZoneOffset() */
+#include <OSUtils.h>           /* Defines GetDateTime */
+
+/* Mac Cincludes */
+#include <string.h>
+#include <stddef.h>
+
+static krb5_int32 last_sec = 0, last_usec = 0;
+
+/*
+ * The Unix epoch is 1/1/70, the Mac epoch is 1/1/04.
+ *
+ * 70 - 4 = 66 year differential
+ *
+ * Thus the offset is:
+ *
+ * (66 yrs) * (365 days/yr) * (24 hours/day) * (60 mins/hour) * (60 secs/min)
+ * plus
+ * (17 leap days) * (24 hours/day) * (60 mins/hour) * (60 secs/min)
+ *
+ * Don't forget the offset from GMT.
+ */
+
+/* returns the offset in hours between the mac local time and the GMT  */
+/* unsigned krb5_int32 */
+krb5_int32
+getTimeZoneOffset()
+{
+    MachineLocation macLocation;
+    long gmtDelta;
+
+    macLocation.u.gmtDelta=0L;
+    ReadLocation(&macLocation); 
+    gmtDelta=macLocation.u.gmtDelta & 0x00FFFFFF;
+    if (BitTst((void *)&gmtDelta,23L))
+       gmtDelta |= 0xFF000000;
+    gmtDelta /= 3600L;
+    return(gmtDelta);
+}
+
+/* Returns the GMT in seconds (and fake microseconds) using the Unix epoch */
+
+krb5_error_code
+krb5_crypto_us_timeofday(seconds, microseconds)
+    krb5_int32 *seconds, *microseconds;
+{
+    krb5_int32 sec, usec;
+    time_t the_time;
+
+    GetDateTime (&the_time);
+
+    sec = the_time - 
+       ((66 * 365 * 24 * 60 * 60) + (17 *  24 * 60 * 60) + 
+       (getTimeZoneOffset() * 60 * 60));
+
+    usec = 0;  /* Mac is too slow to count faster than once a second */
+
+    if ((sec == last_sec) && (usec == last_usec)) {
+           if (++last_usec >= 1000000) {
+                   last_usec = 0;
+                   last_sec++;
+           }
+           sec = last_sec;
+           usec = last_usec;
+    }
+    else {
+           last_sec = sec;
+           last_usec = usec;
+       }
+
+    *seconds = sec;
+    *microseconds = usec;
+
+    return 0;
+}
+
+
+#elif defined(_WIN32)
+
+   /* Microsoft Windows NT and 95   (32bit)  */
+   /* This one works for WOW (Windows on Windows, ntvdm on Win-NT) */
+
+#include <time.h>
+#include <sys/timeb.h>
+#include <string.h>
+
+krb5_error_code
+krb5_crypto_us_timeofday(seconds, microseconds)
+register krb5_int32 *seconds, *microseconds;
+{
+    struct _timeb timeptr;
+    krb5_int32 sec, usec;
+    static krb5_int32 last_sec = 0;
+    static krb5_int32 last_usec = 0;
+
+    _ftime(&timeptr);                           /* Get the current time */
+    sec  = timeptr.time;
+    usec = timeptr.millitm * 1000;
+
+    if ((sec == last_sec) && (usec <= last_usec)) { /* Same as last time??? */
+        usec = ++last_usec;
+        if (usec >= 1000000) {
+            ++sec;
+            usec = 0;
+        }
+    }
+    last_sec = sec;                             /* Remember for next time */
+    last_usec = usec;
+
+    *seconds = sec;                             /* Return the values */
+    *microseconds = usec;
+
+    return 0;
+}
+
+#elif defined (_MSDOS)
+
+
+/*
+ * Originally written by John Gilmore, Cygnus Support, May '94.
+ * Public Domain.
+ */
+
+#include <time.h>
+#include <sys/timeb.h>
+#include <dos.h>
+#include <string.h>
+
+/*
+ * Time handling.  Translate Unix time calls into Kerberos internal 
+ * procedure calls.
+ *
+ * Due to the fact that DOS time can be unreliable we have reverted
+ * to using the AT hardware clock and converting it to Unix time.
+ */
+
+static time_t win_gettime ();
+static long win_time_get_epoch();               /* Adjust for MSC 7.00 bug */
+
+krb5_error_code
+krb5_crypto_us_timeofday(seconds, microseconds)
+register krb5_int32 *seconds, *microseconds;
+{
+    krb5_int32 sec, usec;
+    static krb5_int32 last_sec = 0;
+    static krb5_int32 last_usec = 0;
+
+    sec = win_gettime ();                       /* Get the current time */
+    usec = 0;                                   /* Can't do microseconds */
+
+    if (sec == last_sec) {                      /* Same as last time??? */
+        usec = ++last_usec;                     /* Yep, so do microseconds */
+        if (usec >= 1000000) {
+            ++sec;
+            usec = 0;
+        }
+    }
+    last_sec = sec;                             /* Remember for next time */
+    last_usec = usec;
+
+    *seconds = sec;                             /* Return the values */
+    *microseconds = usec;
+
+    return 0;
+}
+
+
+static time_t
+win_gettime () {
+    struct tm tm;
+    union _REGS inregs;                         /* For calling BIOS */
+    union _REGS outregs;
+    struct _timeb now;
+    time_t time;
+    long convert;                               /* MSC 7.00 bug work around */
+
+    _ftime(&now);                               /* Daylight savings time */
+
+    /* Get time from AT hardware clock INT 0x1A, AH=2 */
+    memset(&inregs, 0, sizeof(inregs));
+    inregs.h.ah = 2;
+    _int86(0x1a, &inregs, &outregs);
+
+    /* 0x13 = decimal 13, hence the decoding below */
+    tm.tm_sec = 10 * ((outregs.h.dh & 0xF0) >> 4) + (outregs.h.dh & 0x0F);
+    tm.tm_min = 10 * ((outregs.h.cl & 0xF0) >> 4) + (outregs.h.cl & 0x0F);
+    tm.tm_hour = 10 * ((outregs.h.ch & 0xF0) >> 4) + (outregs.h.ch & 0x0F);
+
+    /* Get date from AT hardware clock INT 0x1A, AH=4 */
+    memset(&inregs, 0, sizeof(inregs));
+    inregs.h.ah = 4;
+    _int86(0x1a, &inregs, &outregs);
+
+    tm.tm_mday = 10 * ((outregs.h.dl & 0xF0) >> 4) + (outregs.h.dl & 0x0F);
+    tm.tm_mon = 10 * ((outregs.h.dh & 0xF0) >> 4) + (outregs.h.dh & 0x0F) - 1;
+    tm.tm_year = 10 * ((outregs.h.cl & 0xF0) >> 4) + (outregs.h.cl & 0x0F);
+    tm.tm_year += 100 * ((10 * (outregs.h.ch & 0xF0) >> 4)
+                   + (outregs.h.ch & 0x0F) - 19);
+
+    tm.tm_wday = 0;
+    tm.tm_yday = 0;
+    tm.tm_isdst = now.dstflag;
+
+    time = mktime(&tm);
+
+    convert = win_time_get_epoch();
+    return time + convert;
+
+}
+
+
+/*
+ * This routine figures out the current time epoch and returns the
+ * conversion factor.  It exists because 
+ * Microloss screwed the pooch on the time() and _ftime() calls in
+ * its release 7.0 libraries.  They changed the epoch to Dec 31, 1899!
+ * Idiots...   We try to cope.
+ */
+
+static struct tm jan_1_70 = {0, 0, 0, 1, 0, 70};
+static long epoch = 0;
+static int epoch_set = 0;
+
+long
+win_time_get_epoch()
+{
+
+    if (!epoch_set) {
+        epoch = 0 - mktime (&jan_1_70);        /* Seconds til 1970 localtime */
+        epoch += _timezone;            /* Seconds til 1970 GMT */
+        epoch_set = 1;
+    }
+    return epoch;
+}
+
+
+#else
+
+
+/* We're a Unix machine -- do Unix time things.  */
+
+extern int errno;
+
+static struct timeval last_tv = {0, 0};
+
+krb5_error_code
+krb5_crypto_us_timeofday(seconds, microseconds)
+    register krb5_int32 *seconds, *microseconds;
+{
+    struct timeval tv;
+
+    if (gettimeofday(&tv, (struct timezone *)0) == -1) {
+       /* failed, return errno */
+       return (krb5_error_code) errno;
+    }
+    if ((tv.tv_sec == last_tv.tv_sec) && (tv.tv_usec == last_tv.tv_usec)) {
+           if (++last_tv.tv_usec >= 1000000) {
+                   last_tv.tv_usec = 0;
+                   last_tv.tv_sec++;
+           }
+           tv = last_tv;
+    } else 
+           last_tv = tv;
+           
+    *seconds = tv.tv_sec;
+    *microseconds = tv.tv_usec;
+    return 0;
+}
+
+#endif
diff --git a/src/lib/crypto/os/rnd_confoun.c b/src/lib/crypto/os/rnd_confoun.c
new file mode 100644 (file)
index 0000000..e904cb5
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * lib/crypto/os/rnd_confoun.c
+ *
+ * Copyright 1990 by the Massachusetts Institute of Technology.
+ * All Rights Reserved.
+ *
+ * Export of this software from the United States of America may
+ *   require a specific license from the United States Government.
+ *   It is the responsibility of any person or organization contemplating
+ *   export to obtain such a license before exporting.
+ * 
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
+ * distribute this software and its documentation for any purpose and
+ * without fee is hereby granted, provided that the above copyright
+ * notice appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation, and that
+ * the name of M.I.T. not be used in advertising or publicity pertaining
+ * to distribution of the software without specific, written prior
+ * permission.  M.I.T. makes no representations about the suitability of
+ * this software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ * 
+ *
+ * krb5_random_confounder()
+ */
+
+#include "k5-int.h"
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#ifdef TIME_WITH_SYS_TIME
+#include <time.h>
+#endif
+#else
+#include <time.h>
+#endif
+
+#ifdef HAVE_SRAND48
+#define SRAND  srand48
+#define RAND   lrand48
+#define RAND_TYPE      long
+#endif
+
+#if !defined(RAND_TYPE) && defined(HAVE_SRAND)
+#define SRAND  srand
+#define RAND   rand
+#define RAND_TYPE      int
+#endif
+
+#if !defined(RAND_TYPE) && defined(HAVE_SRANDOM)       
+#define SRAND  srandom
+#define RAND   random
+#define RAND_TYPE      long
+#endif
+
+#if !defined(RAND_TYPE)
+You need a random number generator!
+#endif
+
+/*
+ * Generate a random confounder
+ */
+KRB5_DLLIMP krb5_error_code KRB5_CALLCONV
+krb5_random_confounder(size, fillin)
+size_t size;
+krb5_pointer fillin;
+{
+    static int seeded = 0;
+    register krb5_octet *real_fill;
+    RAND_TYPE  rval;
+
+    if (!seeded) {
+       /* time() defined in 4.12.2.4, but returns a time_t, which is an
+          "arithmetic type" (4.12.1) */
+       rval = (RAND_TYPE) time(0);
+       SRAND(rval);
+#ifdef HAVE_GETPID
+       rval = RAND();
+       rval ^= getpid();
+       SRAND(rval);
+#endif
+       seeded = 1;
+    }
+
+    real_fill = (krb5_octet *)fillin;
+    while (size > 0) {
+       rval = RAND();
+       *real_fill = rval & 0xff;
+       real_fill++;
+       size--;
+       if (size) {
+           *real_fill = (rval >> 8) & 0xff;
+           real_fill++;
+           size--;
+       }
+    }
+    return 0;
+}