]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/ntp/ntpd/ntp_crypto.c
This commit was generated by cvs2svn to compensate for changes in r175801,
[FreeBSD/FreeBSD.git] / contrib / ntp / ntpd / ntp_crypto.c
1 /*
2  * ntp_crypto.c - NTP version 4 public key routines
3  */
4 #ifdef HAVE_CONFIG_H
5 #include <config.h>
6 #endif
7
8 #ifdef OPENSSL
9 #include <stdio.h>
10 #include <sys/types.h>
11 #include <sys/param.h>
12 #include <unistd.h>
13 #include <fcntl.h>
14
15 #include "ntpd.h"
16 #include "ntp_stdlib.h"
17 #include "ntp_unixtime.h"
18 #include "ntp_string.h"
19
20 #include "openssl/asn1_mac.h"
21 #include "openssl/bn.h"
22 #include "openssl/err.h"
23 #include "openssl/evp.h"
24 #include "openssl/pem.h"
25 #include "openssl/rand.h"
26 #include "openssl/x509v3.h"
27
28 #ifdef KERNEL_PLL
29 #include "ntp_syscall.h"
30 #endif /* KERNEL_PLL */
31
32 /*
33  * Extension field message format
34  *
35  * These are always signed and saved before sending in network byte
36  * order. They must be converted to and from host byte order for
37  * processing.
38  *
39  * +-------+-------+
40  * |   op  |  len  | <- extension pointer
41  * +-------+-------+
42  * |    assocID    |
43  * +---------------+
44  * |   timestamp   | <- value pointer
45  * +---------------+
46  * |   filestamp   |
47  * +---------------+
48  * |   value len   |
49  * +---------------+
50  * |               |
51  * =     value     =
52  * |               |
53  * +---------------+
54  * | signature len |
55  * +---------------+
56  * |               |
57  * =   signature   =
58  * |               |
59  * +---------------+
60  *
61  * The CRYPTO_RESP bit is set to 0 for requests, 1 for responses.
62  * Requests carry the association ID of the receiver; responses carry
63  * the association ID of the sender. Some messages include only the
64  * operation/length and association ID words and so have length 8
65  * octets. Ohers include the value structure and associated value and
66  * signature fields. These messages include the timestamp, filestamp,
67  * value and signature words and so have length at least 24 octets. The
68  * signature and/or value fields can be empty, in which case the
69  * respective length words are zero. An empty value with nonempty
70  * signature is syntactically valid, but semantically questionable.
71  *
72  * The filestamp represents the time when a cryptographic data file such
73  * as a public/private key pair is created. It follows every reference
74  * depending on that file and serves as a means to obsolete earlier data
75  * of the same type. The timestamp represents the time when the
76  * cryptographic data of the message were last signed. Creation of a
77  * cryptographic data file or signing a message can occur only when the
78  * creator or signor is synchronized to an authoritative source and
79  * proventicated to a trusted authority.
80  *
81  * Note there are four conditions required for server trust. First, the
82  * public key on the certificate must be verified, which involves a
83  * number of format, content and consistency checks. Next, the server
84  * identity must be confirmed by one of four schemes: private
85  * certificate, IFF scheme, GQ scheme or certificate trail hike to a
86  * self signed trusted certificate. Finally, the server signature must
87  * be verified.
88  */
89 /*
90  * Cryptodefines
91  */
92 #define TAI_1972        10      /* initial TAI offset (s) */
93 #define MAX_LEAP        100     /* max UTC leapseconds (s) */
94 #define VALUE_LEN       (6 * 4) /* min response field length */
95 #define YEAR            (60 * 60 * 24 * 365) /* seconds in year */
96
97 /*
98  * Global cryptodata in host byte order
99  */
100 u_int32 crypto_flags = 0x0;     /* status word */
101 u_int   sys_tai;                /* current UTC offset from TAI */
102
103 /*
104  * Global cryptodata in network byte order
105  */
106 struct cert_info *cinfo = NULL; /* certificate info/value */
107 struct value hostval;           /* host value */
108 struct value pubkey;            /* public key */
109 struct value tai_leap;          /* leapseconds table */
110
111 /*
112  * Private cryptodata in host byte order
113  */
114 static char *passwd = NULL;     /* private key password */
115 static EVP_PKEY *host_pkey = NULL; /* host key */
116 static EVP_PKEY *sign_pkey = NULL; /* sign key */
117 static EVP_PKEY *iffpar_pkey = NULL; /* IFF parameters */
118 static EVP_PKEY *gqpar_pkey = NULL; /* GQ parameters */
119 static EVP_PKEY *mvpar_pkey = NULL; /* MV parameters */
120 static const EVP_MD *sign_digest = NULL; /* sign digest */
121 static u_int sign_siglen;       /* sign key length */
122 static char *rand_file = NULL;  /* random seed file */
123 static char *host_file = NULL;  /* host key file */
124 static char *sign_file = NULL;  /* sign key file */
125 static char *iffpar_file = NULL; /* IFF parameters file */
126 static char *gqpar_file = NULL; /* GQ parameters file */
127 static char *mvpar_file = NULL; /* MV parameters file */
128 static char *cert_file = NULL;  /* certificate file */
129 static char *leap_file = NULL;  /* leapseconds file */
130 static tstamp_t if_fstamp = 0;  /* IFF file stamp */
131 static tstamp_t gq_fstamp = 0;  /* GQ file stamp */
132 static tstamp_t mv_fstamp = 0;  /* MV file stamp */
133
134 /*
135  * Cryptotypes
136  */
137 static  int     crypto_verify   P((struct exten *, struct value *,
138                                     struct peer *));
139 static  int     crypto_encrypt  P((struct exten *, struct value *,
140                                     keyid_t *));
141 static  int     crypto_alice    P((struct peer *, struct value *));
142 static  int     crypto_alice2   P((struct peer *, struct value *));
143 static  int     crypto_alice3   P((struct peer *, struct value *));
144 static  int     crypto_bob      P((struct exten *, struct value *));
145 static  int     crypto_bob2     P((struct exten *, struct value *));
146 static  int     crypto_bob3     P((struct exten *, struct value *));
147 static  int     crypto_iff      P((struct exten *, struct peer *));
148 static  int     crypto_gq       P((struct exten *, struct peer *));
149 static  int     crypto_mv       P((struct exten *, struct peer *));
150 static  u_int   crypto_send     P((struct exten *, struct value *));
151 static  tstamp_t crypto_time    P((void));
152 static  u_long  asn2ntp         P((ASN1_TIME *));
153 static  struct cert_info *cert_parse P((u_char *, u_int, tstamp_t));
154 static  int     cert_sign       P((struct exten *, struct value *));
155 static  int     cert_valid      P((struct cert_info *, EVP_PKEY *));
156 static  int     cert_install    P((struct exten *, struct peer *));
157 static  void    cert_free       P((struct cert_info *));
158 static  EVP_PKEY *crypto_key    P((char *, tstamp_t *));
159 static  int     bighash         P((BIGNUM *, BIGNUM *));
160 static  struct cert_info *crypto_cert P((char *));
161 static  void    crypto_tai      P((char *));
162
163 #ifdef SYS_WINNT
164 int
165 readlink(char * link, char * file, int len) {
166         return (-1);
167 }
168 #endif
169
170 /*
171  * session_key - generate session key
172  *
173  * This routine generates a session key from the source address,
174  * destination address, key ID and private value. The value of the
175  * session key is the MD5 hash of these values, while the next key ID is
176  * the first four octets of the hash.
177  *
178  * Returns the next key ID
179  */
180 keyid_t
181 session_key(
182         struct sockaddr_storage *srcadr, /* source address */
183         struct sockaddr_storage *dstadr, /* destination address */
184         keyid_t keyno,          /* key ID */
185         keyid_t private,        /* private value */
186         u_long  lifetime        /* key lifetime */
187         )
188 {
189         EVP_MD_CTX ctx;         /* message digest context */
190         u_char dgst[EVP_MAX_MD_SIZE]; /* message digest */
191         keyid_t keyid;          /* key identifer */
192         u_int32 header[10];     /* data in network byte order */
193         u_int   hdlen, len;
194
195         /*
196          * Generate the session key and key ID. If the lifetime is
197          * greater than zero, install the key and call it trusted.
198          */
199         hdlen = 0;
200         switch(srcadr->ss_family) {
201         case AF_INET:
202                 header[0] = ((struct sockaddr_in *)srcadr)->sin_addr.s_addr;
203                 header[1] = ((struct sockaddr_in *)dstadr)->sin_addr.s_addr;
204                 header[2] = htonl(keyno);
205                 header[3] = htonl(private);
206                 hdlen = 4 * sizeof(u_int32);
207                 break;
208         case AF_INET6:
209                 memcpy(&header[0], &GET_INADDR6(*srcadr),
210                     sizeof(struct in6_addr));
211                 memcpy(&header[4], &GET_INADDR6(*dstadr),
212                     sizeof(struct in6_addr));
213                 header[8] = htonl(keyno);
214                 header[9] = htonl(private);
215                 hdlen = 10 * sizeof(u_int32);
216                 break;
217         }
218         EVP_DigestInit(&ctx, EVP_md5());
219         EVP_DigestUpdate(&ctx, (u_char *)header, hdlen);
220         EVP_DigestFinal(&ctx, dgst, &len);
221         memcpy(&keyid, dgst, 4);
222         keyid = ntohl(keyid);
223         if (lifetime != 0) {
224                 MD5auth_setkey(keyno, dgst, len);
225                 authtrust(keyno, lifetime);
226         }
227 #ifdef DEBUG
228         if (debug > 1)
229                 printf(
230                     "session_key: %s > %s %08x %08x hash %08x life %lu\n",
231                     stoa(srcadr), stoa(dstadr), keyno,
232                     private, keyid, lifetime);
233 #endif
234         return (keyid);
235 }
236
237
238 /*
239  * make_keylist - generate key list
240  *
241  * This routine constructs a pseudo-random sequence by repeatedly
242  * hashing the session key starting from a given source address,
243  * destination address, private value and the next key ID of the
244  * preceeding session key. The last entry on the list is saved along
245  * with its sequence number and public signature.
246  */
247 void
248 make_keylist(
249         struct peer *peer,      /* peer structure pointer */
250         struct interface *dstadr /* interface */
251         )
252 {
253         EVP_MD_CTX ctx;         /* signature context */
254         tstamp_t tstamp;        /* NTP timestamp */
255         struct autokey *ap;     /* autokey pointer */
256         struct value *vp;       /* value pointer */
257         keyid_t keyid = 0;      /* next key ID */
258         keyid_t cookie;         /* private value */
259         u_long  lifetime;
260         u_int   len;
261         int     i;
262
263         /*
264          * Allocate the key list if necessary.
265          */
266         tstamp = crypto_time();
267         if (peer->keylist == NULL)
268                 peer->keylist = emalloc(sizeof(keyid_t) *
269                     NTP_MAXSESSION);
270
271         /*
272          * Generate an initial key ID which is unique and greater than
273          * NTP_MAXKEY.
274          */
275         while (1) {
276                 keyid = (u_long)RANDOM & 0xffffffff;
277                 if (keyid <= NTP_MAXKEY)
278                         continue;
279                 if (authhavekey(keyid))
280                         continue;
281                 break;
282         }
283
284         /*
285          * Generate up to NTP_MAXSESSION session keys. Stop if the
286          * next one would not be unique or not a session key ID or if
287          * it would expire before the next poll. The private value
288          * included in the hash is zero if broadcast mode, the peer
289          * cookie if client mode or the host cookie if symmetric modes.
290          */
291         lifetime = min(sys_automax, (unsigned long) NTP_MAXSESSION * (1 <<(peer->kpoll)));
292         if (peer->hmode == MODE_BROADCAST)
293                 cookie = 0;
294         else
295                 cookie = peer->pcookie;
296         for (i = 0; i < NTP_MAXSESSION; i++) {
297                 peer->keylist[i] = keyid;
298                 peer->keynumber = i;
299                 keyid = session_key(&dstadr->sin, &peer->srcadr, keyid,
300                     cookie, lifetime);
301                 lifetime -= 1 << peer->kpoll;
302                 if (auth_havekey(keyid) || keyid <= NTP_MAXKEY ||
303                     lifetime <= (unsigned long)(1 << (peer->kpoll)))
304                         break;
305         }
306
307         /*
308          * Save the last session key ID, sequence number and timestamp,
309          * then sign these values for later retrieval by the clients. Be
310          * careful not to use invalid key media. Use the public values
311          * timestamp as filestamp. 
312          */
313         vp = &peer->sndval;
314         if (vp->ptr == NULL)
315                 vp->ptr = emalloc(sizeof(struct autokey));
316         ap = (struct autokey *)vp->ptr;
317         ap->seq = htonl(peer->keynumber);
318         ap->key = htonl(keyid);
319         vp->tstamp = htonl(tstamp);
320         vp->fstamp = hostval.tstamp;
321         vp->vallen = htonl(sizeof(struct autokey));
322         vp->siglen = 0;
323         if (vp->tstamp != 0) {
324                 if (vp->sig == NULL)
325                         vp->sig = emalloc(sign_siglen);
326                 EVP_SignInit(&ctx, sign_digest);
327                 EVP_SignUpdate(&ctx, (u_char *)vp, 12);
328                 EVP_SignUpdate(&ctx, vp->ptr, sizeof(struct autokey));
329                 if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey))
330                         vp->siglen = htonl(len);
331                 else
332                         msyslog(LOG_ERR, "make_keys %s\n",
333                             ERR_error_string(ERR_get_error(), NULL));
334                 peer->flags |= FLAG_ASSOC;
335         }
336 #ifdef DEBUG
337         if (debug)
338                 printf("make_keys: %d %08x %08x ts %u fs %u poll %d\n",
339                     ntohl(ap->seq), ntohl(ap->key), cookie,
340                     ntohl(vp->tstamp), ntohl(vp->fstamp), peer->kpoll);
341 #endif
342 }
343
344
345 /*
346  * crypto_recv - parse extension fields
347  *
348  * This routine is called when the packet has been matched to an
349  * association and passed sanity, format and MAC checks. We believe the
350  * extension field values only if the field has proper format and
351  * length, the timestamp and filestamp are valid and the signature has
352  * valid length and is verified. There are a few cases where some values
353  * are believed even if the signature fails, but only if the proventic
354  * bit is not set.
355  */
356 int
357 crypto_recv(
358         struct peer *peer,      /* peer structure pointer */
359         struct recvbuf *rbufp   /* packet buffer pointer */
360         )
361 {
362         const EVP_MD *dp;       /* message digest algorithm */
363         u_int32 *pkt;           /* receive packet pointer */
364         struct autokey *ap, *bp; /* autokey pointer */
365         struct exten *ep, *fp;  /* extension pointers */
366         int     has_mac;        /* length of MAC field */
367         int     authlen;        /* offset of MAC field */
368         associd_t associd;      /* association ID */
369         tstamp_t tstamp = 0;    /* timestamp */
370         tstamp_t fstamp = 0;    /* filestamp */
371         u_int   len;            /* extension field length */
372         u_int   code;           /* extension field opcode */
373         u_int   vallen = 0;     /* value length */
374         X509    *cert;          /* X509 certificate */
375         char    statstr[NTP_MAXSTRLEN]; /* statistics for filegen */
376         keyid_t cookie;         /* crumbles */
377         int     rval = XEVNT_OK;
378         u_char  *ptr;
379         u_int32 temp32;
380 #ifdef KERNEL_PLL
381 #if NTP_API > 3
382         struct timex ntv;       /* kernel interface structure */
383 #endif /* NTP_API */
384 #endif /* KERNEL_PLL */
385
386         /*
387          * Initialize. Note that the packet has already been checked for
388          * valid format and extension field lengths. First extract the
389          * field length, command code and association ID in host byte
390          * order. These are used with all commands and modes. Then check
391          * the version number, which must be 2, and length, which must
392          * be at least 8 for requests and VALUE_LEN (24) for responses.
393          * Packets that fail either test sink without a trace. The
394          * association ID is saved only if nonzero.
395          */
396         authlen = LEN_PKT_NOMAC;
397         while ((has_mac = rbufp->recv_length - authlen) > MAX_MAC_LEN) {
398                 pkt = (u_int32 *)&rbufp->recv_pkt + authlen / 4;
399                 ep = (struct exten *)pkt;
400                 code = ntohl(ep->opcode) & 0xffff0000;
401                 len = ntohl(ep->opcode) & 0x0000ffff;
402                 associd = (associd_t) ntohl(pkt[1]);
403                 rval = XEVNT_OK;
404 #ifdef DEBUG
405                 if (debug)
406                         printf(
407                             "crypto_recv: flags 0x%x ext offset %d len %u code %x assocID %d\n",
408                             peer->crypto, authlen, len, code >> 16,
409                             associd);
410 #endif
411
412                 /*
413                  * Check version number and field length. If bad,
414                  * quietly ignore the packet.
415                  */
416                 if (((code >> 24) & 0x3f) != CRYPTO_VN || len < 8 ||
417                     (len < VALUE_LEN && (code & CRYPTO_RESP))) {
418                         sys_unknownversion++;
419                         code |= CRYPTO_ERROR;
420                 }
421
422                 /*
423                  * Little vulnerability bandage here. If a perp tosses a
424                  * fake association ID over the fence, we better toss it
425                  * out. Only the first one counts.
426                  */
427                 if (code & CRYPTO_RESP) {
428                         if (peer->assoc == 0)
429                                 peer->assoc = associd;
430                         else if (peer->assoc != associd)
431                                 code |= CRYPTO_ERROR;
432                 }
433                 if (len >= VALUE_LEN) {
434                         tstamp = ntohl(ep->tstamp);
435                         fstamp = ntohl(ep->fstamp);
436                         vallen = ntohl(ep->vallen);
437                 }
438                 switch (code) {
439
440                 /*
441                  * Install status word, host name, signature scheme and
442                  * association ID. In OpenSSL the signature algorithm is
443                  * bound to the digest algorithm, so the NID completely
444                  * defines the signature scheme. Note the request and
445                  * response are identical, but neither is validated by
446                  * signature. The request is processed here only in
447                  * symmetric modes. The server name field would be
448                  * useful to implement access controls in future.
449                  */
450                 case CRYPTO_ASSOC:
451
452                         /*
453                          * Pass the extension field to the transmit
454                          * side.
455                          */
456                         fp = emalloc(len);
457                         memcpy(fp, ep, len);
458                         temp32 = CRYPTO_RESP;
459                         fp->opcode |= htonl(temp32);
460                         peer->cmmd = fp;
461                         /* fall through */
462
463                 case CRYPTO_ASSOC | CRYPTO_RESP:
464
465                         /*
466                          * Discard the message if it has already been
467                          * stored or the server is not synchronized.
468                          */
469                         if (peer->crypto || !fstamp)
470                                 break;
471
472                         if (len < VALUE_LEN + vallen) {
473                                 rval = XEVNT_LEN;
474                                 break;
475                         }
476
477                         /*
478                          * Check the identity schemes are compatible. If
479                          * the client has PC, the server must have PC,
480                          * in which case the server public key and
481                          * identity are presumed valid, so we skip the
482                          * certificate and identity exchanges and move
483                          * immediately to the cookie exchange which
484                          * confirms the server signature. If the client
485                          * has IFF or GC or both, the server must have
486                          * the same one or both. Otherwise, the default
487                          * TC scheme is used.
488                          */
489                         if (crypto_flags & CRYPTO_FLAG_PRIV) {
490                                 if (!(fstamp & CRYPTO_FLAG_PRIV))
491                                         rval = XEVNT_KEY;
492                                 else
493                                         fstamp |= CRYPTO_FLAG_VALID |
494                                             CRYPTO_FLAG_VRFY;
495                         } else if (crypto_flags & CRYPTO_FLAG_MASK &&
496                             !(crypto_flags & fstamp &
497                             CRYPTO_FLAG_MASK)) {
498                                 rval = XEVNT_KEY;
499                         }
500
501                         /*
502                          * Discard the message if identity error.
503                          */
504                         if (rval != XEVNT_OK)
505                                 break;
506
507                         /*
508                          * Discard the message if the host name length
509                          * is unreasonable or the signature digest NID
510                          * is not supported.
511                          */
512                         temp32 = (fstamp >> 16) & 0xffff;
513                         dp =
514                             (const EVP_MD *)EVP_get_digestbynid(temp32);
515                         if (vallen == 0 || vallen > MAXHOSTNAME)
516                                 rval = XEVNT_LEN;
517                         else if (dp == NULL)
518                                 rval = XEVNT_MD;
519                         if (rval != XEVNT_OK)
520                                 break;
521
522                         /*
523                          * Save status word, host name and message
524                          * digest/signature type. If PC identity, be
525                          * sure not to sign the certificate.
526                          */
527                         if (crypto_flags & CRYPTO_FLAG_PRIV)
528                                 fstamp |= CRYPTO_FLAG_SIGN;
529                         peer->crypto = fstamp;
530                         peer->digest = dp;
531                         peer->subject = emalloc(vallen + 1);
532                         memcpy(peer->subject, ep->pkt, vallen);
533                         peer->subject[vallen] = '\0';
534                         peer->issuer = emalloc(vallen + 1);
535                         strcpy(peer->issuer, peer->subject);
536                         temp32 = (fstamp >> 16) & 0xffff;
537                         sprintf(statstr,
538                             "flags 0x%x host %s signature %s", fstamp,
539                             peer->subject, OBJ_nid2ln(temp32));
540                         record_crypto_stats(&peer->srcadr, statstr);
541 #ifdef DEBUG
542                         if (debug)
543                                 printf("crypto_recv: %s\n", statstr);
544 #endif
545                         break;
546
547                 /*
548                  * Decode X509 certificate in ASN.1 format and extract
549                  * the data containing, among other things, subject
550                  * name and public key. In the default identification
551                  * scheme, the certificate trail is followed to a self
552                  * signed trusted certificate.
553                  */
554                 case CRYPTO_CERT | CRYPTO_RESP:
555
556                         /*
557                          * Discard the message if invalid or identity
558                          * already confirmed.
559                          */
560                         if (peer->crypto & CRYPTO_FLAG_VRFY)
561                                 break;
562
563                         if ((rval = crypto_verify(ep, NULL, peer)) !=
564                             XEVNT_OK)
565                                 break;
566
567                         /*
568                          * Scan the certificate list to delete old
569                          * versions and link the newest version first on
570                          * the list.
571                          */
572                         if ((rval = cert_install(ep, peer)) != XEVNT_OK)
573                                 break;
574
575                         /*
576                          * If we snatch the certificate before the
577                          * server certificate has been signed by its
578                          * server, it will be self signed. When it is,
579                          * we chase the certificate issuer, which the
580                          * server has, and keep going until a self
581                          * signed trusted certificate is found. Be sure
582                          * to update the issuer field, since it may
583                          * change.
584                          */
585                         if (peer->issuer != NULL)
586                                 free(peer->issuer);
587                         peer->issuer = emalloc(strlen(cinfo->issuer) +
588                             1);
589                         strcpy(peer->issuer, cinfo->issuer);
590
591                         /*
592                          * We plug in the public key and group key in
593                          * the first certificate received. However, note
594                          * that this certificate might not be signed by
595                          * the server, so we can't check the
596                          * signature/digest NID.
597                          */
598                         if (peer->pkey == NULL) {
599                                 ptr = (u_char *)cinfo->cert.ptr;
600                                 cert = d2i_X509(NULL, &ptr,
601                                     ntohl(cinfo->cert.vallen));
602                                 peer->pkey = X509_get_pubkey(cert);
603                                 X509_free(cert);
604                         }
605                         peer->flash &= ~TEST10;
606                         temp32 = cinfo->nid;
607                         sprintf(statstr, "cert %s 0x%x %s (%u) fs %u",
608                             cinfo->subject, cinfo->flags,
609                             OBJ_nid2ln(temp32), temp32,
610                             ntohl(ep->fstamp));
611                         record_crypto_stats(&peer->srcadr, statstr);
612 #ifdef DEBUG
613                         if (debug)
614                                 printf("crypto_recv: %s\n", statstr);
615 #endif
616                         break;
617
618                 /*
619                  * Schnorr (IFF)identity scheme. This scheme is designed
620                  * for use with shared secret group keys and where the
621                  * certificate may be generated by a third party. The
622                  * client sends a challenge to the server, which
623                  * performs a calculation and returns the result. A
624                  * positive result is possible only if both client and
625                  * server contain the same secret group key.
626                  */
627                 case CRYPTO_IFF | CRYPTO_RESP:
628
629                         /*
630                          * Discard the message if invalid or identity
631                          * already confirmed.
632                          */
633                         if (peer->crypto & CRYPTO_FLAG_VRFY)
634                                 break;
635
636                         if ((rval = crypto_verify(ep, NULL, peer)) !=
637                             XEVNT_OK)
638                                 break;
639
640                         /*
641                          * If the the challenge matches the response,
642                          * the certificate public key, as well as the
643                          * server public key, signatyre and identity are
644                          * all verified at the same time. The server is
645                          * declared trusted, so we skip further
646                          * certificate stages and move immediately to
647                          * the cookie stage.
648                          */
649                         if ((rval = crypto_iff(ep, peer)) != XEVNT_OK)
650                                 break;
651
652                         peer->crypto |= CRYPTO_FLAG_VRFY |
653                             CRYPTO_FLAG_PROV;
654                         peer->flash &= ~TEST10;
655                         sprintf(statstr, "iff fs %u",
656                             ntohl(ep->fstamp));
657                         record_crypto_stats(&peer->srcadr, statstr);
658 #ifdef DEBUG
659                         if (debug)
660                                 printf("crypto_recv: %s\n", statstr);
661 #endif
662                         break;
663
664                 /*
665                  * Guillou-Quisquater (GQ) identity scheme. This scheme
666                  * is designed for use with public certificates carrying
667                  * the GQ public key in an extension field. The client
668                  * sends a challenge to the server, which performs a
669                  * calculation and returns the result. A positive result
670                  * is possible only if both client and server contain
671                  * the same group key and the server has the matching GQ
672                  * private key.
673                  */
674                 case CRYPTO_GQ | CRYPTO_RESP:
675
676                         /*
677                          * Discard the message if invalid or identity
678                          * already confirmed.
679                          */
680                         if (peer->crypto & CRYPTO_FLAG_VRFY)
681                                 break;
682
683                         if ((rval = crypto_verify(ep, NULL, peer)) !=
684                             XEVNT_OK)
685                                 break;
686
687                         /*
688                          * If the the challenge matches the response,
689                          * the certificate public key, as well as the
690                          * server public key, signatyre and identity are
691                          * all verified at the same time. The server is
692                          * declared trusted, so we skip further
693                          * certificate stages and move immediately to
694                          * the cookie stage.
695                          */
696                         if ((rval = crypto_gq(ep, peer)) != XEVNT_OK)
697                                 break;
698
699                         peer->crypto |= CRYPTO_FLAG_VRFY |
700                             CRYPTO_FLAG_PROV;
701                         peer->flash &= ~TEST10;
702                         sprintf(statstr, "gq fs %u",
703                             ntohl(ep->fstamp));
704                         record_crypto_stats(&peer->srcadr, statstr);
705 #ifdef DEBUG
706                         if (debug)
707                                 printf("crypto_recv: %s\n", statstr);
708 #endif
709                         break;
710
711                 /*
712                  * MV
713                  */
714                 case CRYPTO_MV | CRYPTO_RESP:
715
716                         /*
717                          * Discard the message if invalid or identity
718                          * already confirmed.
719                          */
720                         if (peer->crypto & CRYPTO_FLAG_VRFY)
721                                 break;
722
723                         if ((rval = crypto_verify(ep, NULL, peer)) !=
724                             XEVNT_OK)
725                                 break;
726
727                         /*
728                          * If the the challenge matches the response,
729                          * the certificate public key, as well as the
730                          * server public key, signatyre and identity are
731                          * all verified at the same time. The server is
732                          * declared trusted, so we skip further
733                          * certificate stages and move immediately to
734                          * the cookie stage.
735                          */
736                         if ((rval = crypto_mv(ep, peer)) != XEVNT_OK)
737                                 break;
738
739                         peer->crypto |= CRYPTO_FLAG_VRFY |
740                             CRYPTO_FLAG_PROV;
741                         peer->flash &= ~TEST10;
742                         sprintf(statstr, "mv fs %u",
743                             ntohl(ep->fstamp));
744                         record_crypto_stats(&peer->srcadr, statstr);
745 #ifdef DEBUG
746                         if (debug)
747                                 printf("crypto_recv: %s\n", statstr);
748 #endif
749                         break;
750         
751                 /*
752                  * X509 certificate sign response. Validate the
753                  * certificate signed by the server and install. Later
754                  * this can be provided to clients of this server in
755                  * lieu of the self signed certificate in order to
756                  * validate the public key.
757                  */
758                 case CRYPTO_SIGN | CRYPTO_RESP:
759
760                         /*
761                          * Discard the message if invalid or identity
762                          * not confirmed.
763                          */
764                         if (!(peer->crypto & CRYPTO_FLAG_VRFY))
765                                 break;
766
767                         if ((rval = crypto_verify(ep, NULL, peer)) !=
768                             XEVNT_OK)
769                                 break;
770
771                         /*
772                          * Scan the certificate list to delete old
773                          * versions and link the newest version first on
774                          * the list.
775                          */
776                         if ((rval = cert_install(ep, peer)) != XEVNT_OK)                                break;
777
778                         peer->crypto |= CRYPTO_FLAG_SIGN;
779                         peer->flash &= ~TEST10;
780                         temp32 = cinfo->nid;
781                         sprintf(statstr, "sign %s 0x%x %s (%u) fs %u",
782                             cinfo->issuer, cinfo->flags,
783                             OBJ_nid2ln(temp32), temp32,
784                             ntohl(ep->fstamp));
785                         record_crypto_stats(&peer->srcadr, statstr);
786 #ifdef DEBUG
787                         if (debug)
788                                 printf("crypto_recv: %s\n", statstr);
789 #endif
790                         break;
791
792                 /*
793                  * Cookie request in symmetric modes. Roll a random
794                  * cookie and install in symmetric mode. Encrypt for the
795                  * response, which is transmitted later.
796                  */
797                 case CRYPTO_COOK:
798
799                         /*
800                          * Discard the message if invalid or identity
801                          * not confirmed.
802                          */
803                         if (!(peer->crypto & CRYPTO_FLAG_VRFY))
804                                 break;
805
806                         if ((rval = crypto_verify(ep, NULL, peer)) !=
807                             XEVNT_OK)
808                                 break;
809
810                         /*
811                          * Pass the extension field to the transmit
812                          * side. If already agreed, walk away.
813                          */
814                         fp = emalloc(len);
815                         memcpy(fp, ep, len);
816                         temp32 = CRYPTO_RESP;
817                         fp->opcode |= htonl(temp32);
818                         peer->cmmd = fp;
819                         if (peer->crypto & CRYPTO_FLAG_AGREE) {
820                                 peer->flash &= ~TEST10;
821                                 break;
822                         }
823
824                         /*
825                          * Install cookie values and light the cookie
826                          * bit. The transmit side will pick up and
827                          * encrypt it for the response.
828                          */
829                         key_expire(peer);
830                         peer->cookval.tstamp = ep->tstamp;
831                         peer->cookval.fstamp = ep->fstamp;
832                         RAND_bytes((u_char *)&peer->pcookie, 4);
833                         peer->crypto &= ~CRYPTO_FLAG_AUTO;
834                         peer->crypto |= CRYPTO_FLAG_AGREE;
835                         peer->flash &= ~TEST10;
836                         sprintf(statstr, "cook %x ts %u fs %u",
837                             peer->pcookie, ntohl(ep->tstamp),
838                             ntohl(ep->fstamp));
839                         record_crypto_stats(&peer->srcadr, statstr);
840 #ifdef DEBUG
841                         if (debug)
842                                 printf("crypto_recv: %s\n", statstr);
843 #endif
844                         break;
845
846                 /*
847                  * Cookie response in client and symmetric modes. If the
848                  * cookie bit is set, the working cookie is the EXOR of
849                  * the current and new values.
850                  */
851                 case CRYPTO_COOK | CRYPTO_RESP:
852
853                         /*
854                          * Discard the message if invalid or identity
855                          * not confirmed or signature not verified with
856                          * respect to the cookie values.
857                          */
858                         if (!(peer->crypto & CRYPTO_FLAG_VRFY))
859                                 break;
860
861                         if ((rval = crypto_verify(ep, &peer->cookval,
862                             peer)) != XEVNT_OK)
863                                 break;
864
865                         /*
866                          * Decrypt the cookie, hunting all the time for
867                          * errors.
868                          */
869                         if (vallen == (u_int) EVP_PKEY_size(host_pkey)) {
870                                 RSA_private_decrypt(vallen,
871                                     (u_char *)ep->pkt,
872                                     (u_char *)&temp32,
873                                     host_pkey->pkey.rsa,
874                                     RSA_PKCS1_OAEP_PADDING);
875                                 cookie = ntohl(temp32);
876                         } else {
877                                 rval = XEVNT_CKY;
878                                 break;
879                         }
880
881                         /*
882                          * Install cookie values and light the cookie
883                          * bit. If this is not broadcast client mode, we
884                          * are done here.
885                          */
886                         key_expire(peer);
887                         peer->cookval.tstamp = ep->tstamp;
888                         peer->cookval.fstamp = ep->fstamp;
889                         if (peer->crypto & CRYPTO_FLAG_AGREE)
890                                 peer->pcookie ^= cookie;
891                         else
892                                 peer->pcookie = cookie;
893                         if (peer->hmode == MODE_CLIENT &&
894                             !(peer->cast_flags & MDF_BCLNT))
895                                 peer->crypto |= CRYPTO_FLAG_AUTO;
896                         else
897                                 peer->crypto &= ~CRYPTO_FLAG_AUTO;
898                         peer->crypto |= CRYPTO_FLAG_AGREE;
899                         peer->flash &= ~TEST10;
900                         sprintf(statstr, "cook %x ts %u fs %u",
901                             peer->pcookie, ntohl(ep->tstamp),
902                             ntohl(ep->fstamp));
903                         record_crypto_stats(&peer->srcadr, statstr);
904 #ifdef DEBUG
905                         if (debug)
906                                 printf("crypto_recv: %s\n", statstr);
907 #endif
908                         break;
909
910                 /*
911                  * Install autokey values in broadcast client and
912                  * symmetric modes. We have to do this every time the
913                  * sever/peer cookie changes or a new keylist is
914                  * rolled. Ordinarily, this is automatic as this message
915                  * is piggybacked on the first NTP packet sent upon
916                  * either of these events. Note that a broadcast client
917                  * or symmetric peer can receive this response without a
918                  * matching request.
919                  */
920                 case CRYPTO_AUTO | CRYPTO_RESP:
921
922                         /*
923                          * Discard the message if invalid or identity
924                          * not confirmed or signature not verified with
925                          * respect to the receive autokey values.
926                          */
927                         if (!(peer->crypto & CRYPTO_FLAG_VRFY))
928                                 break;
929
930                         if ((rval = crypto_verify(ep, &peer->recval,
931                             peer)) != XEVNT_OK)
932                                 break;
933
934                         /*
935                          * Install autokey values and light the
936                          * autokey bit. This is not hard.
937                          */
938                         if (peer->recval.ptr == NULL)
939                                 peer->recval.ptr =
940                                     emalloc(sizeof(struct autokey));
941                         bp = (struct autokey *)peer->recval.ptr;
942                         peer->recval.tstamp = ep->tstamp;
943                         peer->recval.fstamp = ep->fstamp;
944                         ap = (struct autokey *)ep->pkt;
945                         bp->seq = ntohl(ap->seq);
946                         bp->key = ntohl(ap->key);
947                         peer->pkeyid = bp->key;
948                         peer->crypto |= CRYPTO_FLAG_AUTO;
949                         peer->flash &= ~TEST10;
950                         sprintf(statstr,
951                             "auto seq %d key %x ts %u fs %u", bp->seq,
952                             bp->key, ntohl(ep->tstamp),
953                             ntohl(ep->fstamp));
954                         record_crypto_stats(&peer->srcadr, statstr);
955 #ifdef DEBUG
956                         if (debug)
957                                 printf("crypto_recv: %s\n", statstr);
958 #endif
959                         break;
960
961                 /*
962                  * Install leapseconds table in symmetric modes. This
963                  * table is proventicated to the NIST primary servers,
964                  * either by copying the file containing the table from
965                  * a NIST server to a trusted server or directly using
966                  * this protocol. While the entire table is installed at
967                  * the server, presently only the current TAI offset is
968                  * provided via the kernel to other applications.
969                  */
970                 case CRYPTO_TAI:
971
972                         /*
973                          * Discard the message if invalid or identity
974                          * not confirmed.
975                          */
976                         if (!(peer->crypto & CRYPTO_FLAG_VRFY))
977                                 break;
978
979                         if ((rval = crypto_verify(ep, NULL, peer)) !=
980                             XEVNT_OK)
981                                 break;
982
983                         /*
984                          * Pass the extension field to the transmit
985                          * side. Continue below if a leapseconds table
986                          * accompanies the message.
987                          */
988                         fp = emalloc(len);
989                         memcpy(fp, ep, len);
990                         temp32 = CRYPTO_RESP;
991                         fp->opcode |= htonl(temp32);
992                         peer->cmmd = fp;
993                         if (len <= VALUE_LEN) {
994                                 peer->flash &= ~TEST10;
995                                 break;
996                         }
997                         /* fall through */
998
999                 case CRYPTO_TAI | CRYPTO_RESP:
1000
1001                         /*
1002                          * Discard the message if invalid or identity
1003                          * not confirmed or signature not verified with
1004                          * respect to the leapsecond table values.
1005                          */
1006                         if (!(peer->crypto & CRYPTO_FLAG_VRFY))
1007                                 break;
1008
1009                         if ((rval = crypto_verify(ep, &peer->tai_leap,
1010                             peer)) != XEVNT_OK)
1011                                 break;
1012
1013                         /*
1014                          * Initialize peer variables, leapseconds
1015                          * structure and extension field in network byte
1016                          * order. Since a filestamp may have changed,
1017                          * recompute the signatures.
1018                          */
1019                         peer->tai_leap.tstamp = ep->tstamp;
1020                         peer->tai_leap.fstamp = ep->fstamp;
1021                         peer->tai_leap.vallen = ep->vallen;
1022
1023                         /*
1024                          * Install the new table if there is no stored
1025                          * table or the new table is more recent than
1026                          * the stored table. Since a filestamp may have
1027                          * changed, recompute the signatures.
1028                          */
1029                         if (ntohl(peer->tai_leap.fstamp) >
1030                             ntohl(tai_leap.fstamp)) {
1031                                 tai_leap.fstamp = ep->fstamp;
1032                                 tai_leap.vallen = ep->vallen;
1033                                 if (tai_leap.ptr != NULL)
1034                                         free(tai_leap.ptr);
1035                                 tai_leap.ptr = emalloc(vallen);
1036                                 memcpy(tai_leap.ptr, ep->pkt, vallen);
1037                                 crypto_update();
1038                                 sys_tai = vallen / 4 + TAI_1972 - 1;
1039                         }
1040                         crypto_flags |= CRYPTO_FLAG_TAI;
1041                         peer->crypto |= CRYPTO_FLAG_LEAP;
1042                         peer->flash &= ~TEST10;
1043 #ifdef KERNEL_PLL
1044 #if NTP_API > 3
1045                         /*
1046                          * If the kernel cooperates, initialize the
1047                          * current TAI offset.
1048                          */
1049                         ntv.modes = MOD_TAI;
1050                         ntv.constant = sys_tai;
1051                         (void)ntp_adjtime(&ntv);
1052 #endif /* NTP_API */
1053 #endif /* KERNEL_PLL */
1054                         sprintf(statstr, "leap %u ts %u fs %u",
1055                             vallen, ntohl(ep->tstamp),
1056                             ntohl(ep->fstamp));
1057                         record_crypto_stats(&peer->srcadr, statstr);
1058 #ifdef DEBUG
1059                         if (debug)
1060                                 printf("crypto_recv: %s\n", statstr);
1061 #endif
1062                         break;
1063
1064                 /*
1065                  * We come here in symmetric modes for miscellaneous
1066                  * commands that have value fields but are processed on
1067                  * the transmit side. All we need do here is check for
1068                  * valid field length. Remaining checks are below and on
1069                  * the transmit side.
1070                  */
1071                 case CRYPTO_IFF:
1072                 case CRYPTO_GQ:
1073                 case CRYPTO_MV:
1074                 case CRYPTO_SIGN:
1075                         if (len < VALUE_LEN) {
1076                                 rval = XEVNT_LEN;
1077                                 break;
1078                         }
1079
1080                         /* fall through */
1081
1082                 /*
1083                  * We come here for miscellaneous requests and unknown
1084                  * requests and responses. If an unknown response or
1085                  * error, forget it. If a request, save the extension
1086                  * field for later. Unknown requests will be caught on
1087                  * the transmit side.
1088                  */
1089                 default:
1090                         if (code & (CRYPTO_RESP | CRYPTO_ERROR)) {
1091                                 rval = XEVNT_LEN;
1092                         } else if ((rval = crypto_verify(ep, NULL,
1093                             peer)) == XEVNT_OK) {
1094                                 fp = emalloc(len);
1095                                 memcpy(fp, ep, len);
1096                                 temp32 = CRYPTO_RESP;
1097                                 fp->opcode |= htonl(temp32);
1098                                 peer->cmmd = fp;
1099                         }
1100                 }
1101
1102                 /*
1103                  * We log everything except length/format errors and
1104                  * duplicates, which are log clogging vulnerabilities.
1105                  * The first error found terminates the extension field
1106                  * scan and we return the laundry to the caller.
1107                  */
1108                 if (rval != XEVNT_OK) {
1109                         sprintf(statstr,
1110                             "error %x opcode %x ts %u fs %u", rval,
1111                             code, tstamp, fstamp);
1112                         if (rval > XEVNT_TSP)
1113                                 record_crypto_stats(&peer->srcadr,
1114                                     statstr);
1115                         report_event(rval, peer);
1116 #ifdef DEBUG
1117                         if (debug)
1118                                 printf("crypto_recv: %s\n", statstr);
1119 #endif
1120                         break;
1121                 }
1122                 authlen += len;
1123         }
1124         return (rval);
1125 }
1126
1127
1128 /*
1129  * crypto_xmit - construct extension fields
1130  *
1131  * This routine is called both when an association is configured and
1132  * when one is not. The only case where this matters is to retrieve the
1133  * autokey information, in which case the caller has to provide the
1134  * association ID to match the association.
1135  *
1136  * Returns length of extension field.
1137  */
1138 int
1139 crypto_xmit(
1140         struct pkt *xpkt,       /* transmit packet pointer */
1141         struct sockaddr_storage *srcadr_sin,    /* active runway */
1142         int     start,          /* offset to extension field */
1143         struct exten *ep,       /* extension pointer */
1144         keyid_t cookie          /* session cookie */
1145         )
1146 {
1147         u_int32 *pkt;           /* packet pointer */
1148         struct peer *peer;      /* peer structure pointer */
1149         u_int   opcode;         /* extension field opcode */
1150         struct exten *fp;       /* extension pointers */
1151         struct cert_info *cp;   /* certificate info/value pointer */
1152         char    certname[MAXHOSTNAME + 1]; /* subject name buffer */
1153         char    statstr[NTP_MAXSTRLEN]; /* statistics for filegen */
1154         u_int   vallen;
1155         u_int   len;
1156         struct value vtemp;
1157         associd_t associd;
1158         int     rval;
1159         keyid_t tcookie;
1160
1161         /*
1162          * Generate the requested extension field request code, length
1163          * and association ID. If this is a response and the host is not
1164          * synchronized, light the error bit and go home.
1165          */
1166         pkt = (u_int32 *)xpkt + start / 4;
1167         fp = (struct exten *)pkt;
1168         opcode = ntohl(ep->opcode);
1169         associd = (associd_t) ntohl(ep->associd);
1170         fp->associd = htonl(associd);
1171         len = 8;
1172         rval = XEVNT_OK;
1173         switch (opcode & 0xffff0000) {
1174
1175         /*
1176          * Send association request and response with status word and
1177          * host name. Note, this message is not signed and the filestamp
1178          * contains only the status word. We check at this point whether
1179          * the identity schemes are compatible to save tears later on.
1180          */
1181         case CRYPTO_ASSOC | CRYPTO_RESP:
1182         case CRYPTO_ASSOC:
1183                 len += crypto_send(fp, &hostval);
1184                 if (crypto_time() == 0)
1185                         fp->fstamp = 0;
1186                 else
1187                         fp->fstamp = htonl(crypto_flags);
1188                 break;
1189
1190         /*
1191          * Send certificate request. Use the values from the extension
1192          * field.
1193          */
1194         case CRYPTO_CERT:
1195                 memset(&vtemp, 0, sizeof(vtemp));
1196                 vtemp.tstamp = ep->tstamp;
1197                 vtemp.fstamp = ep->fstamp;
1198                 vtemp.vallen = ep->vallen;
1199                 vtemp.ptr = (unsigned char *)ep->pkt;
1200                 len += crypto_send(fp, &vtemp);
1201                 break;
1202
1203         /*
1204          * Send certificate response or sign request. Use the values
1205          * from the certificate. If the request contains no subject
1206          * name, assume the name of this host. This is for backwards
1207          * compatibility.  Light the error bit if no certificate with
1208          * the given subject name is found. Of course, private
1209          * certificates are never sent.
1210          */
1211         case CRYPTO_SIGN:
1212         case CRYPTO_CERT | CRYPTO_RESP:
1213                 vallen = ntohl(ep->vallen);
1214                 if (vallen == 8) {
1215                         strcpy(certname, sys_hostname);
1216                 } else if (vallen == 0 || vallen > MAXHOSTNAME) {
1217                         opcode |= CRYPTO_ERROR;
1218                         break;
1219
1220                 } else {
1221                         memcpy(certname, ep->pkt, vallen);
1222                         certname[vallen] = '\0';
1223                 }
1224                 for (cp = cinfo; cp != NULL; cp = cp->link) {
1225                         if (cp->flags & CERT_PRIV)
1226                                 continue;
1227                         if (strcmp(certname, cp->subject) == 0) {
1228                                 len += crypto_send(fp, &cp->cert);
1229                                 break;
1230                         }
1231                 }
1232                 if (cp == NULL)
1233                         opcode |= CRYPTO_ERROR;
1234                 break;
1235
1236         /*
1237          * Send challenge in Schnorr (IFF) identity scheme.
1238          */
1239         case CRYPTO_IFF:
1240                 if ((peer = findpeerbyassoc(ep->pkt[0])) == NULL) {
1241                         opcode |= CRYPTO_ERROR;
1242                         break;
1243                 }
1244                 if ((rval = crypto_alice(peer, &vtemp)) == XEVNT_OK)
1245                         len += crypto_send(fp, &vtemp);
1246                 value_free(&vtemp);
1247                 break;
1248
1249         /*
1250          * Send response in Schnorr (IFF) identity scheme.
1251          */
1252         case CRYPTO_IFF | CRYPTO_RESP:
1253                 if ((rval = crypto_bob(ep, &vtemp)) == XEVNT_OK)
1254                         len += crypto_send(fp, &vtemp);
1255                 value_free(&vtemp);
1256                 break;
1257
1258         /*
1259          * Send challenge in Guillou-Quisquater (GQ) identity scheme.
1260          */
1261         case CRYPTO_GQ:
1262                 if ((peer = findpeerbyassoc(ep->pkt[0])) == NULL) {
1263                         opcode |= CRYPTO_ERROR;
1264                         break;
1265                 }
1266                 if ((rval = crypto_alice2(peer, &vtemp)) == XEVNT_OK)
1267                         len += crypto_send(fp, &vtemp);
1268                 value_free(&vtemp);
1269                 break;
1270
1271         /*
1272          * Send response in Guillou-Quisquater (GQ) identity scheme.
1273          */
1274         case CRYPTO_GQ | CRYPTO_RESP:
1275                 if ((rval = crypto_bob2(ep, &vtemp)) == XEVNT_OK)
1276                         len += crypto_send(fp, &vtemp);
1277                 value_free(&vtemp);
1278                 break;
1279
1280         /*
1281          * Send challenge in MV identity scheme.
1282          */
1283         case CRYPTO_MV:
1284                 if ((peer = findpeerbyassoc(ep->pkt[0])) == NULL) {
1285                         opcode |= CRYPTO_ERROR;
1286                         break;
1287                 }
1288                 if ((rval = crypto_alice3(peer, &vtemp)) == XEVNT_OK)
1289                         len += crypto_send(fp, &vtemp);
1290                 value_free(&vtemp);
1291                 break;
1292
1293         /*
1294          * Send response in MV identity scheme.
1295          */
1296         case CRYPTO_MV | CRYPTO_RESP:
1297                 if ((rval = crypto_bob3(ep, &vtemp)) == XEVNT_OK)
1298                         len += crypto_send(fp, &vtemp);
1299                 value_free(&vtemp);
1300                 break;
1301
1302         /*
1303          * Send certificate sign response. The integrity of the request
1304          * certificate has already been verified on the receive side.
1305          * Sign the response using the local server key. Use the
1306          * filestamp from the request and use the timestamp as the
1307          * current time. Light the error bit if the certificate is
1308          * invalid or contains an unverified signature.
1309          */
1310         case CRYPTO_SIGN | CRYPTO_RESP:
1311                 if ((rval = cert_sign(ep, &vtemp)) == XEVNT_OK)
1312                         len += crypto_send(fp, &vtemp);
1313                 value_free(&vtemp);
1314                 break;
1315
1316         /*
1317          * Send public key and signature. Use the values from the public
1318          * key.
1319          */
1320         case CRYPTO_COOK:
1321                 len += crypto_send(fp, &pubkey);
1322                 break;
1323
1324         /*
1325          * Encrypt and send cookie and signature. Light the error bit if
1326          * anything goes wrong.
1327          */
1328         case CRYPTO_COOK | CRYPTO_RESP:
1329                 if ((opcode & 0xffff) < VALUE_LEN) {
1330                         opcode |= CRYPTO_ERROR;
1331                         break;
1332                 }
1333                 if (PKT_MODE(xpkt->li_vn_mode) == MODE_SERVER) {
1334                         tcookie = cookie;
1335                 } else {
1336                         if ((peer = findpeerbyassoc(associd)) == NULL) {
1337                                 opcode |= CRYPTO_ERROR;
1338                                 break;
1339                         }
1340                         tcookie = peer->pcookie;
1341                 }
1342                 if ((rval = crypto_encrypt(ep, &vtemp, &tcookie)) ==
1343                     XEVNT_OK)
1344                         len += crypto_send(fp, &vtemp);
1345                 value_free(&vtemp);
1346                 break;
1347
1348         /*
1349          * Find peer and send autokey data and signature in broadcast
1350          * server and symmetric modes. Use the values in the autokey
1351          * structure. If no association is found, either the server has
1352          * restarted with new associations or some perp has replayed an
1353          * old message, in which case light the error bit.
1354          */
1355         case CRYPTO_AUTO | CRYPTO_RESP:
1356                 if ((peer = findpeerbyassoc(associd)) == NULL) {
1357                         opcode |= CRYPTO_ERROR;
1358                         break;
1359                 }
1360                 peer->flags &= ~FLAG_ASSOC;
1361                 len += crypto_send(fp, &peer->sndval);
1362                 break;
1363
1364         /*
1365          * Send leapseconds table and signature. Use the values from the
1366          * tai structure. If no table has been loaded, just send a
1367          * request.
1368          */
1369         case CRYPTO_TAI:
1370         case CRYPTO_TAI | CRYPTO_RESP:
1371                 if (crypto_flags & CRYPTO_FLAG_TAI)
1372                         len += crypto_send(fp, &tai_leap);
1373                 break;
1374
1375         /*
1376          * Default - Fall through for requests; for unknown responses,
1377          * flag as error.
1378          */
1379         default:
1380                 if (opcode & CRYPTO_RESP)
1381                         opcode |= CRYPTO_ERROR;
1382         }
1383
1384         /*
1385          * We ignore length/format errors and duplicates. Other errors
1386          * are reported to the log and deny further service. To really
1387          * persistent rascals we toss back a kiss-of-death grenade.
1388          */
1389         if (rval > XEVNT_TSP) {
1390                 opcode |= CRYPTO_ERROR;
1391                 sprintf(statstr, "error %x opcode %x", rval, opcode);
1392                 record_crypto_stats(srcadr_sin, statstr);
1393 #ifdef DEBUG
1394                 if (debug)
1395                         printf("crypto_xmit: %s\n", statstr);
1396 #endif
1397         }
1398
1399         /*
1400          * Round up the field length to a multiple of 8 bytes and save
1401          * the request code and length.
1402          */
1403         len = ((len + 7) / 8) * 8;
1404         fp->opcode = htonl((opcode & 0xffff0000) | len);
1405 #ifdef DEBUG
1406         if (debug)
1407                 printf(
1408                     "crypto_xmit: ext offset %d len %u code %x assocID %d\n",
1409                     start, len, opcode>> 16, associd);
1410 #endif
1411         return (len);
1412 }
1413
1414
1415 /*
1416  * crypto_verify - parse and verify the extension field and value
1417  *
1418  * Returns
1419  * XEVNT_OK     success
1420  * XEVNT_LEN    bad field format or length
1421  * XEVNT_TSP    bad timestamp
1422  * XEVNT_FSP    bad filestamp
1423  * XEVNT_PUB    bad or missing public key
1424  * XEVNT_SGL    bad signature length
1425  * XEVNT_SIG    signature not verified
1426  */
1427 static int
1428 crypto_verify(
1429         struct exten *ep,       /* extension pointer */
1430         struct value *vp,       /* value pointer */
1431         struct peer *peer       /* peer structure pointer */
1432         )
1433 {
1434         EVP_PKEY *pkey;         /* server public key */
1435         EVP_MD_CTX ctx;         /* signature context */
1436         tstamp_t tstamp;        /* timestamp */
1437         tstamp_t fstamp;        /* filestamp */
1438         u_int   vallen;         /* value length */
1439         u_int   siglen;         /* signature length */
1440         u_int   opcode, len;
1441         int     rval;
1442         int     i;
1443
1444         /*
1445          * We require valid opcode and field length, timestamp,
1446          * filestamp, public key, digest, signature length and
1447          * signature, where relevant. Note that preliminary length
1448          * checks are done in the main loop.
1449          */
1450         len = ntohl(ep->opcode) & 0x0000ffff;
1451         opcode = ntohl(ep->opcode) & 0xffff0000;
1452
1453         /*
1454          * Check for valid operation code and protocol. The opcode must
1455          * not have the error bit set. If a response, it must have a
1456          * value header. If a request and does not contain a value
1457          * header, no need for further checking.
1458          */
1459         if (opcode & CRYPTO_ERROR)
1460                 return (XEVNT_LEN);
1461         if (opcode & CRYPTO_RESP) {
1462                 if (len < VALUE_LEN)
1463                         return (XEVNT_LEN);
1464         } else {
1465                 if (len < VALUE_LEN)
1466                         return (XEVNT_OK);
1467         }
1468         /*
1469          * We have a value header. Check for valid field lengths. The
1470          * field length must be long enough to contain the value header,
1471          * value and signature. If a request and a previous request of
1472          * the same type is pending, discard the previous request. If a
1473          * request but no signature, there is no need for further
1474          * checking.
1475          */
1476         vallen = ntohl(ep->vallen);
1477         if (len < ((VALUE_LEN + vallen + 3) / 4) * 4)
1478                 return (XEVNT_LEN);
1479
1480         i = (vallen + 3) / 4;
1481         siglen = ntohl(ep->pkt[i++]);
1482         if (len < VALUE_LEN + vallen + siglen)
1483                 return (XEVNT_LEN);
1484
1485         if (!(opcode & CRYPTO_RESP)) {
1486                 if (peer->cmmd != NULL) {
1487                         if ((opcode | CRYPTO_RESP) ==
1488                             (ntohl(peer->cmmd->opcode) & 0xffff0000)) {
1489                                 free(peer->cmmd);
1490                                 peer->cmmd = NULL;
1491                         } else {
1492                                 return (XEVNT_LEN);
1493                         }
1494                 }
1495                 if (siglen == 0)
1496                         return (XEVNT_OK);
1497         }
1498
1499         /*
1500          * We have a signature. Check for valid timestamp and filestamp.
1501          * The timestamp must not precede the filestamp. The timestamp
1502          * and filestamp must not precede the corresponding values in
1503          * the value structure. Once the autokey values have been
1504          * installed, the timestamp must always be later than the
1505          * corresponding value in the value structure. Duplicate
1506          * timestamps are illegal once the cookie has been validated.
1507          */
1508         rval = XEVNT_OK;
1509         if (crypto_flags & peer->crypto & CRYPTO_FLAG_PRIV)
1510                 pkey = sign_pkey;
1511         else
1512                 pkey = peer->pkey;
1513         tstamp = ntohl(ep->tstamp);
1514         fstamp = ntohl(ep->fstamp);
1515         if (tstamp == 0 || tstamp < fstamp) {
1516                 rval = XEVNT_TSP;
1517         } else if (vp != NULL && (tstamp < ntohl(vp->tstamp) ||
1518             (tstamp == ntohl(vp->tstamp) && (peer->crypto &
1519             CRYPTO_FLAG_AUTO)))) {
1520                 rval = XEVNT_TSP;
1521         } else if (vp != NULL && (tstamp < ntohl(vp->fstamp) || fstamp <
1522             ntohl(vp->fstamp))) {
1523                 rval = XEVNT_FSP;
1524
1525         /*
1526          * If a public key and digest is present, and if valid key
1527          * length, check for valid signature. Note that the first valid
1528          * signature lights the proventic bit.
1529          */
1530         } else if (pkey == NULL || peer->digest == NULL) {
1531                 /* fall through */
1532         } else if (siglen != (u_int) EVP_PKEY_size(pkey)) {
1533                 rval = XEVNT_SGL;
1534         } else {
1535                 EVP_VerifyInit(&ctx, peer->digest);
1536                 EVP_VerifyUpdate(&ctx, (u_char *)&ep->tstamp, vallen +
1537                     12);
1538                 if (EVP_VerifyFinal(&ctx, (u_char *)&ep->pkt[i], siglen,
1539                     pkey)) {
1540                         if (peer->crypto & CRYPTO_FLAG_VRFY)
1541                                 peer->crypto |= CRYPTO_FLAG_PROV;
1542                 } else {
1543                         rval = XEVNT_SIG;
1544                 }
1545         }
1546 #ifdef DEBUG
1547         if (debug > 1)
1548                 printf(
1549                     "crypto_recv: verify %x vallen %u siglen %u ts %u fs %u\n",
1550                     rval, vallen, siglen, tstamp, fstamp);
1551 #endif
1552         return (rval);
1553 }
1554
1555
1556 /*
1557  * crypto_encrypt - construct encrypted cookie and signature from
1558  * extension field and cookie
1559  *
1560  * Returns
1561  * XEVNT_OK     success
1562  * XEVNT_PUB    bad or missing public key
1563  * XEVNT_CKY    bad or missing cookie
1564  */
1565 static int
1566 crypto_encrypt(
1567         struct exten *ep,       /* extension pointer */
1568         struct value *vp,       /* value pointer */
1569         keyid_t *cookie         /* server cookie */
1570         )
1571 {
1572         EVP_PKEY *pkey;         /* public key */
1573         EVP_MD_CTX ctx;         /* signature context */
1574         tstamp_t tstamp;        /* NTP timestamp */
1575         u_int32 temp32;
1576         u_int   len;
1577         u_char  *ptr;
1578
1579         /*
1580          * Extract the public key from the request.
1581          */
1582         len = ntohl(ep->vallen);
1583         ptr = (u_char *)ep->pkt;
1584         pkey = d2i_PublicKey(EVP_PKEY_RSA, NULL, &ptr, len);
1585         if (pkey == NULL) {
1586                 msyslog(LOG_ERR, "crypto_encrypt %s\n",
1587                     ERR_error_string(ERR_get_error(), NULL));
1588                 return (XEVNT_PUB);
1589         }
1590
1591         /*
1592          * Encrypt the cookie, encode in ASN.1 and sign.
1593          */
1594         tstamp = crypto_time();
1595         memset(vp, 0, sizeof(struct value));
1596         vp->tstamp = htonl(tstamp);
1597         vp->fstamp = hostval.tstamp;
1598         len = EVP_PKEY_size(pkey);
1599         vp->vallen = htonl(len);
1600         vp->ptr = emalloc(len);
1601         temp32 = htonl(*cookie);
1602         if (!RSA_public_encrypt(4, (u_char *)&temp32, vp->ptr,
1603             pkey->pkey.rsa, RSA_PKCS1_OAEP_PADDING)) {
1604                 msyslog(LOG_ERR, "crypto_encrypt %s\n",
1605                     ERR_error_string(ERR_get_error(), NULL));
1606                 EVP_PKEY_free(pkey);
1607                 return (XEVNT_CKY);
1608         }
1609         EVP_PKEY_free(pkey);
1610         vp->siglen = 0;
1611         if (tstamp == 0)
1612                 return (XEVNT_OK);
1613         vp->sig = emalloc(sign_siglen);
1614         EVP_SignInit(&ctx, sign_digest);
1615         EVP_SignUpdate(&ctx, (u_char *)&vp->tstamp, 12);
1616         EVP_SignUpdate(&ctx, vp->ptr, len);
1617         if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey))
1618                 vp->siglen = htonl(len);
1619         return (XEVNT_OK);
1620 }
1621
1622
1623 /*
1624  * crypto_ident - construct extension field for identity scheme
1625  *
1626  * This routine determines which identity scheme is in use and
1627  * constructs an extension field for that scheme.
1628  */
1629 u_int
1630 crypto_ident(
1631         struct peer *peer       /* peer structure pointer */
1632         )
1633 {
1634         char    filename[MAXFILENAME + 1];
1635
1636         /*
1637          * If the server identity has already been verified, no further
1638          * action is necessary. Otherwise, try to load the identity file
1639          * of the certificate issuer. If the issuer file is not found,
1640          * try the host file. If nothing found, declare a cryptobust.
1641          * Note we can't get here unless the trusted certificate has
1642          * been found and the CRYPTO_FLAG_VALID bit is set, so the
1643          * certificate issuer is valid.
1644          */
1645         if (peer->crypto & CRYPTO_FLAG_VRFY)
1646                 return (0);
1647
1648         if (peer->ident_pkey != NULL)
1649                 EVP_PKEY_free(peer->ident_pkey);
1650         if (peer->crypto & CRYPTO_FLAG_GQ) {
1651                 snprintf(filename, MAXFILENAME, "ntpkey_gq_%s",
1652                     peer->issuer);
1653                 peer->ident_pkey = crypto_key(filename, &peer->fstamp);
1654                 if (peer->ident_pkey != NULL)
1655                         return (CRYPTO_GQ);
1656
1657                 snprintf(filename, MAXFILENAME, "ntpkey_gq_%s",
1658                     sys_hostname);
1659                 peer->ident_pkey = crypto_key(filename, &peer->fstamp);
1660                 if (peer->ident_pkey != NULL)
1661                         return (CRYPTO_GQ);
1662         }
1663         if (peer->crypto & CRYPTO_FLAG_IFF) {
1664                 snprintf(filename, MAXFILENAME, "ntpkey_iff_%s",
1665                     peer->issuer);
1666                 peer->ident_pkey = crypto_key(filename, &peer->fstamp);
1667                 if (peer->ident_pkey != NULL)
1668                         return (CRYPTO_IFF);
1669
1670                 snprintf(filename, MAXFILENAME, "ntpkey_iff_%s",
1671                     sys_hostname);
1672                 peer->ident_pkey = crypto_key(filename, &peer->fstamp);
1673                 if (peer->ident_pkey != NULL)
1674                         return (CRYPTO_IFF);
1675         }
1676         if (peer->crypto & CRYPTO_FLAG_MV) {
1677                 snprintf(filename, MAXFILENAME, "ntpkey_mv_%s",
1678                     peer->issuer);
1679                 peer->ident_pkey = crypto_key(filename, &peer->fstamp);
1680                 if (peer->ident_pkey != NULL)
1681                         return (CRYPTO_MV);
1682
1683                 snprintf(filename, MAXFILENAME, "ntpkey_mv_%s",
1684                     sys_hostname);
1685                 peer->ident_pkey = crypto_key(filename, &peer->fstamp);
1686                 if (peer->ident_pkey != NULL)
1687                         return (CRYPTO_MV);
1688         }
1689
1690         /*
1691          * No compatible identity scheme is available. Use the default
1692          * TC scheme.
1693          */
1694         msyslog(LOG_INFO,
1695             "crypto_ident: no compatible identity scheme found");
1696         return (0);
1697 }
1698
1699
1700 /*
1701  * crypto_args - construct extension field from arguments
1702  *
1703  * This routine creates an extension field with current timestamps and
1704  * specified opcode, association ID and optional string. Note that the
1705  * extension field is created here, but freed after the crypto_xmit()
1706  * call in the protocol module.
1707  *
1708  * Returns extension field pointer (no errors).
1709  */
1710 struct exten *
1711 crypto_args(
1712         struct peer *peer,      /* peer structure pointer */
1713         u_int   opcode,         /* operation code */
1714         char    *str            /* argument string */
1715         )
1716 {
1717         tstamp_t tstamp;        /* NTP timestamp */
1718         struct exten *ep;       /* extension field pointer */
1719         u_int   len;            /* extension field length */
1720
1721         tstamp = crypto_time();
1722         len = sizeof(struct exten);
1723         if (str != NULL)
1724                 len += strlen(str);
1725         ep = emalloc(len);
1726         memset(ep, 0, len);
1727         ep->opcode = htonl(opcode + len);
1728
1729         /*
1730          * If a response, send our ID; if a request, send the
1731          * responder's ID.
1732          */
1733         if (opcode & CRYPTO_RESP)
1734                 ep->associd = htonl(peer->associd);
1735         else
1736                 ep->associd = htonl(peer->assoc);
1737         ep->tstamp = htonl(tstamp);
1738         ep->fstamp = hostval.tstamp;
1739         ep->vallen = 0;
1740         if (str != NULL) {
1741                 ep->vallen = htonl(strlen(str));
1742                 memcpy((char *)ep->pkt, str, strlen(str));
1743         } else {
1744                 ep->pkt[0] = peer->associd;
1745         }
1746         return (ep);
1747 }
1748
1749
1750 /*
1751  * crypto_send - construct extension field from value components
1752  *
1753  * Returns extension field length. Note: it is not polite to send a
1754  * nonempty signature with zero timestamp or a nonzero timestamp with
1755  * empty signature, but these rules are not enforced here.
1756  */
1757 u_int
1758 crypto_send(
1759         struct exten *ep,       /* extension field pointer */
1760         struct value *vp        /* value pointer */
1761         )
1762 {
1763         u_int   len, temp32;
1764         int     i;
1765
1766         /*
1767          * Copy data. If the data field is empty or zero length, encode
1768          * an empty value with length zero.
1769          */
1770         ep->tstamp = vp->tstamp;
1771         ep->fstamp = vp->fstamp;
1772         ep->vallen = vp->vallen;
1773         len = 12;
1774         temp32 = ntohl(vp->vallen);
1775         if (temp32 > 0 && vp->ptr != NULL)
1776                 memcpy(ep->pkt, vp->ptr, temp32);
1777
1778         /*
1779          * Copy signature. If the signature field is empty or zero
1780          * length, encode an empty signature with length zero.
1781          */
1782         i = (temp32 + 3) / 4;
1783         len += i * 4 + 4;
1784         ep->pkt[i++] = vp->siglen;
1785         temp32 = ntohl(vp->siglen);
1786         if (temp32 > 0 && vp->sig != NULL)
1787                 memcpy(&ep->pkt[i], vp->sig, temp32);
1788         len += temp32;
1789         return (len);
1790 }
1791
1792
1793 /*
1794  * crypto_update - compute new public value and sign extension fields
1795  *
1796  * This routine runs periodically, like once a day, and when something
1797  * changes. It updates the timestamps on three value structures and one
1798  * value structure list, then signs all the structures:
1799  *
1800  * hostval      host name (not signed)
1801  * pubkey       public key
1802  * cinfo        certificate info/value list
1803  * tai_leap     leapseconds file
1804  *
1805  * Filestamps are proventicated data, so this routine is run only when
1806  * the host has been synchronized to a proventicated source. Thus, the
1807  * timestamp is proventicated, too, and can be used to deflect
1808  * clogging attacks and even cook breakfast.
1809  *
1810  * Returns void (no errors)
1811  */
1812 void
1813 crypto_update(void)
1814 {
1815         EVP_MD_CTX ctx;         /* message digest context */
1816         struct cert_info *cp, *cpn, **zp; /* certificate info/value */
1817         char    statstr[NTP_MAXSTRLEN]; /* statistics for filegen */
1818         tstamp_t tstamp;        /* NTP timestamp */
1819         u_int   len;
1820
1821         if ((tstamp = crypto_time()) == 0)
1822                 return;
1823         hostval.tstamp = htonl(tstamp);
1824
1825         /*
1826          * Sign public key and timestamps. The filestamp is derived from
1827          * the host key file extension from wherever the file was
1828          * generated. 
1829          */
1830         if (pubkey.vallen != 0) {
1831                 pubkey.tstamp = hostval.tstamp;
1832                 pubkey.siglen = 0;
1833                 if (pubkey.sig == NULL)
1834                         pubkey.sig = emalloc(sign_siglen);
1835                 EVP_SignInit(&ctx, sign_digest);
1836                 EVP_SignUpdate(&ctx, (u_char *)&pubkey, 12);
1837                 EVP_SignUpdate(&ctx, pubkey.ptr, ntohl(pubkey.vallen));
1838                 if (EVP_SignFinal(&ctx, pubkey.sig, &len, sign_pkey))
1839                         pubkey.siglen = htonl(len);
1840         }
1841
1842         /*
1843          * Sign certificates and timestamps. The filestamp is derived
1844          * from the certificate file extension from wherever the file
1845          * was generated. At the same time expired certificates are
1846          * expunged.
1847          */
1848         zp = &cinfo;
1849         for (cp = cinfo; cp != NULL; cp = cpn) {
1850                 cpn = cp->link;
1851                 if (tstamp > cp->last) {
1852                         *zp = cpn;
1853                         cert_free(cp);
1854                 } else {
1855                         cp->cert.tstamp = hostval.tstamp;
1856                         cp->cert.siglen = 0;
1857                         if (cp->cert.sig == NULL)
1858                                 cp->cert.sig = emalloc(sign_siglen);
1859                         EVP_SignInit(&ctx, sign_digest);
1860                         EVP_SignUpdate(&ctx, (u_char *)&cp->cert, 12);
1861                         EVP_SignUpdate(&ctx, cp->cert.ptr,
1862                             ntohl(cp->cert.vallen));
1863                         if (EVP_SignFinal(&ctx, cp->cert.sig, &len,
1864                             sign_pkey))
1865                                 cp->cert.siglen = htonl(len);
1866                         zp = &cp->link;
1867                 }
1868         }
1869
1870         /*
1871          * Sign leapseconds table and timestamps. The filestamp is
1872          * derived from the leapsecond file extension from wherever the
1873          * file was generated.
1874          */
1875         if (tai_leap.vallen != 0) {
1876                 tai_leap.tstamp = hostval.tstamp;
1877                 tai_leap.siglen = 0;
1878                 if (tai_leap.sig == NULL)
1879                         tai_leap.sig = emalloc(sign_siglen);
1880                 EVP_SignInit(&ctx, sign_digest);
1881                 EVP_SignUpdate(&ctx, (u_char *)&tai_leap, 12);
1882                 EVP_SignUpdate(&ctx, tai_leap.ptr,
1883                     ntohl(tai_leap.vallen));
1884                 if (EVP_SignFinal(&ctx, tai_leap.sig, &len, sign_pkey))
1885                         tai_leap.siglen = htonl(len);
1886         }
1887         sprintf(statstr, "update ts %u", ntohl(hostval.tstamp)); 
1888         record_crypto_stats(NULL, statstr);
1889 #ifdef DEBUG
1890         if (debug)
1891                 printf("crypto_update: %s\n", statstr);
1892 #endif
1893 }
1894
1895
1896 /*
1897  * value_free - free value structure components.
1898  *
1899  * Returns void (no errors)
1900  */
1901 void
1902 value_free(
1903         struct value *vp        /* value structure */
1904         )
1905 {
1906         if (vp->ptr != NULL)
1907                 free(vp->ptr);
1908         if (vp->sig != NULL)
1909                 free(vp->sig);
1910         memset(vp, 0, sizeof(struct value));
1911 }
1912
1913
1914 /*
1915  * crypto_time - returns current NTP time in seconds.
1916  */
1917 tstamp_t
1918 crypto_time()
1919 {
1920         l_fp    tstamp;         /* NTP time */  L_CLR(&tstamp);
1921
1922         L_CLR(&tstamp);
1923         if (sys_leap != LEAP_NOTINSYNC)
1924                 get_systime(&tstamp);
1925         return (tstamp.l_ui);
1926 }
1927
1928
1929 /*
1930  * asn2ntp - convert ASN1_TIME time structure to NTP time in seconds.
1931  */
1932 u_long
1933 asn2ntp (
1934         ASN1_TIME *asn1time     /* pointer to ASN1_TIME structure */
1935         )
1936 {
1937         char    *v;             /* pointer to ASN1_TIME string */
1938         struct  tm tm;          /* used to convert to NTP time */
1939
1940         /*
1941          * Extract time string YYMMDDHHMMSSZ from ASN1 time structure.
1942          * Note that the YY, MM, DD fields start with one, the HH, MM,
1943          * SS fiels start with zero and the Z character should be 'Z'
1944          * for UTC. Also note that years less than 50 map to years
1945          * greater than 100. Dontcha love ASN.1? Better than MIL-188.
1946          */
1947         if (asn1time->length > 13)
1948                 return ((u_long)(~0));  /* We can't use -1 here. It's invalid */
1949         v = (char *)asn1time->data;
1950         tm.tm_year = (v[0] - '0') * 10 + v[1] - '0';
1951         if (tm.tm_year < 50)
1952                 tm.tm_year += 100;
1953         tm.tm_mon = (v[2] - '0') * 10 + v[3] - '0' - 1;
1954         tm.tm_mday = (v[4] - '0') * 10 + v[5] - '0';
1955         tm.tm_hour = (v[6] - '0') * 10 + v[7] - '0';
1956         tm.tm_min = (v[8] - '0') * 10 + v[9] - '0';
1957         tm.tm_sec = (v[10] - '0') * 10 + v[11] - '0';
1958         tm.tm_wday = 0;
1959         tm.tm_yday = 0;
1960         tm.tm_isdst = 0;
1961         return (timegm(&tm) + JAN_1970);
1962 }
1963
1964
1965 /*
1966  * bigdig() - compute a BIGNUM MD5 hash of a BIGNUM number.
1967  */
1968 static int
1969 bighash(
1970         BIGNUM  *bn,            /* BIGNUM * from */
1971         BIGNUM  *bk             /* BIGNUM * to */
1972         )
1973 {
1974         EVP_MD_CTX ctx;         /* message digest context */
1975         u_char dgst[EVP_MAX_MD_SIZE]; /* message digest */
1976         u_char  *ptr;           /* a BIGNUM as binary string */
1977         u_int   len;
1978
1979         len = BN_num_bytes(bn);
1980         ptr = emalloc(len);
1981         BN_bn2bin(bn, ptr);
1982         EVP_DigestInit(&ctx, EVP_md5());
1983         EVP_DigestUpdate(&ctx, ptr, len);
1984         EVP_DigestFinal(&ctx, dgst, &len);
1985         BN_bin2bn(dgst, len, bk);
1986         return (1);
1987 }
1988
1989
1990 /*
1991  ***********************************************************************
1992  *                                                                     *
1993  * The following routines implement the Schnorr (IFF) identity scheme  *
1994  *                                                                     *
1995  ***********************************************************************
1996  *
1997  * The Schnorr (IFF) identity scheme is intended for use when
1998  * the ntp-genkeys program does not generate the certificates used in
1999  * the protocol and the group key cannot be conveyed in the certificate
2000  * itself. For this purpose, new generations of IFF values must be
2001  * securely transmitted to all members of the group before use. The
2002  * scheme is self contained and independent of new generations of host
2003  * keys, sign keys and certificates.
2004  *
2005  * The IFF identity scheme is based on DSA cryptography and algorithms
2006  * described in Stinson p. 285. The IFF values hide in a DSA cuckoo
2007  * structure, but only the primes and generator are used. The p is a
2008  * 512-bit prime, q a 160-bit prime that divides p - 1 and is a qth root
2009  * of 1 mod p; that is, g^q = 1 mod p. The TA rolls primvate random
2010  * group key b disguised as a DSA structure member, then computes public
2011  * key g^(q - b). These values are shared only among group members and
2012  * never revealed in messages. Alice challenges Bob to confirm identity
2013  * using the protocol described below.
2014  *
2015  * How it works
2016  *
2017  * The scheme goes like this. Both Alice and Bob have the public primes
2018  * p, q and generator g. The TA gives private key b to Bob and public
2019  * key v = g^(q - a) mod p to Alice.
2020  *
2021  * Alice rolls new random challenge r and sends to Bob in the IFF
2022  * request message. Bob rolls new random k, then computes y = k + b r
2023  * mod q and x = g^k mod p and sends (y, hash(x)) to Alice in the
2024  * response message. Besides making the response shorter, the hash makes
2025  * it effectivey impossible for an intruder to solve for b by observing
2026  * a number of these messages.
2027  * 
2028  * Alice receives the response and computes g^y v^r mod p. After a bit
2029  * of algebra, this simplifies to g^k. If the hash of this result
2030  * matches hash(x), Alice knows that Bob has the group key b. The signed
2031  * response binds this knowledge to Bob's private key and the public key
2032  * previously received in his certificate.
2033  *
2034  * crypto_alice - construct Alice's challenge in IFF scheme
2035  *
2036  * Returns
2037  * XEVNT_OK     success
2038  * XEVNT_PUB    bad or missing public key
2039  * XEVNT_ID     bad or missing identity parameters
2040  */
2041 static int
2042 crypto_alice(
2043         struct peer *peer,      /* peer pointer */
2044         struct value *vp        /* value pointer */
2045         )
2046 {
2047         DSA     *dsa;           /* IFF parameters */
2048         BN_CTX  *bctx;          /* BIGNUM context */
2049         EVP_MD_CTX ctx;         /* signature context */
2050         tstamp_t tstamp;
2051         u_int   len;
2052
2053         /*
2054          * The identity parameters must have correct format and content.
2055          */
2056         if (peer->ident_pkey == NULL)
2057                 return (XEVNT_ID);
2058         if ((dsa = peer->ident_pkey->pkey.dsa) == NULL) {
2059                 msyslog(LOG_INFO, "crypto_alice: defective key");
2060                 return (XEVNT_PUB);
2061         }
2062
2063         /*
2064          * Roll new random r (0 < r < q). The OpenSSL library has a bug
2065          * omitting BN_rand_range, so we have to do it the hard way.
2066          */
2067         bctx = BN_CTX_new();
2068         len = BN_num_bytes(dsa->q);
2069         if (peer->iffval != NULL)
2070                 BN_free(peer->iffval);
2071         peer->iffval = BN_new();
2072         BN_rand(peer->iffval, len * 8, -1, 1);  /* r */
2073         BN_mod(peer->iffval, peer->iffval, dsa->q, bctx);
2074         BN_CTX_free(bctx);
2075
2076         /*
2077          * Sign and send to Bob. The filestamp is from the local file.
2078          */
2079         tstamp = crypto_time();
2080         memset(vp, 0, sizeof(struct value));
2081         vp->tstamp = htonl(tstamp);
2082         vp->fstamp = htonl(peer->fstamp);
2083         vp->vallen = htonl(len);
2084         vp->ptr = emalloc(len);
2085         BN_bn2bin(peer->iffval, vp->ptr);
2086         vp->siglen = 0;
2087         if (tstamp == 0)
2088                 return (XEVNT_OK);
2089         vp->sig = emalloc(sign_siglen);
2090         EVP_SignInit(&ctx, sign_digest);
2091         EVP_SignUpdate(&ctx, (u_char *)&vp->tstamp, 12);
2092         EVP_SignUpdate(&ctx, vp->ptr, len);
2093         if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey))
2094                 vp->siglen = htonl(len);
2095         return (XEVNT_OK);
2096 }
2097
2098
2099 /*
2100  * crypto_bob - construct Bob's response to Alice's challenge
2101  *
2102  * Returns
2103  * XEVNT_OK     success
2104  * XEVNT_PUB    bad or missing public key
2105  */
2106 static int
2107 crypto_bob(
2108         struct exten *ep,       /* extension pointer */
2109         struct value *vp        /* value pointer */
2110         )
2111 {
2112         DSA     *dsa;           /* IFF parameters */
2113         DSA_SIG *sdsa;          /* DSA signature context fake */
2114         BN_CTX  *bctx;          /* BIGNUM context */
2115         EVP_MD_CTX ctx;         /* signature context */
2116         tstamp_t tstamp;        /* NTP timestamp */
2117         BIGNUM  *bn, *bk, *r;
2118         u_char  *ptr;
2119         u_int   len;
2120
2121         /*
2122          * If the IFF parameters are not valid, something awful
2123          * happened or we are being tormented.
2124          */
2125         if (!(crypto_flags & CRYPTO_FLAG_IFF)) {
2126                 msyslog(LOG_INFO, "crypto_bob: scheme unavailable");
2127                 return (XEVNT_PUB);
2128         }
2129         dsa = iffpar_pkey->pkey.dsa;
2130
2131         /*
2132          * Extract r from the challenge.
2133          */
2134         len = ntohl(ep->vallen);
2135         if ((r = BN_bin2bn((u_char *)ep->pkt, len, NULL)) == NULL) {
2136                 msyslog(LOG_ERR, "crypto_bob %s\n",
2137                     ERR_error_string(ERR_get_error(), NULL));
2138                 return (XEVNT_PUB);
2139         }
2140
2141         /*
2142          * Bob rolls random k (0 < k < q), computes y = k + b r mod q
2143          * and x = g^k mod p, then sends (y, hash(x)) to Alice.
2144          */
2145         bctx = BN_CTX_new(); bk = BN_new(); bn = BN_new();
2146         sdsa = DSA_SIG_new();
2147         BN_rand(bk, len * 8, -1, 1);            /* k */
2148         BN_mod_mul(bn, dsa->priv_key, r, dsa->q, bctx); /* b r mod q */
2149         BN_add(bn, bn, bk);
2150         BN_mod(bn, bn, dsa->q, bctx);           /* k + b r mod q */
2151         sdsa->r = BN_dup(bn);
2152         BN_mod_exp(bk, dsa->g, bk, dsa->p, bctx); /* g^k mod p */
2153         bighash(bk, bk);
2154         sdsa->s = BN_dup(bk);
2155         BN_CTX_free(bctx);
2156         BN_free(r); BN_free(bn); BN_free(bk);
2157
2158         /*
2159          * Encode the values in ASN.1 and sign.
2160          */
2161         tstamp = crypto_time();
2162         memset(vp, 0, sizeof(struct value));
2163         vp->tstamp = htonl(tstamp);
2164         vp->fstamp = htonl(if_fstamp);
2165         len = i2d_DSA_SIG(sdsa, NULL);
2166         if (len <= 0) {
2167                 msyslog(LOG_ERR, "crypto_bob %s\n",
2168                     ERR_error_string(ERR_get_error(), NULL));
2169                 DSA_SIG_free(sdsa);
2170                 return (XEVNT_PUB);
2171         }
2172         vp->vallen = htonl(len);
2173         ptr = emalloc(len);
2174         vp->ptr = ptr;
2175         i2d_DSA_SIG(sdsa, &ptr);
2176         DSA_SIG_free(sdsa);
2177         vp->siglen = 0;
2178         if (tstamp == 0)
2179                 return (XEVNT_OK);
2180         vp->sig = emalloc(sign_siglen);
2181         EVP_SignInit(&ctx, sign_digest);
2182         EVP_SignUpdate(&ctx, (u_char *)&vp->tstamp, 12);
2183         EVP_SignUpdate(&ctx, vp->ptr, len);
2184         if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey))
2185                 vp->siglen = htonl(len);
2186         return (XEVNT_OK);
2187 }
2188
2189
2190 /*
2191  * crypto_iff - verify Bob's response to Alice's challenge
2192  *
2193  * Returns
2194  * XEVNT_OK     success
2195  * XEVNT_PUB    bad or missing public key
2196  * XEVNT_FSP    bad filestamp
2197  * XEVNT_ID     bad or missing identity parameters
2198  */
2199 int
2200 crypto_iff(
2201         struct exten *ep,       /* extension pointer */
2202         struct peer *peer       /* peer structure pointer */
2203         )
2204 {
2205         DSA     *dsa;           /* IFF parameters */
2206         BN_CTX  *bctx;          /* BIGNUM context */
2207         DSA_SIG *sdsa;          /* DSA parameters */
2208         BIGNUM  *bn, *bk;
2209         u_int   len;
2210         const u_char    *ptr;
2211         int     temp;
2212
2213         /*
2214          * If the IFF parameters are not valid or no challenge was sent,
2215          * something awful happened or we are being tormented.
2216          */
2217         if (peer->ident_pkey == NULL) {
2218                 msyslog(LOG_INFO, "crypto_iff: scheme unavailable");
2219                 return (XEVNT_PUB);
2220         }
2221         if (ntohl(ep->fstamp) != peer->fstamp) {
2222                 msyslog(LOG_INFO, "crypto_iff: invalid filestamp %u",
2223                     ntohl(ep->fstamp));
2224                 return (XEVNT_FSP);
2225         }
2226         if ((dsa = peer->ident_pkey->pkey.dsa) == NULL) {
2227                 msyslog(LOG_INFO, "crypto_iff: defective key");
2228                 return (XEVNT_PUB);
2229         }
2230         if (peer->iffval == NULL) {
2231                 msyslog(LOG_INFO, "crypto_iff: missing challenge");
2232                 return (XEVNT_PUB);
2233         }
2234
2235         /*
2236          * Extract the k + b r and g^k values from the response.
2237          */
2238         bctx = BN_CTX_new(); bk = BN_new(); bn = BN_new();
2239         len = ntohl(ep->vallen);
2240         ptr = (const u_char *)ep->pkt;
2241         if ((sdsa = d2i_DSA_SIG(NULL, &ptr, len)) == NULL) {
2242                 msyslog(LOG_ERR, "crypto_iff %s\n",
2243                     ERR_error_string(ERR_get_error(), NULL));
2244                 return (XEVNT_PUB);
2245         }
2246
2247         /*
2248          * Compute g^(k + b r) g^(q - b)r mod p.
2249          */
2250         BN_mod_exp(bn, dsa->pub_key, peer->iffval, dsa->p, bctx);
2251         BN_mod_exp(bk, dsa->g, sdsa->r, dsa->p, bctx);
2252         BN_mod_mul(bn, bn, bk, dsa->p, bctx);
2253
2254         /*
2255          * Verify the hash of the result matches hash(x).
2256          */
2257         bighash(bn, bn);
2258         temp = BN_cmp(bn, sdsa->s);
2259         BN_free(bn); BN_free(bk); BN_CTX_free(bctx);
2260         BN_free(peer->iffval);
2261         peer->iffval = NULL;
2262         DSA_SIG_free(sdsa);
2263         if (temp == 0)
2264                 return (XEVNT_OK);
2265         else
2266                 return (XEVNT_ID);
2267 }
2268
2269
2270 /*
2271  ***********************************************************************
2272  *                                                                     *
2273  * The following routines implement the Guillou-Quisquater (GQ)        *
2274  * identity scheme                                                     *
2275  *                                                                     *
2276  ***********************************************************************
2277  *
2278  * The Guillou-Quisquater (GQ) identity scheme is intended for use when
2279  * the ntp-genkeys program generates the certificates used in the
2280  * protocol and the group key can be conveyed in a certificate extension
2281  * field. The scheme is self contained and independent of new
2282  * generations of host keys, sign keys and certificates.
2283  *
2284  * The GQ identity scheme is based on RSA cryptography and algorithms
2285  * described in Stinson p. 300 (with errors). The GQ values hide in a
2286  * RSA cuckoo structure, but only the modulus is used. The 512-bit
2287  * public modulus is n = p q, where p and q are secret large primes. The
2288  * TA rolls random group key b disguised as a RSA structure member.
2289  * Except for the public key, these values are shared only among group
2290  * members and never revealed in messages.
2291  *
2292  * When rolling new certificates, Bob recomputes the private and
2293  * public keys. The private key u is a random roll, while the public key
2294  * is the inverse obscured by the group key v = (u^-1)^b. These values
2295  * replace the private and public keys normally generated by the RSA
2296  * scheme. Alice challenges Bob to confirm identity using the protocol
2297  * described below.
2298  *
2299  * How it works
2300  *
2301  * The scheme goes like this. Both Alice and Bob have the same modulus n
2302  * and some random b as the group key. These values are computed and
2303  * distributed in advance via secret means, although only the group key
2304  * b is truly secret. Each has a private random private key u and public
2305  * key (u^-1)^b, although not necessarily the same ones. Bob and Alice
2306  * can regenerate the key pair from time to time without affecting
2307  * operations. The public key is conveyed on the certificate in an
2308  * extension field; the private key is never revealed.
2309  *
2310  * Alice rolls new random challenge r and sends to Bob in the GQ
2311  * request message. Bob rolls new random k, then computes y = k u^r mod
2312  * n and x = k^b mod n and sends (y, hash(x)) to Alice in the response
2313  * message. Besides making the response shorter, the hash makes it
2314  * effectivey impossible for an intruder to solve for b by observing
2315  * a number of these messages.
2316  * 
2317  * Alice receives the response and computes y^b v^r mod n. After a bit
2318  * of algebra, this simplifies to k^b. If the hash of this result
2319  * matches hash(x), Alice knows that Bob has the group key b. The signed
2320  * response binds this knowledge to Bob's private key and the public key
2321  * previously received in his certificate.
2322  *
2323  * crypto_alice2 - construct Alice's challenge in GQ scheme
2324  *
2325  * Returns
2326  * XEVNT_OK     success
2327  * XEVNT_PUB    bad or missing public key
2328  * XEVNT_ID     bad or missing identity parameters
2329  */
2330 static int
2331 crypto_alice2(
2332         struct peer *peer,      /* peer pointer */
2333         struct value *vp        /* value pointer */
2334         )
2335 {
2336         RSA     *rsa;           /* GQ parameters */
2337         BN_CTX  *bctx;          /* BIGNUM context */
2338         EVP_MD_CTX ctx;         /* signature context */
2339         tstamp_t tstamp;
2340         u_int   len;
2341
2342         /*
2343          * The identity parameters must have correct format and content.
2344          */
2345         if (peer->ident_pkey == NULL)
2346                 return (XEVNT_ID);
2347         if ((rsa = peer->ident_pkey->pkey.rsa) == NULL) {
2348                 msyslog(LOG_INFO, "crypto_alice2: defective key");
2349                 return (XEVNT_PUB);
2350         }
2351
2352         /*
2353          * Roll new random r (0 < r < n). The OpenSSL library has a bug
2354          * omitting BN_rand_range, so we have to do it the hard way.
2355          */
2356         bctx = BN_CTX_new();
2357         len = BN_num_bytes(rsa->n);
2358         if (peer->iffval != NULL)
2359                 BN_free(peer->iffval);
2360         peer->iffval = BN_new();
2361         BN_rand(peer->iffval, len * 8, -1, 1);  /* r mod n */
2362         BN_mod(peer->iffval, peer->iffval, rsa->n, bctx);
2363         BN_CTX_free(bctx);
2364
2365         /*
2366          * Sign and send to Bob. The filestamp is from the local file.
2367          */
2368         tstamp = crypto_time();
2369         memset(vp, 0, sizeof(struct value));
2370         vp->tstamp = htonl(tstamp);
2371         vp->fstamp = htonl(peer->fstamp);
2372         vp->vallen = htonl(len);
2373         vp->ptr = emalloc(len);
2374         BN_bn2bin(peer->iffval, vp->ptr);
2375         vp->siglen = 0;
2376         if (tstamp == 0)
2377                 return (XEVNT_OK);
2378         vp->sig = emalloc(sign_siglen);
2379         EVP_SignInit(&ctx, sign_digest);
2380         EVP_SignUpdate(&ctx, (u_char *)&vp->tstamp, 12);
2381         EVP_SignUpdate(&ctx, vp->ptr, len);
2382         if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey))
2383                 vp->siglen = htonl(len);
2384         return (XEVNT_OK);
2385 }
2386
2387
2388 /*
2389  * crypto_bob2 - construct Bob's response to Alice's challenge
2390  *
2391  * Returns
2392  * XEVNT_OK     success
2393  * XEVNT_PUB    bad or missing public key
2394  */
2395 static int
2396 crypto_bob2(
2397         struct exten *ep,       /* extension pointer */
2398         struct value *vp        /* value pointer */
2399         )
2400 {
2401         RSA     *rsa;           /* GQ parameters */
2402         DSA_SIG *sdsa;          /* DSA parameters */
2403         BN_CTX  *bctx;          /* BIGNUM context */
2404         EVP_MD_CTX ctx;         /* signature context */
2405         tstamp_t tstamp;        /* NTP timestamp */
2406         BIGNUM  *r, *k, *g, *y;
2407         u_char  *ptr;
2408         u_int   len;
2409
2410         /*
2411          * If the GQ parameters are not valid, something awful
2412          * happened or we are being tormented.
2413          */
2414         if (!(crypto_flags & CRYPTO_FLAG_GQ)) {
2415                 msyslog(LOG_INFO, "crypto_bob2: scheme unavailable");
2416                 return (XEVNT_PUB);
2417         }
2418         rsa = gqpar_pkey->pkey.rsa;
2419
2420         /*
2421          * Extract r from the challenge.
2422          */
2423         len = ntohl(ep->vallen);
2424         if ((r = BN_bin2bn((u_char *)ep->pkt, len, NULL)) == NULL) {
2425                 msyslog(LOG_ERR, "crypto_bob2 %s\n",
2426                     ERR_error_string(ERR_get_error(), NULL));
2427                 return (XEVNT_PUB);
2428         }
2429
2430         /*
2431          * Bob rolls random k (0 < k < n), computes y = k u^r mod n and
2432          * x = k^b mod n, then sends (y, hash(x)) to Alice. 
2433          */
2434         bctx = BN_CTX_new(); k = BN_new(); g = BN_new(); y = BN_new();
2435         sdsa = DSA_SIG_new();
2436         BN_rand(k, len * 8, -1, 1);             /* k */
2437         BN_mod(k, k, rsa->n, bctx);
2438         BN_mod_exp(y, rsa->p, r, rsa->n, bctx); /* u^r mod n */
2439         BN_mod_mul(y, k, y, rsa->n, bctx);      /* k u^r mod n */
2440         sdsa->r = BN_dup(y);
2441         BN_mod_exp(g, k, rsa->e, rsa->n, bctx); /* k^b mod n */
2442         bighash(g, g);
2443         sdsa->s = BN_dup(g);
2444         BN_CTX_free(bctx);
2445         BN_free(r); BN_free(k); BN_free(g); BN_free(y);
2446  
2447         /*
2448          * Encode the values in ASN.1 and sign.
2449          */
2450         tstamp = crypto_time();
2451         memset(vp, 0, sizeof(struct value));
2452         vp->tstamp = htonl(tstamp);
2453         vp->fstamp = htonl(gq_fstamp);
2454         len = i2d_DSA_SIG(sdsa, NULL);
2455         if (len <= 0) {
2456                 msyslog(LOG_ERR, "crypto_bob2 %s\n",
2457                     ERR_error_string(ERR_get_error(), NULL));
2458                 DSA_SIG_free(sdsa);
2459                 return (XEVNT_PUB);
2460         }
2461         vp->vallen = htonl(len);
2462         ptr = emalloc(len);
2463         vp->ptr = ptr;
2464         i2d_DSA_SIG(sdsa, &ptr);
2465         DSA_SIG_free(sdsa);
2466         vp->siglen = 0;
2467         if (tstamp == 0)
2468                 return (XEVNT_OK);
2469         vp->sig = emalloc(sign_siglen);
2470         EVP_SignInit(&ctx, sign_digest);
2471         EVP_SignUpdate(&ctx, (u_char *)&vp->tstamp, 12);
2472         EVP_SignUpdate(&ctx, vp->ptr, len);
2473         if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey))
2474                 vp->siglen = htonl(len);
2475         return (XEVNT_OK);
2476 }
2477
2478
2479 /*
2480  * crypto_gq - verify Bob's response to Alice's challenge
2481  *
2482  * Returns
2483  * XEVNT_OK     success
2484  * XEVNT_PUB    bad or missing public key
2485  * XEVNT_FSP    bad filestamp
2486  * XEVNT_ID     bad or missing identity parameters
2487  */
2488 int
2489 crypto_gq(
2490         struct exten *ep,       /* extension pointer */
2491         struct peer *peer       /* peer structure pointer */
2492         )
2493 {
2494         RSA     *rsa;           /* GQ parameters */
2495         BN_CTX  *bctx;          /* BIGNUM context */
2496         DSA_SIG *sdsa;          /* RSA signature context fake */
2497         BIGNUM  *y, *v;
2498         const u_char    *ptr;
2499         u_int   len;
2500         int     temp;
2501
2502         /*
2503          * If the GQ parameters are not valid or no challenge was sent,
2504          * something awful happened or we are being tormented.
2505          */
2506         if (peer->ident_pkey == NULL) {
2507                 msyslog(LOG_INFO, "crypto_gq: scheme unavailable");
2508                 return (XEVNT_PUB);
2509         }
2510         if (ntohl(ep->fstamp) != peer->fstamp) {
2511                 msyslog(LOG_INFO, "crypto_gq: invalid filestamp %u",
2512                     ntohl(ep->fstamp));
2513                 return (XEVNT_FSP);
2514         }
2515         if ((rsa = peer->ident_pkey->pkey.rsa) == NULL) {
2516                 msyslog(LOG_INFO, "crypto_gq: defective key");
2517                 return (XEVNT_PUB);
2518         }
2519         if (peer->iffval == NULL) {
2520                 msyslog(LOG_INFO, "crypto_gq: missing challenge");
2521                 return (XEVNT_PUB);
2522         }
2523
2524         /*
2525          * Extract the y = k u^r and hash(x = k^b) values from the
2526          * response.
2527          */
2528         bctx = BN_CTX_new(); y = BN_new(); v = BN_new();
2529         len = ntohl(ep->vallen);
2530         ptr = (const u_char *)ep->pkt;
2531         if ((sdsa = d2i_DSA_SIG(NULL, &ptr, len)) == NULL) {
2532                 msyslog(LOG_ERR, "crypto_gq %s\n",
2533                     ERR_error_string(ERR_get_error(), NULL));
2534                 return (XEVNT_PUB);
2535         }
2536
2537         /*
2538          * Compute v^r y^b mod n.
2539          */
2540         BN_mod_exp(v, peer->grpkey, peer->iffval, rsa->n, bctx);
2541                                                 /* v^r mod n */
2542         BN_mod_exp(y, sdsa->r, rsa->e, rsa->n, bctx); /* y^b mod n */
2543         BN_mod_mul(y, v, y, rsa->n, bctx);      /* v^r y^b mod n */
2544
2545         /*
2546          * Verify the hash of the result matches hash(x).
2547          */
2548         bighash(y, y);
2549         temp = BN_cmp(y, sdsa->s);
2550         BN_CTX_free(bctx); BN_free(y); BN_free(v);
2551         BN_free(peer->iffval);
2552         peer->iffval = NULL;
2553         DSA_SIG_free(sdsa);
2554         if (temp == 0)
2555                 return (XEVNT_OK);
2556         else
2557                 return (XEVNT_ID);
2558 }
2559
2560
2561 /*
2562  ***********************************************************************
2563  *                                                                     *
2564  * The following routines implement the Mu-Varadharajan (MV) identity  *
2565  * scheme                                                              *
2566  *                                                                     *
2567  ***********************************************************************
2568  */
2569 /*
2570  * The Mu-Varadharajan (MV) cryptosystem was originally intended when
2571  * servers broadcast messages to clients, but clients never send
2572  * messages to servers. There is one encryption key for the server and a
2573  * separate decryption key for each client. It operated something like a
2574  * pay-per-view satellite broadcasting system where the session key is
2575  * encrypted by the broadcaster and the decryption keys are held in a
2576  * tamperproof set-top box.
2577  *
2578  * The MV parameters and private encryption key hide in a DSA cuckoo
2579  * structure which uses the same parameters, but generated in a
2580  * different way. The values are used in an encryption scheme similar to
2581  * El Gamal cryptography and a polynomial formed from the expansion of
2582  * product terms (x - x[j]), as described in Mu, Y., and V.
2583  * Varadharajan: Robust and Secure Broadcasting, Proc. Indocrypt 2001,
2584  * 223-231. The paper has significant errors and serious omissions.
2585  *
2586  * Let q be the product of n distinct primes s'[j] (j = 1...n), where
2587  * each s'[j] has m significant bits. Let p be a prime p = 2 * q + 1, so
2588  * that q and each s'[j] divide p - 1 and p has M = n * m + 1
2589  * significant bits. The elements x mod q of Zq with the elements 2 and
2590  * the primes removed form a field Zq* valid for polynomial arithetic.
2591  * Let g be a generator of Zp; that is, gcd(g, p - 1) = 1 and g^q = 1
2592  * mod p. We expect M to be in the 500-bit range and n relatively small,
2593  * like 25, so the likelihood of a randomly generated element of x mod q
2594  * of Zq colliding with a factor of p - 1 is very small and can be
2595  * avoided. Associated with each s'[j] is an element s[j] such that s[j]
2596  * s'[j] = s'[j] mod q. We find s[j] as the quotient (q + s'[j]) /
2597  * s'[j]. These are the parameters of the scheme and they are expensive
2598  * to compute.
2599  *
2600  * We set up an instance of the scheme as follows. A set of random
2601  * values x[j] mod q (j = 1...n), are generated as the zeros of a
2602  * polynomial of order n. The product terms (x - x[j]) are expanded to
2603  * form coefficients a[i] mod q (i = 0...n) in powers of x. These are
2604  * used as exponents of the generator g mod p to generate the private
2605  * encryption key A. The pair (gbar, ghat) of public server keys and the
2606  * pairs (xbar[j], xhat[j]) (j = 1...n) of private client keys are used
2607  * to construct the decryption keys. The devil is in the details.
2608  *
2609  * The distinguishing characteristic of this scheme is the capability to
2610  * revoke keys. Included in the calculation of E, gbar and ghat is the
2611  * product s = prod(s'[j]) (j = 1...n) above. If the factor s'[j] is
2612  * subsequently removed from the product and E, gbar and ghat
2613  * recomputed, the jth client will no longer be able to compute E^-1 and
2614  * thus unable to decrypt the block.
2615  *
2616  * How it works
2617  *
2618  * The scheme goes like this. Bob has the server values (p, A, q, gbar,
2619  * ghat) and Alice the client values (p, xbar, xhat).
2620  *
2621  * Alice rolls new random challenge r (0 < r < p) and sends to Bob in
2622  * the MV request message. Bob rolls new random k (0 < k < q), encrypts
2623  * y = A^k mod p (a permutation) and sends (hash(y), gbar^k, ghat^k) to
2624  * Alice.
2625  * 
2626  * Alice receives the response and computes the decryption key (the
2627  * inverse permutation) from previously obtained (xbar, xhat) and
2628  * (gbar^k, ghat^k) in the message. She computes the inverse, which is
2629  * unique by reasons explained in the ntp-keygen.c program sources. If
2630  * the hash of this result matches hash(y), Alice knows that Bob has the
2631  * group key b. The signed response binds this knowledge to Bob's
2632  * private key and the public key previously received in his
2633  * certificate.
2634  *
2635  * crypto_alice3 - construct Alice's challenge in MV scheme
2636  *
2637  * Returns
2638  * XEVNT_OK     success
2639  * XEVNT_PUB    bad or missing public key
2640  * XEVNT_ID     bad or missing identity parameters
2641  */
2642 static int
2643 crypto_alice3(
2644         struct peer *peer,      /* peer pointer */
2645         struct value *vp        /* value pointer */
2646         )
2647 {
2648         DSA     *dsa;           /* MV parameters */
2649         BN_CTX  *bctx;          /* BIGNUM context */
2650         EVP_MD_CTX ctx;         /* signature context */
2651         tstamp_t tstamp;
2652         u_int   len;
2653
2654         /*
2655          * The identity parameters must have correct format and content.
2656          */
2657         if (peer->ident_pkey == NULL)
2658                 return (XEVNT_ID);
2659         if ((dsa = peer->ident_pkey->pkey.dsa) == NULL) {
2660                 msyslog(LOG_INFO, "crypto_alice3: defective key");
2661                 return (XEVNT_PUB);
2662         }
2663
2664         /*
2665          * Roll new random r (0 < r < q). The OpenSSL library has a bug
2666          * omitting BN_rand_range, so we have to do it the hard way.
2667          */
2668         bctx = BN_CTX_new();
2669         len = BN_num_bytes(dsa->p);
2670         if (peer->iffval != NULL)
2671                 BN_free(peer->iffval);
2672         peer->iffval = BN_new();
2673         BN_rand(peer->iffval, len * 8, -1, 1);  /* r */
2674         BN_mod(peer->iffval, peer->iffval, dsa->p, bctx);
2675         BN_CTX_free(bctx);
2676
2677         /*
2678          * Sign and send to Bob. The filestamp is from the local file.
2679          */
2680         tstamp = crypto_time();
2681         memset(vp, 0, sizeof(struct value));
2682         vp->tstamp = htonl(tstamp);
2683         vp->fstamp = htonl(peer->fstamp);
2684         vp->vallen = htonl(len);
2685         vp->ptr = emalloc(len);
2686         BN_bn2bin(peer->iffval, vp->ptr);
2687         vp->siglen = 0;
2688         if (tstamp == 0)
2689                 return (XEVNT_OK);
2690         vp->sig = emalloc(sign_siglen);
2691         EVP_SignInit(&ctx, sign_digest);
2692         EVP_SignUpdate(&ctx, (u_char *)&vp->tstamp, 12);
2693         EVP_SignUpdate(&ctx, vp->ptr, len);
2694         if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey))
2695                 vp->siglen = htonl(len);
2696         return (XEVNT_OK);
2697 }
2698
2699
2700 /*
2701  * crypto_bob3 - construct Bob's response to Alice's challenge
2702  *
2703  * Returns
2704  * XEVNT_OK     success
2705  * XEVNT_PUB    bad or missing public key
2706  */
2707 static int
2708 crypto_bob3(
2709         struct exten *ep,       /* extension pointer */
2710         struct value *vp        /* value pointer */
2711         )
2712 {
2713         DSA     *dsa;           /* MV parameters */
2714         DSA     *sdsa;          /* DSA signature context fake */
2715         BN_CTX  *bctx;          /* BIGNUM context */
2716         EVP_MD_CTX ctx;         /* signature context */
2717         tstamp_t tstamp;        /* NTP timestamp */
2718         BIGNUM  *r, *k, *u;
2719         u_char  *ptr;
2720         u_int   len;
2721
2722         /*
2723          * If the MV parameters are not valid, something awful
2724          * happened or we are being tormented.
2725          */
2726         if (!(crypto_flags & CRYPTO_FLAG_MV)) {
2727                 msyslog(LOG_INFO, "crypto_bob3: scheme unavailable");
2728                 return (XEVNT_PUB);
2729         }
2730         dsa = mvpar_pkey->pkey.dsa;
2731
2732         /*
2733          * Extract r from the challenge.
2734          */
2735         len = ntohl(ep->vallen);
2736         if ((r = BN_bin2bn((u_char *)ep->pkt, len, NULL)) == NULL) {
2737                 msyslog(LOG_ERR, "crypto_bob3 %s\n",
2738                     ERR_error_string(ERR_get_error(), NULL));
2739                 return (XEVNT_PUB);
2740         }
2741
2742         /*
2743          * Bob rolls random k (0 < k < q), making sure it is not a
2744          * factor of q. He then computes y = A^k r and sends (hash(y),
2745          * gbar^k, ghat^k) to Alice.
2746          */
2747         bctx = BN_CTX_new(); k = BN_new(); u = BN_new();
2748         sdsa = DSA_new();
2749         sdsa->p = BN_new(); sdsa->q = BN_new(); sdsa->g = BN_new();
2750         while (1) {
2751                 BN_rand(k, BN_num_bits(dsa->q), 0, 0);
2752                 BN_mod(k, k, dsa->q, bctx);
2753                 BN_gcd(u, k, dsa->q, bctx);
2754                 if (BN_is_one(u))
2755                         break;
2756         }
2757         BN_mod_exp(u, dsa->g, k, dsa->p, bctx); /* A r */
2758         BN_mod_mul(u, u, r, dsa->p, bctx);
2759         bighash(u, sdsa->p);
2760         BN_mod_exp(sdsa->q, dsa->priv_key, k, dsa->p, bctx); /* gbar */
2761         BN_mod_exp(sdsa->g, dsa->pub_key, k, dsa->p, bctx); /* ghat */
2762         BN_CTX_free(bctx); BN_free(k); BN_free(r); BN_free(u);
2763
2764         /*
2765          * Encode the values in ASN.1 and sign.
2766          */
2767         tstamp = crypto_time();
2768         memset(vp, 0, sizeof(struct value));
2769         vp->tstamp = htonl(tstamp);
2770         vp->fstamp = htonl(mv_fstamp);
2771         len = i2d_DSAparams(sdsa, NULL);
2772         if (len <= 0) {
2773                 msyslog(LOG_ERR, "crypto_bob3 %s\n",
2774                     ERR_error_string(ERR_get_error(), NULL));
2775                 DSA_free(sdsa);
2776                 return (XEVNT_PUB);
2777         }
2778         vp->vallen = htonl(len);
2779         ptr = emalloc(len);
2780         vp->ptr = ptr;
2781         i2d_DSAparams(sdsa, &ptr);
2782         DSA_free(sdsa);
2783         vp->siglen = 0;
2784         if (tstamp == 0)
2785                 return (XEVNT_OK);
2786         vp->sig = emalloc(sign_siglen);
2787         EVP_SignInit(&ctx, sign_digest);
2788         EVP_SignUpdate(&ctx, (u_char *)&vp->tstamp, 12);
2789         EVP_SignUpdate(&ctx, vp->ptr, len);
2790         if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey))
2791                 vp->siglen = htonl(len);
2792         return (XEVNT_OK);
2793 }
2794
2795
2796 /*
2797  * crypto_mv - verify Bob's response to Alice's challenge
2798  *
2799  * Returns
2800  * XEVNT_OK     success
2801  * XEVNT_PUB    bad or missing public key
2802  * XEVNT_FSP    bad filestamp
2803  * XEVNT_ID     bad or missing identity parameters
2804  */
2805 int
2806 crypto_mv(
2807         struct exten *ep,       /* extension pointer */
2808         struct peer *peer       /* peer structure pointer */
2809         )
2810 {
2811         DSA     *dsa;           /* MV parameters */
2812         DSA     *sdsa;          /* DSA parameters */
2813         BN_CTX  *bctx;          /* BIGNUM context */
2814         BIGNUM  *k, *u, *v;
2815         u_int   len;
2816         const u_char    *ptr;
2817         int     temp;
2818
2819         /*
2820          * If the MV parameters are not valid or no challenge was sent,
2821          * something awful happened or we are being tormented.
2822          */
2823         if (peer->ident_pkey == NULL) {
2824                 msyslog(LOG_INFO, "crypto_mv: scheme unavailable");
2825                 return (XEVNT_PUB);
2826         }
2827         if (ntohl(ep->fstamp) != peer->fstamp) {
2828                 msyslog(LOG_INFO, "crypto_mv: invalid filestamp %u",
2829                     ntohl(ep->fstamp));
2830                 return (XEVNT_FSP);
2831         }
2832         if ((dsa = peer->ident_pkey->pkey.dsa) == NULL) {
2833                 msyslog(LOG_INFO, "crypto_mv: defective key");
2834                 return (XEVNT_PUB);
2835         }
2836         if (peer->iffval == NULL) {
2837                 msyslog(LOG_INFO, "crypto_mv: missing challenge");
2838                 return (XEVNT_PUB);
2839         }
2840
2841         /*
2842          * Extract the (hash(y), gbar, ghat) values from the response.
2843          */
2844         bctx = BN_CTX_new(); k = BN_new(); u = BN_new(); v = BN_new();
2845         len = ntohl(ep->vallen);
2846         ptr = (const u_char *)ep->pkt;
2847         if ((sdsa = d2i_DSAparams(NULL, &ptr, len)) == NULL) {
2848                 msyslog(LOG_ERR, "crypto_mv %s\n",
2849                     ERR_error_string(ERR_get_error(), NULL));
2850                 return (XEVNT_PUB);
2851         }
2852
2853         /*
2854          * Compute (gbar^xhat ghat^xbar)^-1 mod p.
2855          */
2856         BN_mod_exp(u, sdsa->q, dsa->pub_key, dsa->p, bctx);
2857         BN_mod_exp(v, sdsa->g, dsa->priv_key, dsa->p, bctx);
2858         BN_mod_mul(u, u, v, dsa->p, bctx);
2859         BN_mod_inverse(u, u, dsa->p, bctx);
2860         BN_mod_mul(v, u, peer->iffval, dsa->p, bctx);
2861
2862         /*
2863          * The result should match the hash of r mod p.
2864          */
2865         bighash(v, v);
2866         temp = BN_cmp(v, sdsa->p);
2867         BN_CTX_free(bctx); BN_free(k); BN_free(u); BN_free(v);
2868         BN_free(peer->iffval);
2869         peer->iffval = NULL;
2870         DSA_free(sdsa);
2871         if (temp == 0)
2872                 return (XEVNT_OK);
2873         else
2874                 return (XEVNT_ID);
2875 }
2876
2877
2878 /*
2879  ***********************************************************************
2880  *                                                                     *
2881  * The following routines are used to manipulate certificates          *
2882  *                                                                     *
2883  ***********************************************************************
2884  */
2885 /*
2886  * cert_parse - parse x509 certificate and create info/value structures.
2887  *
2888  * The server certificate includes the version number, issuer name,
2889  * subject name, public key and valid date interval. If the issuer name
2890  * is the same as the subject name, the certificate is self signed and
2891  * valid only if the server is configured as trustable. If the names are
2892  * different, another issuer has signed the server certificate and
2893  * vouched for it. In this case the server certificate is valid if
2894  * verified by the issuer public key.
2895  *
2896  * Returns certificate info/value pointer if valid, NULL if not.
2897  */
2898 struct cert_info *              /* certificate information structure */
2899 cert_parse(
2900         u_char  *asn1cert,      /* X509 certificate */
2901         u_int   len,            /* certificate length */
2902         tstamp_t fstamp         /* filestamp */
2903         )
2904 {
2905         X509    *cert;          /* X509 certificate */
2906         X509_EXTENSION *ext;    /* X509v3 extension */
2907         struct cert_info *ret;  /* certificate info/value */
2908         BIO     *bp;
2909         X509V3_EXT_METHOD *method;
2910         char    pathbuf[MAXFILENAME];
2911         u_char  *uptr;
2912         char    *ptr;
2913         int     temp, cnt, i;
2914
2915         /*
2916          * Decode ASN.1 objects and construct certificate structure.
2917          */
2918         uptr = asn1cert;
2919         if ((cert = d2i_X509(NULL, &uptr, len)) == NULL) {
2920                 msyslog(LOG_ERR, "cert_parse %s\n",
2921                     ERR_error_string(ERR_get_error(), NULL));
2922                 return (NULL);
2923         }
2924
2925         /*
2926          * Extract version, subject name and public key.
2927          */
2928         ret = emalloc(sizeof(struct cert_info));
2929         memset(ret, 0, sizeof(struct cert_info));
2930         if ((ret->pkey = X509_get_pubkey(cert)) == NULL) {
2931                 msyslog(LOG_ERR, "cert_parse %s\n",
2932                     ERR_error_string(ERR_get_error(), NULL));
2933                 cert_free(ret);
2934                 X509_free(cert);
2935                 return (NULL);
2936         }
2937         ret->version = X509_get_version(cert);
2938         X509_NAME_oneline(X509_get_subject_name(cert), pathbuf,
2939             MAXFILENAME - 1);
2940         ptr = strstr(pathbuf, "CN=");
2941         if (ptr == NULL) {
2942                 msyslog(LOG_INFO, "cert_parse: invalid subject %s",
2943                     pathbuf);
2944                 cert_free(ret);
2945                 X509_free(cert);
2946                 return (NULL);
2947         }
2948         ret->subject = emalloc(strlen(ptr) + 1);
2949         strcpy(ret->subject, ptr + 3);
2950
2951         /*
2952          * Extract remaining objects. Note that the NTP serial number is
2953          * the NTP seconds at the time of signing, but this might not be
2954          * the case for other authority. We don't bother to check the
2955          * objects at this time, since the real crunch can happen only
2956          * when the time is valid but not yet certificated.
2957          */
2958         ret->nid = OBJ_obj2nid(cert->cert_info->signature->algorithm);
2959         ret->digest = (const EVP_MD *)EVP_get_digestbynid(ret->nid);
2960         ret->serial =
2961             (u_long)ASN1_INTEGER_get(X509_get_serialNumber(cert));
2962         X509_NAME_oneline(X509_get_issuer_name(cert), pathbuf,
2963             MAXFILENAME);
2964         if ((ptr = strstr(pathbuf, "CN=")) == NULL) {
2965                 msyslog(LOG_INFO, "cert_parse: invalid issuer %s",
2966                     pathbuf);
2967                 cert_free(ret);
2968                 X509_free(cert);
2969                 return (NULL);
2970         }
2971         ret->issuer = emalloc(strlen(ptr) + 1);
2972         strcpy(ret->issuer, ptr + 3);
2973         ret->first = asn2ntp(X509_get_notBefore(cert));
2974         ret->last = asn2ntp(X509_get_notAfter(cert));
2975
2976         /*
2977          * Extract extension fields. These are ad hoc ripoffs of
2978          * currently assigned functions and will certainly be changed
2979          * before prime time.
2980          */
2981         cnt = X509_get_ext_count(cert);
2982         for (i = 0; i < cnt; i++) {
2983                 ext = X509_get_ext(cert, i);
2984                 method = X509V3_EXT_get(ext);
2985                 temp = OBJ_obj2nid(ext->object);
2986                 switch (temp) {
2987
2988                 /*
2989                  * If a key_usage field is present, we decode whether
2990                  * this is a trusted or private certificate. This is
2991                  * dorky; all we want is to compare NIDs, but OpenSSL
2992                  * insists on BIO text strings.
2993                  */
2994                 case NID_ext_key_usage:
2995                         bp = BIO_new(BIO_s_mem());
2996                         X509V3_EXT_print(bp, ext, 0, 0);
2997                         BIO_gets(bp, pathbuf, MAXFILENAME);
2998                         BIO_free(bp);
2999 #if DEBUG
3000                         if (debug)
3001                                 printf("cert_parse: %s: %s\n",
3002                                     OBJ_nid2ln(temp), pathbuf);
3003 #endif
3004                         if (strcmp(pathbuf, "Trust Root") == 0)
3005                                 ret->flags |= CERT_TRUST;
3006                         else if (strcmp(pathbuf, "Private") == 0)
3007                                 ret->flags |= CERT_PRIV;
3008                         break;
3009
3010                 /*
3011                  * If a NID_subject_key_identifier field is present, it
3012                  * contains the GQ public key.
3013                  */
3014                 case NID_subject_key_identifier:
3015                         ret->grplen = ext->value->length - 2;
3016                         ret->grpkey = emalloc(ret->grplen);
3017                         memcpy(ret->grpkey, &ext->value->data[2],
3018                             ret->grplen);
3019                         break;
3020                 }
3021         }
3022
3023         /*
3024          * If certificate is self signed, verify signature.
3025          */
3026         if (strcmp(ret->subject, ret->issuer) == 0) {
3027                 if (!X509_verify(cert, ret->pkey)) {
3028                         msyslog(LOG_INFO,
3029                             "cert_parse: invalid signature not verified %s",
3030                             pathbuf);
3031                         cert_free(ret);
3032                         X509_free(cert);
3033                         return (NULL);
3034                 }
3035         }
3036
3037         /*
3038          * Verify certificate valid times. Note that certificates cannot
3039          * be retroactive.
3040          */
3041         if (ret->first > ret->last || ret->first < fstamp) {
3042                 msyslog(LOG_INFO,
3043                     "cert_parse: expired %s",
3044                     ret->subject);
3045                 cert_free(ret);
3046                 X509_free(cert);
3047                 return (NULL);
3048         }
3049
3050         /*
3051          * Build the value structure to sign and send later.
3052          */
3053         ret->cert.fstamp = htonl(fstamp);
3054         ret->cert.vallen = htonl(len);
3055         ret->cert.ptr = emalloc(len);
3056         memcpy(ret->cert.ptr, asn1cert, len);
3057 #ifdef DEBUG
3058         if (debug > 1)
3059                 X509_print_fp(stdout, cert);
3060 #endif
3061         X509_free(cert);
3062         return (ret);
3063 }
3064
3065
3066 /*
3067  * cert_sign - sign x509 certificate and update value structure.
3068  *
3069  * The certificate request is a copy of the client certificate, which
3070  * includes the version number, subject name and public key of the
3071  * client. The resulting certificate includes these values plus the
3072  * serial number, issuer name and validity interval of the server. The
3073  * validity interval extends from the current time to the same time one
3074  * year hence. For NTP purposes, it is convenient to use the NTP seconds
3075  * of the current time as the serial number.
3076  *
3077  * Returns
3078  * XEVNT_OK     success
3079  * XEVNT_PUB    bad or missing public key
3080  * XEVNT_CRT    bad or missing certificate
3081  * XEVNT_VFY    certificate not verified
3082  */
3083 static int
3084 cert_sign(
3085         struct exten *ep,       /* extension field pointer */
3086         struct value *vp        /* value pointer */
3087         )
3088 {
3089         X509    *req;           /* X509 certificate request */
3090         X509    *cert;          /* X509 certificate */
3091         X509_EXTENSION *ext;    /* certificate extension */
3092         ASN1_INTEGER *serial;   /* serial number */
3093         X509_NAME *subj;        /* distinguished (common) name */
3094         EVP_PKEY *pkey;         /* public key */
3095         EVP_MD_CTX ctx;         /* message digest context */
3096         tstamp_t tstamp;        /* NTP timestamp */
3097         u_int   len;
3098         u_char  *ptr;
3099         int     i, temp;
3100
3101         /*
3102          * Decode ASN.1 objects and construct certificate structure.
3103          */
3104         tstamp = crypto_time();
3105         if (tstamp == 0)
3106                 return (XEVNT_TSP);
3107
3108         ptr = (u_char *)ep->pkt;
3109         if ((req = d2i_X509(NULL, &ptr, ntohl(ep->vallen))) == NULL) {
3110                 msyslog(LOG_ERR, "cert_sign %s\n",
3111                     ERR_error_string(ERR_get_error(), NULL));
3112                 return (XEVNT_CRT);
3113         }
3114         /*
3115          * Extract public key and check for errors.
3116          */
3117         if ((pkey = X509_get_pubkey(req)) == NULL) {
3118                 msyslog(LOG_ERR, "cert_sign %s\n",
3119                     ERR_error_string(ERR_get_error(), NULL));
3120                 X509_free(req);
3121                 return (XEVNT_PUB);
3122         }
3123
3124         /*
3125          * Generate X509 certificate signed by this server. For this
3126          * prupose the issuer name is the server name. Also copy any
3127          * extensions that might be present.
3128          */
3129         cert = X509_new();
3130         X509_set_version(cert, X509_get_version(req));
3131         serial = ASN1_INTEGER_new();
3132         ASN1_INTEGER_set(serial, tstamp);
3133         X509_set_serialNumber(cert, serial);
3134         X509_gmtime_adj(X509_get_notBefore(cert), 0L);
3135         X509_gmtime_adj(X509_get_notAfter(cert), YEAR);
3136         subj = X509_get_issuer_name(cert);
3137         X509_NAME_add_entry_by_txt(subj, "commonName", MBSTRING_ASC,
3138             (unsigned char *) sys_hostname, strlen(sys_hostname), -1, 0);
3139         subj = X509_get_subject_name(req);
3140         X509_set_subject_name(cert, subj);
3141         X509_set_pubkey(cert, pkey);
3142         ext = X509_get_ext(req, 0);
3143         temp = X509_get_ext_count(req);
3144         for (i = 0; i < temp; i++) {
3145                 ext = X509_get_ext(req, i);
3146                 X509_add_ext(cert, ext, -1);
3147         }
3148         X509_free(req);
3149
3150         /*
3151          * Sign and verify the certificate.
3152          */
3153         X509_sign(cert, sign_pkey, sign_digest);
3154         if (!X509_verify(cert, sign_pkey)) {
3155                 printf("cert_sign\n%s\n",
3156                     ERR_error_string(ERR_get_error(), NULL));
3157                 X509_free(cert);
3158                 return (XEVNT_VFY);
3159         }
3160         len = i2d_X509(cert, NULL);
3161
3162         /*
3163          * Build and sign the value structure. We have to sign it here,
3164          * since the response has to be returned right away. This is a
3165          * clogging hazard.
3166          */
3167         memset(vp, 0, sizeof(struct value));
3168         vp->tstamp = htonl(tstamp);
3169         vp->fstamp = ep->fstamp;
3170         vp->vallen = htonl(len);
3171         vp->ptr = emalloc(len);
3172         ptr = vp->ptr;
3173         i2d_X509(cert, &ptr);
3174         vp->siglen = 0;
3175         vp->sig = emalloc(sign_siglen);
3176         EVP_SignInit(&ctx, sign_digest);
3177         EVP_SignUpdate(&ctx, (u_char *)vp, 12);
3178         EVP_SignUpdate(&ctx, vp->ptr, len);
3179         if (EVP_SignFinal(&ctx, vp->sig, &len, sign_pkey))
3180                 vp->siglen = htonl(len);
3181 #ifdef DEBUG
3182         if (debug > 1)
3183                 X509_print_fp(stdout, cert);
3184 #endif
3185         X509_free(cert);
3186         return (XEVNT_OK);
3187 }
3188
3189
3190 /*
3191  * cert_valid - verify certificate with given public key
3192  *
3193  * This is pretty ugly, as the certificate has to be verified in the
3194  * OpenSSL X509 structure, not in the DER format in the info/value
3195  * structure.
3196  *
3197  * Returns
3198  * XEVNT_OK     success
3199  * XEVNT_VFY    certificate not verified
3200  */
3201 int
3202 cert_valid(
3203         struct cert_info *cinf, /* certificate information structure */
3204         EVP_PKEY *pkey          /* public key */
3205         )
3206 {
3207         X509    *cert;          /* X509 certificate */
3208         u_char  *ptr;
3209
3210         if (cinf->flags & CERT_SIGN)
3211                 return (XEVNT_OK);
3212         ptr = (u_char *)cinf->cert.ptr;
3213         cert = d2i_X509(NULL, &ptr, ntohl(cinf->cert.vallen));
3214         if (!X509_verify(cert, pkey))
3215                 return (XEVNT_VFY);
3216         cinf->flags |= CERT_SIGN;
3217         X509_free(cert);
3218         return (XEVNT_OK);
3219 }
3220
3221
3222 /*
3223  * cert - install certificate in certificate list
3224  *
3225  * This routine encodes an extension field into a certificate info/value
3226  * structure. It searches the certificate list for duplicates and
3227  * expunges whichever is older. It then searches the list for other
3228  * certificates that might be verified by this latest one. Finally, it
3229  * inserts this certificate first on the list.
3230  *
3231  * Returns
3232  * XEVNT_OK     success
3233  * XEVNT_PER    certificate expired
3234  * XEVNT_CRT    bad or missing certificate 
3235  */
3236 int
3237 cert_install(
3238         struct exten *ep,       /* cert info/value */
3239         struct peer *peer       /* peer structure */
3240         )
3241 {
3242         struct cert_info *cp, *xp, *yp, **zp;
3243         int     rval;
3244         tstamp_t tstamp;
3245
3246         /*
3247          * Parse and validate the signed certificate. If valid,
3248          * construct the info/value structure; otherwise, scamper home.
3249          * Note this allows a certificate not-before time to be in the
3250          * future, but not a not-after time to be in the past.
3251          */
3252         if ((cp = cert_parse((u_char *)ep->pkt, ntohl(ep->vallen),
3253             ntohl(ep->fstamp))) == NULL)
3254                 return (XEVNT_CRT);
3255
3256         tstamp = crypto_time();
3257         if (tstamp > cp->last) {
3258                 cert_free(cp);
3259                 return (XEVNT_PER);
3260         }
3261
3262         /*
3263          * Scan certificate list looking for another certificate with
3264          * the same subject and issuer. If another is found with the
3265          * same or older filestamp, unlink it and return the goodies to
3266          * the heap. If another is found with a later filetsamp, discard
3267          * the new one and leave the building.
3268          */
3269         rval = XEVNT_OK;
3270         yp = cp;
3271         zp = &cinfo;
3272         for (xp = cinfo; xp != NULL; xp = xp->link) {
3273                 if (strcmp(cp->subject, xp->subject) == 0 &&
3274                     strcmp(cp->issuer, xp->issuer) == 0) {
3275                         if (ntohl(cp->cert.fstamp) <=
3276                             ntohl(xp->cert.fstamp)) {
3277                                 *zp = xp->link;;
3278                                 cert_free(xp);
3279                         } else {
3280                                 cert_free(cp);
3281                                 return (XEVNT_TSP);
3282                         }
3283                         break;
3284                 }
3285                 zp = &xp->link;
3286         }
3287         yp->link = cinfo;
3288         cinfo = yp;
3289
3290         /*
3291          * Scan the certificate list to see if Y is signed by X.
3292          */
3293         for (yp = cinfo; yp != NULL; yp = yp->link) {
3294                 for (xp = cinfo; xp != NULL; xp = xp->link) {
3295                         if (yp->flags & CERT_ERROR)
3296                                 continue;
3297
3298                         /*
3299                          * If issuer Y matches subject X and signature Y
3300                          * is valid using public key X, then Y is valid.
3301                          */
3302                         if (strcmp(yp->issuer, xp->subject) != 0)
3303                                 continue;
3304
3305                         if (cert_valid(yp, xp->pkey) != XEVNT_OK) {
3306                                 yp->flags |= CERT_ERROR;
3307                                 continue;
3308                         }
3309                         xp->flags |= CERT_SIGN;
3310
3311                         /*
3312                          * If X is trusted, then Y is trusted. Note that
3313                          * we might stumble over a self signed
3314                          * certificate that is not trusted, at least
3315                          * temporarily. This can happen when a dude
3316                          * first comes up, but has not synchronized the
3317                          * clock and had its certificate signed by its
3318                          * server. In case of broken certificate trail,
3319                          * this might result in a loop that could
3320                          * persist until timeout.
3321                          */
3322                         if (!(xp->flags & CERT_TRUST))
3323                                 continue;
3324
3325                         yp->flags |= CERT_TRUST;
3326
3327                         /*
3328                          * If subject Y matches the server subject name,
3329                          * then Y has completed the certificate trail.
3330                          * Save the group key and light the valid bit.
3331                          */
3332                         if (strcmp(yp->subject, peer->subject) != 0)
3333                                 continue;
3334
3335                         if (yp->grpkey != NULL) {
3336                                 if (peer->grpkey != NULL)
3337                                         BN_free(peer->grpkey);
3338                                 peer->grpkey = BN_bin2bn(yp->grpkey,
3339                                      yp->grplen, NULL);
3340                         }
3341                         peer->crypto |= CRYPTO_FLAG_VALID;
3342
3343                         /*
3344                          * If the server has an an identity scheme,
3345                          * fetch the identity credentials. If not, the
3346                          * identity is verified only by the trusted
3347                          * certificate. The next signature will set the
3348                          * server proventic.
3349                          */
3350                         if (peer->crypto & (CRYPTO_FLAG_GQ |
3351                             CRYPTO_FLAG_IFF | CRYPTO_FLAG_MV))
3352                                 continue;
3353
3354                         peer->crypto |= CRYPTO_FLAG_VRFY;
3355                 }
3356         }
3357
3358         /*
3359          * That was awesome. Now update the timestamps and signatures.
3360          */
3361         crypto_update();
3362         return (rval);
3363 }
3364
3365
3366 /*
3367  * cert_free - free certificate information structure
3368  */
3369 void
3370 cert_free(
3371         struct cert_info *cinf  /* certificate info/value structure */ 
3372         )
3373 {
3374         if (cinf->pkey != NULL)
3375                 EVP_PKEY_free(cinf->pkey);
3376         if (cinf->subject != NULL)
3377                 free(cinf->subject);
3378         if (cinf->issuer != NULL)
3379                 free(cinf->issuer);
3380         if (cinf->grpkey != NULL)
3381                 free(cinf->grpkey);
3382         value_free(&cinf->cert);
3383         free(cinf);
3384 }
3385
3386
3387 /*
3388  ***********************************************************************
3389  *                                                                     *
3390  * The following routines are used only at initialization time         *
3391  *                                                                     *
3392  ***********************************************************************
3393  */
3394 /*
3395  * crypto_key - load cryptographic parameters and keys from files
3396  *
3397  * This routine loads a PEM-encoded public/private key pair and extracts
3398  * the filestamp from the file name.
3399  *
3400  * Returns public key pointer if valid, NULL if not. Side effect updates
3401  * the filestamp if valid.
3402  */
3403 static EVP_PKEY *
3404 crypto_key(
3405         char    *cp,            /* file name */
3406         tstamp_t *fstamp        /* filestamp */
3407         )
3408 {
3409         FILE    *str;           /* file handle */
3410         EVP_PKEY *pkey = NULL;  /* public/private key */
3411         char    filename[MAXFILENAME]; /* name of key file */
3412         char    linkname[MAXFILENAME]; /* filestamp buffer) */
3413         char    statstr[NTP_MAXSTRLEN]; /* statistics for filegen */
3414         char    *ptr;
3415
3416         /*
3417          * Open the key file. If the first character of the file name is
3418          * not '/', prepend the keys directory string. If something goes
3419          * wrong, abandon ship.
3420          */
3421         if (*cp == '/')
3422                 strcpy(filename, cp);
3423         else
3424                 snprintf(filename, MAXFILENAME, "%s/%s", keysdir, cp);
3425         str = fopen(filename, "r");
3426         if (str == NULL)
3427                 return (NULL);
3428
3429         /*
3430          * Read the filestamp, which is contained in the first line.
3431          */
3432         if ((ptr = fgets(linkname, MAXFILENAME, str)) == NULL) {
3433                 msyslog(LOG_ERR, "crypto_key: no data %s\n",
3434                     filename);
3435                 return (NULL);
3436         }
3437         if ((ptr = strrchr(ptr, '.')) == NULL) {
3438                 msyslog(LOG_ERR, "crypto_key: no filestamp %s\n",
3439                     filename);
3440                 return (NULL);
3441         }
3442         if (sscanf(++ptr, "%u", fstamp) != 1) {
3443                 msyslog(LOG_ERR, "crypto_key: invalid timestamp %s\n",
3444                     filename);
3445                 return (NULL);
3446         }
3447
3448         /*
3449          * Read and decrypt PEM-encoded private key.
3450          */
3451         pkey = PEM_read_PrivateKey(str, NULL, NULL, passwd);
3452         fclose(str);
3453         if (pkey == NULL) {
3454                 msyslog(LOG_ERR, "crypto_key %s\n",
3455                     ERR_error_string(ERR_get_error(), NULL));
3456                 return (NULL);
3457         }
3458
3459         /*
3460          * Leave tracks in the cryptostats.
3461          */
3462         if ((ptr = strrchr(linkname, '\n')) != NULL)
3463                 *ptr = '\0'; 
3464         sprintf(statstr, "%s mod %d", &linkname[2],
3465             EVP_PKEY_size(pkey) * 8);
3466         record_crypto_stats(NULL, statstr);
3467 #ifdef DEBUG
3468         if (debug)
3469                 printf("crypto_key: %s\n", statstr);
3470         if (debug > 1) {
3471                 if (EVP_MD_type(pkey) == EVP_PKEY_DSA)
3472                         DSA_print_fp(stdout, pkey->pkey.dsa, 0);
3473                 else
3474                         RSA_print_fp(stdout, pkey->pkey.rsa, 0);
3475         }
3476 #endif
3477         return (pkey);
3478 }
3479
3480
3481 /*
3482  * crypto_cert - load certificate from file
3483  *
3484  * This routine loads a X.509 RSA or DSA certificate from a file and
3485  * constructs a info/cert value structure for this machine. The
3486  * structure includes a filestamp extracted from the file name. Later
3487  * the certificate can be sent to another machine by request.
3488  *
3489  * Returns certificate info/value pointer if valid, NULL if not.
3490  */
3491 static struct cert_info *       /* certificate information */
3492 crypto_cert(
3493         char    *cp             /* file name */
3494         )
3495 {
3496         struct cert_info *ret; /* certificate information */
3497         FILE    *str;           /* file handle */
3498         char    filename[MAXFILENAME]; /* name of certificate file */
3499         char    linkname[MAXFILENAME]; /* filestamp buffer */
3500         char    statstr[NTP_MAXSTRLEN]; /* statistics for filegen */
3501         tstamp_t fstamp;        /* filestamp */
3502         long    len;
3503         char    *ptr;
3504         char    *name, *header;
3505         u_char  *data;
3506
3507         /*
3508          * Open the certificate file. If the first character of the file
3509          * name is not '/', prepend the keys directory string. If
3510          * something goes wrong, abandon ship.
3511          */
3512         if (*cp == '/')
3513                 strcpy(filename, cp);
3514         else
3515                 snprintf(filename, MAXFILENAME, "%s/%s", keysdir, cp);
3516         str = fopen(filename, "r");
3517         if (str == NULL)
3518                 return (NULL);
3519
3520         /*
3521          * Read the filestamp, which is contained in the first line.
3522          */
3523         if ((ptr = fgets(linkname, MAXFILENAME, str)) == NULL) {
3524                 msyslog(LOG_ERR, "crypto_cert: no data %s\n",
3525                     filename);
3526                 return (NULL);
3527         }
3528         if ((ptr = strrchr(ptr, '.')) == NULL) {
3529                 msyslog(LOG_ERR, "crypto_cert: no filestamp %s\n",
3530                     filename);
3531                 return (NULL);
3532         }
3533         if (sscanf(++ptr, "%u", &fstamp) != 1) {
3534                 msyslog(LOG_ERR, "crypto_cert: invalid filestamp %s\n",
3535                     filename);
3536                 return (NULL);
3537         }
3538
3539         /*
3540          * Read PEM-encoded certificate and install.
3541          */
3542         if (!PEM_read(str, &name, &header, &data, &len)) {
3543                 msyslog(LOG_ERR, "crypto_cert %s\n",
3544                     ERR_error_string(ERR_get_error(), NULL));
3545                 return (NULL);
3546         }
3547         free(header);
3548         if (strcmp(name, "CERTIFICATE") !=0) {
3549                 msyslog(LOG_INFO, "crypto_cert: wrong PEM type %s",
3550                     name);
3551                 free(name);
3552                 free(data);
3553                 return (NULL);
3554         }
3555         free(name);
3556
3557         /*
3558          * Parse certificate and generate info/value structure.
3559          */
3560         ret = cert_parse(data, len, fstamp);
3561         free(data);
3562         if (ret == NULL)
3563                 return (NULL);
3564         if ((ptr = strrchr(linkname, '\n')) != NULL)
3565                 *ptr = '\0'; 
3566         sprintf(statstr, "%s 0x%x len %lu", &linkname[2], ret->flags,
3567             len);
3568         record_crypto_stats(NULL, statstr);
3569 #ifdef DEBUG
3570         if (debug)
3571                 printf("crypto_cert: %s\n", statstr);
3572 #endif
3573         return (ret);
3574 }
3575
3576
3577 /*
3578  * crypto_tai - load leapseconds table from file
3579  *
3580  * This routine loads the ERTS leapsecond file in NIST text format,
3581  * converts to a value structure and extracts a filestamp from the file
3582  * name. The data are used to establish the TAI offset from UTC, which
3583  * is provided to the kernel if supported. Later the data can be sent to
3584  * another machine on request.
3585  */
3586 static void
3587 crypto_tai(
3588         char    *cp             /* file name */
3589         )
3590 {
3591         FILE    *str;           /* file handle */
3592         char    buf[NTP_MAXSTRLEN];     /* file line buffer */
3593         u_int   leapsec[MAX_LEAP]; /* NTP time at leaps */
3594         u_int   offset;         /* offset at leap (s) */
3595         char    filename[MAXFILENAME]; /* name of leapseconds file */
3596         char    linkname[MAXFILENAME]; /* file link (for filestamp) */
3597         char    statstr[NTP_MAXSTRLEN]; /* statistics for filegen */
3598         tstamp_t fstamp;        /* filestamp */
3599         u_int   len;
3600         char    *ptr;
3601         int     rval, i;
3602 #ifdef KERNEL_PLL
3603 #if NTP_API > 3
3604         struct timex ntv;       /* kernel interface structure */
3605 #endif /* NTP_API */
3606 #endif /* KERNEL_PLL */
3607
3608         /*
3609          * Open the file and discard comment lines. If the first
3610          * character of the file name is not '/', prepend the keys
3611          * directory string. If the file is not found, not to worry; it
3612          * can be retrieved over the net. But, if it is found with
3613          * errors, we crash and burn.
3614          */
3615         if (*cp == '/')
3616                 strcpy(filename, cp);
3617         else
3618                 snprintf(filename, MAXFILENAME, "%s/%s", keysdir, cp);
3619         if ((str = fopen(filename, "r")) == NULL)
3620                 return;
3621
3622         /*
3623          * Extract filestamp if present.
3624          */
3625         rval = readlink(filename, linkname, MAXFILENAME - 1);
3626         if (rval > 0) {
3627                 linkname[rval] = '\0';
3628                 ptr = strrchr(linkname, '.');
3629         } else {
3630                 ptr = strrchr(filename, '.');
3631         }
3632         if (ptr != NULL)
3633                 sscanf(++ptr, "%u", &fstamp);
3634         else
3635                 fstamp = 0;
3636         tai_leap.fstamp = htonl(fstamp);
3637
3638         /*
3639          * We are rather paranoid here, since an intruder might cause a
3640          * coredump by infiltrating naughty values. Empty lines and
3641          * comments are ignored. Other lines must begin with two
3642          * integers followed by junk or comments. The first integer is
3643          * the NTP seconds of leap insertion, the second is the offset
3644          * of TAI relative to UTC after that insertion. The second word
3645          * must equal the initial insertion of ten seconds on 1 January
3646          * 1972 plus one second for each succeeding insertion.
3647          */
3648         i = 0;
3649         while (i < MAX_LEAP) {
3650                 ptr = fgets(buf, NTP_MAXSTRLEN - 1, str);
3651                 if (ptr == NULL)
3652                         break;
3653                 if (strlen(buf) < 1)
3654                         continue;
3655                 if (*buf == '#')
3656                         continue;
3657                 if (sscanf(buf, "%u %u", &leapsec[i], &offset) != 2)
3658                         continue;
3659                 if (i != (int)(offset - TAI_1972)) { 
3660                         break;
3661                 }
3662                 i++;
3663         }
3664         fclose(str);
3665         if (ptr != NULL) {
3666                 msyslog(LOG_INFO,
3667                     "crypto_tai: leapseconds file %s error %d", cp,
3668                     rval);
3669                 exit (-1);
3670         }
3671
3672         /*
3673          * The extension field table entries consists of the NTP seconds
3674          * of leap insertion in reverse order, so that the most recent
3675          * insertion is the first entry in the table.
3676          */
3677         len = i * 4;
3678         tai_leap.vallen = htonl(len);
3679         ptr = emalloc(len);
3680         tai_leap.ptr = (unsigned char *) ptr;
3681         for (; i >= 0; i--) {
3682                 *ptr++ = (char) htonl(leapsec[i]);
3683         }
3684         crypto_flags |= CRYPTO_FLAG_TAI;
3685         sys_tai = len / 4 + TAI_1972 - 1;
3686 #ifdef KERNEL_PLL
3687 #if NTP_API > 3
3688         ntv.modes = MOD_TAI;
3689         ntv.constant = sys_tai;
3690         if (ntp_adjtime(&ntv) == TIME_ERROR)
3691                 msyslog(LOG_INFO,
3692                     "crypto_tai: kernel TAI update failed");
3693 #endif /* NTP_API */
3694 #endif /* KERNEL_PLL */
3695         sprintf(statstr, "%s link %d fs %u offset %u", cp, rval, fstamp,
3696             ntohl(tai_leap.vallen) / 4 + TAI_1972 - 1);
3697         record_crypto_stats(NULL, statstr);
3698 #ifdef DEBUG
3699         if (debug)
3700                 printf("crypto_tai: %s\n", statstr);
3701 #endif
3702 }
3703
3704
3705 /*
3706  * crypto_setup - load keys, certificate and leapseconds table
3707  *
3708  * This routine loads the public/private host key and certificate. If
3709  * available, it loads the public/private sign key, which defaults to
3710  * the host key, and leapseconds table. The host key must be RSA, but
3711  * the sign key can be either RSA or DSA. In either case, the public key
3712  * on the certificate must agree with the sign key.
3713  */
3714 void
3715 crypto_setup(void)
3716 {
3717         EVP_PKEY *pkey;         /* private/public key pair */
3718         char    filename[MAXFILENAME]; /* file name buffer */
3719         l_fp    seed;           /* crypto PRNG seed as NTP timestamp */
3720         tstamp_t fstamp;        /* filestamp */
3721         tstamp_t sstamp;        /* sign filestamp */
3722         u_int   len, bytes;
3723         u_char  *ptr;
3724
3725         /*
3726          * Initialize structures.
3727          */
3728         if (!crypto_flags)
3729                 return;
3730         gethostname(filename, MAXFILENAME);
3731         bytes = strlen(filename) + 1;
3732         sys_hostname = emalloc(bytes);
3733         memcpy(sys_hostname, filename, bytes);
3734         if (passwd == NULL)
3735                 passwd = sys_hostname;
3736         memset(&hostval, 0, sizeof(hostval));
3737         memset(&pubkey, 0, sizeof(pubkey));
3738         memset(&tai_leap, 0, sizeof(tai_leap));
3739
3740         /*
3741          * Load required random seed file and seed the random number
3742          * generator. Be default, it is found in the user home
3743          * directory. The root home directory may be / or /root,
3744          * depending on the system. Wiggle the contents a bit and write
3745          * it back so the sequence does not repeat when we next restart.
3746          */
3747         ERR_load_crypto_strings();
3748         if (rand_file == NULL) {
3749                 if ((RAND_file_name(filename, MAXFILENAME)) != NULL) {
3750                         rand_file = emalloc(strlen(filename) + 1);
3751                         strcpy(rand_file, filename);
3752                 }
3753         } else if (*rand_file != '/') {
3754                 snprintf(filename, MAXFILENAME, "%s/%s", keysdir,
3755                     rand_file);
3756                 free(rand_file);
3757                 rand_file = emalloc(strlen(filename) + 1);
3758                 strcpy(rand_file, filename);
3759         }
3760         if (rand_file == NULL) {
3761                 msyslog(LOG_ERR,
3762                     "crypto_setup: random seed file not specified");
3763                 exit (-1);
3764         }
3765         if ((bytes = RAND_load_file(rand_file, -1)) == 0) {
3766                 msyslog(LOG_ERR,
3767                     "crypto_setup: random seed file %s not found\n",
3768                     rand_file);
3769                 exit (-1);
3770         }
3771         get_systime(&seed);
3772         RAND_seed(&seed, sizeof(l_fp));
3773         RAND_write_file(rand_file);
3774         OpenSSL_add_all_algorithms();
3775 #ifdef DEBUG
3776         if (debug)
3777                 printf(
3778                     "crypto_setup: OpenSSL version %lx random seed file %s bytes read %d\n",
3779                     SSLeay(), rand_file, bytes);
3780 #endif
3781
3782         /*
3783          * Load required host key from file "ntpkey_host_<hostname>". It
3784          * also becomes the default sign key.
3785          */
3786         if (host_file == NULL) {
3787                 snprintf(filename, MAXFILENAME, "ntpkey_host_%s",
3788                     sys_hostname);
3789                 host_file = emalloc(strlen(filename) + 1);
3790                 strcpy(host_file, filename);
3791         }
3792         pkey = crypto_key(host_file, &fstamp);
3793         if (pkey == NULL) {
3794                 msyslog(LOG_ERR,
3795                     "crypto_setup: host key file %s not found or corrupt",
3796                     host_file);
3797                 exit (-1);
3798         }
3799         host_pkey = pkey;
3800         sign_pkey = pkey;
3801         sstamp = fstamp;
3802         hostval.fstamp = htonl(fstamp);
3803         if (EVP_MD_type(host_pkey) != EVP_PKEY_RSA) {
3804                 msyslog(LOG_ERR,
3805                     "crypto_setup: host key is not RSA key type");
3806                 exit (-1);
3807         }
3808         hostval.vallen = htonl(strlen(sys_hostname));
3809         hostval.ptr = (unsigned char *) sys_hostname;
3810         
3811         /*
3812          * Construct public key extension field for agreement scheme.
3813          */
3814         len = i2d_PublicKey(host_pkey, NULL);
3815         ptr = emalloc(len);
3816         pubkey.ptr = ptr;
3817         i2d_PublicKey(host_pkey, &ptr);
3818         pubkey.vallen = htonl(len);
3819         pubkey.fstamp = hostval.fstamp;
3820
3821         /*
3822          * Load optional sign key from file "ntpkey_sign_<hostname>". If
3823          * loaded, it becomes the sign key.
3824          */
3825         if (sign_file == NULL) {
3826                 snprintf(filename, MAXFILENAME, "ntpkey_sign_%s",
3827                     sys_hostname);
3828                 sign_file = emalloc(strlen(filename) + 1);
3829                 strcpy(sign_file, filename);
3830         }
3831         pkey = crypto_key(sign_file, &fstamp);
3832         if (pkey != NULL) {
3833                 sign_pkey = pkey;
3834                 sstamp = fstamp;
3835         }
3836         sign_siglen = EVP_PKEY_size(sign_pkey);
3837
3838         /*
3839          * Load optional IFF parameters from file
3840          * "ntpkey_iff_<hostname>".
3841          */
3842         if (iffpar_file == NULL) {
3843                 snprintf(filename, MAXFILENAME, "ntpkey_iff_%s",
3844                     sys_hostname);
3845                 iffpar_file = emalloc(strlen(filename) + 1);
3846                 strcpy(iffpar_file, filename);
3847         }
3848         iffpar_pkey = crypto_key(iffpar_file, &if_fstamp);
3849         if (iffpar_pkey != NULL)
3850                 crypto_flags |= CRYPTO_FLAG_IFF;
3851
3852         /*
3853          * Load optional GQ parameters from file "ntpkey_gq_<hostname>".
3854          */
3855         if (gqpar_file == NULL) {
3856                 snprintf(filename, MAXFILENAME, "ntpkey_gq_%s",
3857                     sys_hostname);
3858                 gqpar_file = emalloc(strlen(filename) + 1);
3859                 strcpy(gqpar_file, filename);
3860         }
3861         gqpar_pkey = crypto_key(gqpar_file, &gq_fstamp);
3862         if (gqpar_pkey != NULL)
3863                 crypto_flags |= CRYPTO_FLAG_GQ;
3864
3865         /*
3866          * Load optional MV parameters from file "ntpkey_mv_<hostname>".
3867          */
3868         if (mvpar_file == NULL) {
3869                 snprintf(filename, MAXFILENAME, "ntpkey_mv_%s",
3870                     sys_hostname);
3871                 mvpar_file = emalloc(strlen(filename) + 1);
3872                 strcpy(mvpar_file, filename);
3873         }
3874         mvpar_pkey = crypto_key(mvpar_file, &mv_fstamp);
3875         if (mvpar_pkey != NULL)
3876                 crypto_flags |= CRYPTO_FLAG_MV;
3877
3878         /*
3879          * Load required certificate from file "ntpkey_cert_<hostname>".
3880          */
3881         if (cert_file == NULL) {
3882                 snprintf(filename, MAXFILENAME, "ntpkey_cert_%s",
3883                     sys_hostname);
3884                 cert_file = emalloc(strlen(filename) + 1);
3885                 strcpy(cert_file, filename);
3886         }
3887         if ((cinfo = crypto_cert(cert_file)) == NULL) {
3888                 msyslog(LOG_ERR,
3889                     "certificate file %s not found or corrupt",
3890                     cert_file);
3891                 exit (-1);
3892         }
3893
3894         /*
3895          * The subject name must be the same as the host name, unless
3896          * the certificate is private, in which case it may have come
3897          * from another host.
3898          */
3899         if (!(cinfo->flags & CERT_PRIV) && strcmp(cinfo->subject,
3900             sys_hostname) != 0) {
3901                 msyslog(LOG_ERR,
3902                     "crypto_setup: certificate %s not for this host",
3903                     cert_file);
3904                 cert_free(cinfo);
3905                 exit (-1);
3906         }
3907
3908         /*
3909          * It the certificate is trusted, the subject must be the same
3910          * as the issuer, in other words it must be self signed.
3911          */
3912         if (cinfo->flags & CERT_PRIV && strcmp(cinfo->subject,
3913             cinfo->issuer) != 0) {
3914                 if (cert_valid(cinfo, sign_pkey) != XEVNT_OK) {
3915                         msyslog(LOG_ERR,
3916                             "crypto_setup: certificate %s is trusted, but not self signed.",
3917                             cert_file);
3918                         cert_free(cinfo);
3919                         exit (-1);
3920                 }
3921         }
3922         sign_digest = cinfo->digest;
3923         if (cinfo->flags & CERT_PRIV)
3924                 crypto_flags |= CRYPTO_FLAG_PRIV;
3925         crypto_flags |= cinfo->nid << 16;
3926
3927         /*
3928          * Load optional leapseconds table from file "ntpkey_leap". If
3929          * the file is missing or defective, the values can later be
3930          * retrieved from a server.
3931          */
3932         if (leap_file == NULL)
3933                 leap_file = "ntpkey_leap";
3934         crypto_tai(leap_file);
3935 #ifdef DEBUG
3936         if (debug)
3937                 printf(
3938                     "crypto_setup: flags 0x%x host %s signature %s\n",
3939                     crypto_flags, sys_hostname, OBJ_nid2ln(cinfo->nid));
3940 #endif
3941 }
3942
3943
3944 /*
3945  * crypto_config - configure data from crypto configuration command.
3946  */
3947 void
3948 crypto_config(
3949         int     item,           /* configuration item */
3950         char    *cp             /* file name */
3951         )
3952 {
3953         switch (item) {
3954
3955         /*
3956          * Set random seed file name.
3957          */
3958         case CRYPTO_CONF_RAND:
3959                 rand_file = emalloc(strlen(cp) + 1);
3960                 strcpy(rand_file, cp);
3961                 break;
3962
3963         /*
3964          * Set private key password.
3965          */
3966         case CRYPTO_CONF_PW:
3967                 passwd = emalloc(strlen(cp) + 1);
3968                 strcpy(passwd, cp);
3969                 break;
3970
3971         /*
3972          * Set host file name.
3973          */
3974         case CRYPTO_CONF_PRIV:
3975                 host_file = emalloc(strlen(cp) + 1);
3976                 strcpy(host_file, cp);
3977                 break;
3978
3979         /*
3980          * Set sign key file name.
3981          */
3982         case CRYPTO_CONF_SIGN:
3983                 sign_file = emalloc(strlen(cp) + 1);
3984                 strcpy(sign_file, cp);
3985                 break;
3986
3987         /*
3988          * Set iff parameters file name.
3989          */
3990         case CRYPTO_CONF_IFFPAR:
3991                 iffpar_file = emalloc(strlen(cp) + 1);
3992                 strcpy(iffpar_file, cp);
3993                 break;
3994
3995         /*
3996          * Set gq parameters file name.
3997          */
3998         case CRYPTO_CONF_GQPAR:
3999                 gqpar_file = emalloc(strlen(cp) + 1);
4000                 strcpy(gqpar_file, cp);
4001                 break;
4002
4003         /*
4004          * Set mv parameters file name.
4005          */
4006         case CRYPTO_CONF_MVPAR:
4007                 mvpar_file = emalloc(strlen(cp) + 1);
4008                 strcpy(mvpar_file, cp);
4009                 break;
4010
4011         /*
4012          * Set certificate file name.
4013          */
4014         case CRYPTO_CONF_CERT:
4015                 cert_file = emalloc(strlen(cp) + 1);
4016                 strcpy(cert_file, cp);
4017                 break;
4018
4019         /*
4020          * Set leapseconds file name.
4021          */
4022         case CRYPTO_CONF_LEAP:
4023                 leap_file = emalloc(strlen(cp) + 1);
4024                 strcpy(leap_file, cp);
4025                 break;
4026         }
4027         crypto_flags |= CRYPTO_FLAG_ENAB;
4028 }
4029 # else
4030 int ntp_crypto_bs_pubkey;
4031 # endif /* OPENSSL */