ntp_crypto.c revision 132452
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 */
100u_int32	crypto_flags = 0x0;	/* status word */
101u_int	sys_tai;		/* current UTC offset from TAI */
102
103/*
104 * Global cryptodata in network byte order
105 */
106struct cert_info *cinfo = NULL;	/* certificate info/value */
107struct value hostval;		/* host value */
108struct value pubkey;		/* public key */
109struct value tai_leap;		/* leapseconds table */
110
111/*
112 * Private cryptodata in host byte order
113 */
114static char *passwd = NULL;	/* private key password */
115static EVP_PKEY *host_pkey = NULL; /* host key */
116static EVP_PKEY *sign_pkey = NULL; /* sign key */
117static EVP_PKEY *iffpar_pkey = NULL; /* IFF parameters */
118static EVP_PKEY	*gqpar_pkey = NULL; /* GQ parameters */
119static EVP_PKEY	*mvpar_pkey = NULL; /* MV parameters */
120static const EVP_MD *sign_digest = NULL; /* sign digest */
121static u_int sign_siglen;	/* sign key length */
122static char *rand_file = NULL;	/* random seed file */
123static char *host_file = NULL;	/* host key file */
124static char *sign_file = NULL;	/* sign key file */
125static char *iffpar_file = NULL; /* IFF parameters file */
126static char *gqpar_file = NULL;	/* GQ parameters file */
127static char *mvpar_file = NULL;	/* MV parameters file */
128static char *cert_file = NULL;	/* certificate file */
129static char *leap_file = NULL;	/* leapseconds file */
130static tstamp_t if_fstamp = 0;	/* IFF file stamp */
131static tstamp_t gq_fstamp = 0;	/* GQ file stamp */
132static tstamp_t mv_fstamp = 0;	/* MV file stamp */
133
134/*
135 * Cryptotypes
136 */
137static	int	crypto_verify	P((struct exten *, struct value *,
138				    struct peer *));
139static	int	crypto_encrypt	P((struct exten *, struct value *,
140				    keyid_t *));
141static	int	crypto_alice	P((struct peer *, struct value *));
142static	int	crypto_alice2	P((struct peer *, struct value *));
143static	int	crypto_alice3	P((struct peer *, struct value *));
144static	int	crypto_bob	P((struct exten *, struct value *));
145static	int	crypto_bob2	P((struct exten *, struct value *));
146static	int	crypto_bob3	P((struct exten *, struct value *));
147static	int	crypto_iff	P((struct exten *, struct peer *));
148static	int	crypto_gq	P((struct exten *, struct peer *));
149static	int	crypto_mv	P((struct exten *, struct peer *));
150static	u_int	crypto_send	P((struct exten *, struct value *));
151static	tstamp_t crypto_time	P((void));
152static	u_long	asn2ntp		P((ASN1_TIME *));
153static	struct cert_info *cert_parse P((u_char *, u_int, tstamp_t));
154static	int	cert_sign	P((struct exten *, struct value *));
155static	int	cert_valid	P((struct cert_info *, EVP_PKEY *));
156static	int	cert_install	P((struct exten *, struct peer *));
157static	void	cert_free	P((struct cert_info *));
158static	EVP_PKEY *crypto_key	P((char *, tstamp_t *));
159static	int	bighash		P((BIGNUM *, BIGNUM *));
160static	struct cert_info *crypto_cert P((char *));
161static	void	crypto_tai	P((char *));
162
163#ifdef SYS_WINNT
164int
165readlink(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 */
180keyid_t
181session_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 */
247void
248make_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 */
356int
357crypto_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 */
1138int
1139crypto_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 */
1427static int
1428crypto_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 */
1565static int
1566crypto_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 */
1629u_int
1630crypto_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 */
1710struct exten *
1711crypto_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 */
1757u_int
1758crypto_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 */
1812void
1813crypto_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 */
1901void
1902value_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 */
1917tstamp_t
1918crypto_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 */
1932u_long
1933asn2ntp	(
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 */
1968static int
1969bighash(
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 */
2041static int
2042crypto_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 */
2106static int
2107crypto_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 */
2199int
2200crypto_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 */
2330static int
2331crypto_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 */
2395static int
2396crypto_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 */
2488int
2489crypto_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 */
2642static int
2643crypto_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 */
2707static int
2708crypto_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 */
2805int
2806crypto_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 */
2898struct cert_info *		/* certificate information structure */
2899cert_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 */
3083static int
3084cert_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 */
3201int
3202cert_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 */
3236int
3237cert_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 */
3369void
3370cert_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 */
3403static EVP_PKEY *
3404crypto_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 */
3491static struct cert_info *	/* certificate information */
3492crypto_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 */
3586static void
3587crypto_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 */
3714void
3715crypto_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 */
3947void
3948crypto_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
4030int ntp_crypto_bs_pubkey;
4031# endif /* OPENSSL */
4032