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 AUTOKEY 9 #include <stdio.h> 10 #include <sys/types.h> 11 #include <unistd.h> 12 #include <fcntl.h> 13 14 #include "ntpd.h" 15 #include "ntp_stdlib.h" 16 #include "ntp_string.h" 17 #include "ntp_crypto.h" 18 19 #ifdef KERNEL_PLL 20 #include "ntp_syscall.h" 21 #endif /* KERNEL_PLL */ 22 23 /* 24 * Extension field message formats 25 * 26 * +-------+-------+ +-------+-------+ +-------+-------+ 27 * 0 | 3 | len | | 2,4 | len | | 5-9 | len | 28 * +-------+-------+ +-------+-------+ +-------+-------+ 29 * 1 | assocID | | assocID | | assocID | 30 * +---------------+ +---------------+ +---------------+ 31 * 2 | timestamp | | timestamp | | timestamp | 32 * +---------------+ +---------------+ +---------------+ 33 * 3 | final seq | | cookie/flags | | filestamp | 34 * +---------------+ +---------------+ +---------------+ 35 * 4 | final key | | signature len | | value len | 36 * +---------------+ +---------------+ +---------------+ 37 * 5 | signature len | | | | | 38 * +---------------+ = signature = = value = 39 * 6 | | | | | | 40 * = signature = +---------------+ +---------------+ 41 * 7 | | CRYPTO_ASSOC rsp | signature len | 42 * +---------------+ CRYPTO_PRIV rsp +---------------+ 43 * CRYPTO_AUTO rsp | | 44 * = signature = 45 * | | 46 * +---------------+ 47 * CRYPTO_DHPAR rsp 48 * CRYPTO_DH rsp 49 * CRYPTO_NAME rsp 50 * CRYPTO_CERT rsp 51 * CRYPTO_TAI rsp 52 * 53 * CRYPTO_STAT 1 - offer/select 54 * CRYPTO_ASSOC 2 20 association ID 55 * CRYPTO_AUTO 3 88 autokey values 56 * CRYPTO_PRIV 4 84 cookie value 57 * CRYPTO_DHPAR 5 220 agreement parameters 58 * CRYPTO_DH 6 152 public value 59 * CRYPTO_NAME 7 460 host name/public key 60 * CRYPTO_CERT 8 ? certificate 61 * CRYPTO_TAI 9 144 leapseconds table 62 * 63 * Note: requests carry the association ID of the receiver; responses 64 * carry the association ID of the sender. 65 */ 66 /* 67 * Minimum sizes of fields 68 */ 69 #define COOKIE_LEN (5 * 4) 70 #define AUTOKEY_LEN (6 * 4) 71 #define VALUE_LEN (6 * 4) 72 73 /* 74 * Global cryptodata in host byte order. 75 */ 76 u_int crypto_flags; /* status word */ 77 u_int sys_tai; /* current UTC offset from TAI */ 78 79 #ifdef PUBKEY 80 /* 81 * Cryptodefines 82 */ 83 #define TAI_1972 10 /* initial TAI offset */ 84 #define MAX_LEAP 100 /* max UTC leapseconds */ 85 #define MAX_LINLEN 1024 /* max line */ 86 #define MAX_KEYLEN 1024 /* max key */ 87 #define MAX_ENCLEN (ENCODED_CONTENT_LEN(1024)) /* max enc key */ 88 89 /* 90 * Private cryptodata in network byte order. 91 */ 92 static R_RSA_PRIVATE_KEY private_key; /* private key */ 93 static R_RSA_PUBLIC_KEY public_key; /* public key */ 94 static R_DH_PARAMS dh_params; /* agreement parameters */ 95 static u_char *dh_private; /* private value */ 96 static u_int dh_keyLen; /* private value length */ 97 static char *keysdir = NTP_KEYSDIR; /* crypto keys directory */ 98 static char *private_key_file = NULL; /* private key file */ 99 static char *public_key_file = NULL; /* public key file */ 100 static char *certif_file = NULL; /* certificate file */ 101 static char *dh_params_file = NULL; /* agreement parameters file */ 102 static char *tai_leap_file = NULL; /* leapseconds file */ 103 104 /* 105 * Global cryptodata in network byte order 106 */ 107 struct value host; /* host name/public key */ 108 struct value certif; /* certificate */ 109 struct value dhparam; /* agreement parameters */ 110 struct value dhpub; /* public value */ 111 struct value tai_leap; /* leapseconds table */ 112 113 /* 114 * Cryptotypes 115 */ 116 static u_int crypto_rsa P((char *, u_char *, u_int)); 117 static void crypto_cert P((char *)); 118 static void crypto_dh P((char *)); 119 static void crypto_tai P((char *)); 120 #endif /* PUBKEY */ 121 122 /* 123 * Autokey protocol status codes 124 */ 125 #define RV_OK 0 /* success */ 126 #define RV_LEN 1 /* invalid field length */ 127 #define RV_TSP 2 /* invalid timestamp */ 128 #define RV_FSP 3 /* invalid filestamp */ 129 #define RV_PUB 4 /* missing public key */ 130 #define RV_KEY 5 /* invalid RSA modulus */ 131 #define RV_SIG 6 /* invalid signature length */ 132 #define RV_DH 7 /* invalid agreement parameters */ 133 #define RV_FIL 8 /* missing or corrupted key file */ 134 #define RV_DAT 9 /* missing or corrupted data */ 135 #define RV_DEC 10 /* PEM decoding error */ 136 #define RV_DUP 11 /* duplicate flags */ 137 #define RV_VN 12 /* incorrect version */ 138 139 /* 140 * session_key - generate session key 141 * 142 * This routine generates a session key from the source address, 143 * destination address, key ID and private value. The value of the 144 * session key is the MD5 hash of these values, while the next key ID is 145 * the first four octets of the hash. 146 */ 147 keyid_t /* returns next key ID */ 148 session_key( 149 struct sockaddr_in *srcadr, /* source address */ 150 struct sockaddr_in *dstadr, /* destination address */ 151 keyid_t keyno, /* key ID */ 152 keyid_t private, /* private value */ 153 u_long lifetime /* key lifetime */ 154 ) 155 { 156 MD5_CTX ctx; /* MD5 context */ 157 keyid_t keyid; /* key identifer */ 158 u_int32 header[4]; /* data in network byte order */ 159 u_char digest[16]; /* message digest */ 160 161 /* 162 * Generate the session key and key ID. If the lifetime is 163 * greater than zero, install the key and call it trusted. 164 */ 165 header[0] = srcadr->sin_addr.s_addr; 166 header[1] = dstadr->sin_addr.s_addr; 167 header[2] = htonl(keyno); 168 header[3] = htonl(private); 169 MD5Init(&ctx); 170 MD5Update(&ctx, (u_char *)header, sizeof(header)); 171 MD5Final(digest, &ctx); 172 memcpy(&keyid, digest, 4); 173 keyid = ntohl(keyid); 174 if (lifetime != 0) { 175 MD5auth_setkey(keyno, digest, 16); 176 authtrust(keyno, lifetime); 177 } 178 #ifdef DEBUG 179 if (debug > 1) 180 printf( 181 "session_key: %s > %s %08x %08x hash %08x life %lu\n", 182 numtoa(header[0]), numtoa(header[1]), keyno, 183 private, keyid, lifetime); 184 #endif 185 return (keyid); 186 } 187 188 189 /* 190 * make_keylist - generate key list 191 * 192 * This routine constructs a pseudo-random sequence by repeatedly 193 * hashing the session key starting from a given source address, 194 * destination address, private value and the next key ID of the 195 * preceeding session key. The last entry on the list is saved along 196 * with its sequence number and public signature. 197 */ 198 void 199 make_keylist( 200 struct peer *peer, /* peer structure pointer */ 201 struct interface *dstadr /* interface */ 202 ) 203 { 204 struct autokey *ap; /* autokey pointer */ 205 keyid_t keyid; /* next key ID */ 206 keyid_t cookie; /* private value */ 207 l_fp tstamp; /* NTP timestamp */ 208 u_long ltemp; 209 int i; 210 #ifdef PUBKEY 211 R_SIGNATURE_CTX ctx; /* signature context */ 212 int rval; /* return value */ 213 u_int len; 214 #endif /* PUBKEY */ 215 216 /* 217 * Allocate the key list if necessary. 218 */ 219 L_CLR(&tstamp); 220 if (sys_leap != LEAP_NOTINSYNC) 221 get_systime(&tstamp); 222 if (peer->keylist == NULL) 223 peer->keylist = (keyid_t *)emalloc(sizeof(keyid_t) * 224 NTP_MAXSESSION); 225 226 /* 227 * Generate an initial key ID which is unique and greater than 228 * NTP_MAXKEY. 229 */ 230 while (1) { 231 keyid = (u_long)RANDOM & 0xffffffff; 232 if (keyid <= NTP_MAXKEY) 233 continue; 234 if (authhavekey(keyid)) 235 continue; 236 break; 237 } 238 239 /* 240 * Generate up to NTP_MAXSESSION session keys. Stop if the 241 * next one would not be unique or not a session key ID or if 242 * it would expire before the next poll. The private value 243 * included in the hash is zero if broadcast mode, the peer 244 * cookie if client mode or the host cookie if symmetric modes. 245 */ 246 ltemp = min(sys_automax, NTP_MAXSESSION * (1 << (peer->kpoll))); 247 peer->hcookie = session_key(&dstadr->sin, &peer->srcadr, 0, 248 sys_private, 0); 249 if (peer->hmode == MODE_BROADCAST) 250 cookie = 0; 251 else 252 cookie = peer->pcookie.key; 253 for (i = 0; i < NTP_MAXSESSION; i++) { 254 peer->keylist[i] = keyid; 255 peer->keynumber = i; 256 keyid = session_key(&dstadr->sin, &peer->srcadr, keyid, 257 cookie, ltemp); 258 ltemp -= 1 << peer->kpoll; 259 if (auth_havekey(keyid) || keyid <= NTP_MAXKEY || 260 ltemp <= (1 << (peer->kpoll))) 261 break; 262 } 263 264 /* 265 * Save the last session key ID, sequence number and timestamp, 266 * then sign these values for later retrieval by the clients. Be 267 * careful not to use invalid key media. 268 */ 269 ap = &peer->sndauto; 270 ap->tstamp = htonl(tstamp.l_ui); 271 ap->seq = htonl(peer->keynumber); 272 ap->key = htonl(keyid); 273 ap->siglen = 0; 274 #if DEBUG 275 if (debug) 276 printf("make_keys: %d %08x %08x ts %u poll %d\n", 277 ntohl(ap->seq), ntohl(ap->key), cookie, 278 ntohl(ap->tstamp), peer->kpoll); 279 #endif 280 #ifdef PUBKEY 281 if(!crypto_flags) 282 return; 283 if (ap->sig == NULL) 284 ap->sig = emalloc(private_key.bits / 8); 285 EVP_SignInit(&ctx, DA_MD5); 286 EVP_SignUpdate(&ctx, (u_char *)ap, 12); 287 rval = EVP_SignFinal(&ctx, ap->sig, &len, &private_key); 288 if (rval != RV_OK) 289 msyslog(LOG_ERR, "crypto: keylist signature fails %x", 290 rval); 291 else 292 ap->siglen = htonl(len); 293 peer->flags |= FLAG_ASSOC; 294 #endif /* PUBKEY */ 295 } 296 297 298 /* 299 * crypto_recv - parse extension fields 300 * 301 * This routine is called when the packet has been matched to an 302 * association and passed sanity, format and MAC checks. We believe the 303 * extension field values only if the field has proper format and 304 * length, the timestamp and filestamp are valid and the signature has 305 * valid length and is verified. There are a few cases where some values 306 * are believed even if the signature fails, but only if the authentic 307 * bit is not set. 308 */ 309 void 310 crypto_recv( 311 struct peer *peer, /* peer structure pointer */ 312 struct recvbuf *rbufp /* packet buffer pointer */ 313 ) 314 { 315 u_int32 *pkt; /* packet pointer */ 316 struct autokey *ap; /* autokey pointer */ 317 struct cookie *cp; /* cookie pointer */ 318 int has_mac; /* length of MAC field */ 319 int authlen; /* offset of MAC field */ 320 int len; /* extension field length */ 321 u_int code; /* extension field opcode */ 322 tstamp_t tstamp; /* timestamp */ 323 int i, rval; 324 u_int temp; 325 #ifdef PUBKEY 326 R_SIGNATURE_CTX ctx; /* signature context */ 327 struct value *vp; /* value pointer */ 328 u_char dh_key[MAX_KEYLEN]; /* agreed key */ 329 R_RSA_PUBLIC_KEY *kp; /* temporary public key pointer */ 330 tstamp_t fstamp; /* filestamp */ 331 u_int32 *pp; /* packet pointer */ 332 u_int rsalen = sizeof(R_RSA_PUBLIC_KEY) - sizeof(u_int) + 4; 333 u_int bits; 334 int j; 335 #ifdef KERNEL_PLL 336 #if NTP_API > 3 337 struct timex ntv; /* kernel interface structure */ 338 #endif /* NTP_API */ 339 #endif /* KERNEL_PLL */ 340 #endif /* PUBKEY */ 341 342 /* 343 * Initialize. Note that the packet has already been checked for 344 * valid format and extension field lengths. We first extract 345 * the field length, command code and timestamp in host byte 346 * order. These are used with all commands and modes. We discard 347 * old timestamps and filestamps; but, for duplicate timestamps 348 * we discard only if the authentic bit is set. Cute. 349 */ 350 pkt = (u_int32 *)&rbufp->recv_pkt; 351 authlen = LEN_PKT_NOMAC; 352 while ((has_mac = rbufp->recv_length - authlen) > MAX_MAC_LEN) { 353 i = authlen / 4; 354 len = ntohl(pkt[i]) & 0xffff; 355 code = (ntohl(pkt[i]) >> 16) & 0xffff; 356 temp = (code >> 8) & 0x3f; 357 if (temp != CRYPTO_VN) { 358 sys_unknownversion++; 359 #ifdef DEBUG 360 if (debug) 361 printf( 362 "crypto_recv: incorrect version %d should be %d\n", 363 temp, CRYPTO_VN); 364 #endif 365 return; 366 } 367 tstamp = ntohl(pkt[i + 2]); 368 #ifdef DEBUG 369 if (debug) 370 printf( 371 "crypto_recv: ext offset %d len %d code %x assocID %d\n", 372 authlen, len, code, (u_int32)ntohl(pkt[i + 373 1])); 374 #endif 375 switch (code) { 376 377 /* 378 * Install association ID and status word. 379 */ 380 case CRYPTO_ASSOC | CRYPTO_RESP: 381 cp = (struct cookie *)&pkt[i + 2]; 382 temp = ntohl(cp->key); 383 if (len < COOKIE_LEN) { 384 rval = RV_LEN; 385 } else if (tstamp == 0) { 386 rval = RV_TSP; 387 } else { 388 if (!peer->crypto) 389 peer->crypto = temp; 390 if (ntohl(pkt[i + 1]) != 0) 391 peer->assoc = ntohl(pkt[i + 1]); 392 rval = RV_OK; 393 } 394 #ifdef DEBUG 395 if (debug) 396 printf( 397 "crypto_recv: verify %d flags 0x%x ts %u\n", 398 rval, temp, tstamp); 399 #endif 400 break; 401 402 /* 403 * Install autokey values in broadcast client and 404 * symmetric modes. 405 */ 406 case CRYPTO_AUTO | CRYPTO_RESP: 407 if (!(peer->flags & FLAG_AUTOKEY) && 408 ntohl(pkt[i + 1]) != 0) 409 peer->assoc = ntohl(pkt[i + 1]); 410 ap = (struct autokey *)&pkt[i + 2]; 411 #ifdef PUBKEY 412 temp = ntohl(ap->siglen); 413 kp = (R_RSA_PUBLIC_KEY *)peer->pubkey.ptr; 414 if (len < AUTOKEY_LEN) { 415 rval = RV_LEN; 416 } else if (tstamp == 0 || tstamp < 417 peer->recauto.tstamp || (tstamp == 418 peer->recauto.tstamp && (peer->flags & 419 FLAG_AUTOKEY))) { 420 rval = RV_TSP; 421 } else if (!crypto_flags) { 422 rval = RV_OK; 423 } else if (kp == NULL) { 424 rval = RV_PUB; 425 } else if (temp != kp->bits / 8) { 426 rval = RV_SIG; 427 } else { 428 EVP_VerifyInit(&ctx, DA_MD5); 429 EVP_VerifyUpdate(&ctx, (u_char *)ap, 430 12); 431 rval = EVP_VerifyFinal(&ctx, 432 (u_char *)ap->pkt, temp, kp); 433 } 434 #else /* PUBKEY */ 435 if (tstamp < peer->recauto.tstamp || (tstamp == 436 peer->recauto.tstamp && (peer->flags & 437 FLAG_AUTOKEY))) 438 rval = RV_TSP; 439 else 440 rval = RV_OK; 441 #endif /* PUBKEY */ 442 #ifdef DEBUG 443 if (debug) 444 printf( 445 "crypto_recv: verify %x autokey %d %08x ts %u (%u)\n", 446 rval, ntohl(ap->seq), 447 ntohl(ap->key), tstamp, 448 peer->recauto.tstamp); 449 #endif 450 if (rval != RV_OK) { 451 if (rval != RV_TSP) 452 msyslog(LOG_ERR, 453 "crypto: %x autokey %d %08x ts %u (%u)\n", 454 rval, ntohl(ap->seq), 455 ntohl(ap->key), tstamp, 456 peer->recauto.tstamp); 457 break; 458 } 459 peer->flags |= FLAG_AUTOKEY; 460 peer->flash &= ~TEST10; 461 peer->assoc = ntohl(pkt[i + 1]); 462 peer->recauto.tstamp = tstamp; 463 peer->recauto.seq = ntohl(ap->seq); 464 peer->recauto.key = ntohl(ap->key); 465 peer->pkeyid = peer->recauto.key; 466 break; 467 468 /* 469 * Install session cookie in client mode. Use this also 470 * in symmetric modes for test when rsaref20 has not 471 * been installed. 472 */ 473 case CRYPTO_PRIV: 474 peer->cmmd = ntohl(pkt[i]); 475 /* fall through */ 476 477 case CRYPTO_PRIV | CRYPTO_RESP: 478 cp = (struct cookie *)&pkt[i + 2]; 479 #ifdef PUBKEY 480 temp = ntohl(cp->siglen); 481 kp = (R_RSA_PUBLIC_KEY *)peer->pubkey.ptr; 482 if (len < COOKIE_LEN) { 483 rval = RV_LEN; 484 } else if (tstamp == 0 || tstamp < 485 peer->pcookie.tstamp || (tstamp == 486 peer->pcookie.tstamp && (peer->flags & 487 FLAG_AUTOKEY))) { 488 rval = RV_TSP; 489 } else if (!crypto_flags) { 490 rval = RV_OK; 491 } else if (kp == NULL) { 492 rval = RV_PUB; 493 } else if (temp != kp->bits / 8) { 494 rval = RV_SIG; 495 } else { 496 EVP_VerifyInit(&ctx, DA_MD5); 497 EVP_VerifyUpdate(&ctx, (u_char *)cp, 8); 498 rval = EVP_VerifyFinal(&ctx, 499 (u_char *)cp->pkt, temp, kp); 500 } 501 #else /* PUBKEY */ 502 if (tstamp <= peer->pcookie.tstamp || (tstamp == 503 peer->pcookie.tstamp && (peer->flags & 504 FLAG_AUTOKEY))) 505 rval = RV_TSP; 506 else 507 rval = RV_OK; 508 #endif /* PUBKEY */ 509 510 /* 511 * Tricky here. If in client mode, use the 512 * server cookie; otherwise, use EXOR of both 513 * peer cookies. We call this Daffy-Hooligan 514 * agreement. 515 */ 516 if (peer->hmode == MODE_CLIENT) 517 temp = ntohl(cp->key); 518 else 519 temp = ntohl(cp->key) ^ peer->hcookie; 520 #ifdef DEBUG 521 if (debug) 522 printf( 523 "crypto_recv: verify %x cookie %08x ts %u (%u)\n", 524 rval, temp, tstamp, 525 peer->pcookie.tstamp); 526 #endif 527 if (rval != RV_OK) { 528 if (rval != RV_TSP) 529 msyslog(LOG_ERR, 530 "crypto: %x cookie %08x ts %u (%u)\n", 531 rval, temp, tstamp, 532 peer->pcookie.tstamp); 533 peer->cmmd |= CRYPTO_ERROR; 534 break; 535 } 536 if (!(peer->cast_flags & MDF_BCLNT)) 537 peer->flags |= FLAG_AUTOKEY; 538 peer->flash &= ~TEST10; 539 peer->assoc = ntohl(pkt[i + 1]); 540 peer->pcookie.tstamp = tstamp; 541 if (temp != peer->pcookie.key) { 542 peer->pcookie.key = temp; 543 key_expire(peer); 544 } 545 break; 546 547 /* 548 * The following commands and responses work only when 549 * public-key cryptography has been configured. If 550 * configured, but disabled due to no crypto command in 551 * the configuration file, they are ignored. 552 */ 553 #ifdef PUBKEY 554 /* 555 * Install public key and host name. 556 */ 557 case CRYPTO_NAME | CRYPTO_RESP: 558 if (!crypto_flags) 559 break; 560 vp = (struct value *)&pkt[i + 2]; 561 fstamp = ntohl(vp->fstamp); 562 temp = ntohl(vp->vallen); 563 j = i + 5 + ntohl(vp->vallen) / 4; 564 bits = ntohl(pkt[i + 5]); 565 if (len < VALUE_LEN) { 566 rval = RV_LEN; 567 } else if (temp < rsalen || bits < 568 MIN_RSA_MODULUS_BITS || bits > 569 MAX_RSA_MODULUS_BITS) { 570 rval = RV_KEY; 571 } else if (ntohl(pkt[j]) != bits / 8) { 572 rval = RV_SIG; 573 } else if (tstamp == 0 || tstamp < 574 peer->pubkey.tstamp || (tstamp == 575 peer->pubkey.tstamp && (peer->flags & 576 FLAG_AUTOKEY))) { 577 rval = RV_TSP; 578 } else if (tstamp < peer->pubkey.fstamp || 579 fstamp < peer->pubkey.fstamp) { 580 rval = RV_FSP; 581 } else if (fstamp == peer->pubkey.fstamp && 582 (peer->flags & FLAG_AUTOKEY)) { 583 rval = RV_FSP; 584 } else { 585 EVP_VerifyInit(&ctx, DA_MD5); 586 EVP_VerifyUpdate(&ctx, (u_char *)vp, 587 temp + 12); 588 kp = emalloc(sizeof(R_RSA_PUBLIC_KEY)); 589 kp->bits = bits; 590 memcpy(kp->modulus, &pkt[i + 6], 591 rsalen - 4); 592 rval = EVP_VerifyFinal(&ctx, 593 (u_char *)&pkt[j + 1], 594 ntohl(pkt[j]), kp); 595 if (rval != 0) { 596 free(kp); 597 } else { 598 j = i + 5 + rsalen / 4; 599 peer->pubkey.ptr = (u_char *)kp; 600 temp = strlen((char *)&pkt[j]); 601 peer->keystr = emalloc(temp + 602 1); 603 strcpy(peer->keystr, 604 (char *)&pkt[j]); 605 peer->pubkey.tstamp = tstamp; 606 peer->pubkey.fstamp = fstamp; 607 peer->flash &= ~TEST10; 608 if (!(peer->crypto & 609 CRYPTO_FLAG_CERT)) 610 peer->flags |= 611 FLAG_PROVEN; 612 } 613 } 614 #ifdef DEBUG 615 if (debug) 616 617 printf( 618 "crypto_recv: verify %x host %s ts %u fs %u\n", 619 rval, (char *)&pkt[i + 5 + rsalen / 620 4], tstamp, fstamp); 621 #endif 622 if (rval != RV_OK) { 623 if (rval != RV_TSP) 624 msyslog(LOG_ERR, 625 "crypto: %x host %s ts %u fs %u\n", 626 rval, (char *)&pkt[i + 5 + 627 rsalen / 4], tstamp, 628 fstamp); 629 } 630 break; 631 632 /* 633 * Install certificate. 634 */ 635 case CRYPTO_CERT | CRYPTO_RESP: 636 if (!crypto_flags) 637 break; 638 vp = (struct value *)&pkt[i + 2]; 639 fstamp = ntohl(vp->fstamp); 640 temp = ntohl(vp->vallen); 641 kp = (R_RSA_PUBLIC_KEY *)peer->pubkey.ptr; 642 j = i + 5 + temp / 4; 643 if (len < VALUE_LEN) { 644 rval = RV_LEN; 645 } else if (kp == NULL) { 646 rval = RV_PUB; 647 } else if (ntohl(pkt[j]) != kp->bits / 8) { 648 rval = RV_SIG; 649 } else if (tstamp == 0) { 650 rval = RV_TSP; 651 } else if (tstamp < 652 ntohl(peer->certif.fstamp) || fstamp < 653 ntohl(peer->certif.fstamp)) { 654 rval = RV_FSP; 655 } else if (fstamp == 656 ntohl(peer->certif.fstamp) && (peer->flags & 657 FLAG_AUTOKEY)) { 658 peer->crypto &= ~CRYPTO_FLAG_CERT; 659 rval = RV_FSP; 660 } else { 661 EVP_VerifyInit(&ctx, DA_MD5); 662 EVP_VerifyUpdate(&ctx, (u_char *)vp, 663 temp + 12); 664 rval = EVP_VerifyFinal(&ctx, 665 (u_char *)&pkt[j + 1], 666 ntohl(pkt[j]), kp); 667 } 668 #ifdef DEBUG 669 if (debug) 670 printf( 671 "crypto_recv: verify %x certificate %u ts %u fs %u\n", 672 rval, temp, tstamp, fstamp); 673 #endif 674 675 /* 676 * If the peer data are newer than the host 677 * data, replace the host data. Otherwise, 678 * wait for the peer to fetch the host data. 679 */ 680 if (rval != RV_OK || temp == 0) { 681 if (rval != RV_TSP) 682 msyslog(LOG_ERR, 683 "crypto: %x certificate %u ts %u fs %u\n", 684 rval, temp, tstamp, fstamp); 685 break; 686 } 687 peer->flash &= ~TEST10; 688 peer->flags |= FLAG_PROVEN; 689 peer->crypto &= ~CRYPTO_FLAG_CERT; 690 691 /* 692 * Initialize agreement parameters and extension 693 * field in network byte order. Note the private 694 * key length is set arbitrarily at half the 695 * prime length. 696 */ 697 peer->certif.tstamp = vp->tstamp; 698 peer->certif.fstamp = vp->fstamp; 699 peer->certif.vallen = vp->vallen; 700 if (peer->certif.ptr == NULL) 701 free(peer->certif.ptr); 702 peer->certif.ptr = emalloc(temp); 703 memcpy(peer->certif.ptr, vp->pkt, temp); 704 crypto_agree(); 705 break; 706 707 /* 708 * Install agreement parameters in symmetric modes. 709 */ 710 case CRYPTO_DHPAR | CRYPTO_RESP: 711 if (!crypto_flags) 712 break; 713 vp = (struct value *)&pkt[i + 2]; 714 fstamp = ntohl(vp->fstamp); 715 temp = ntohl(vp->vallen); 716 kp = (R_RSA_PUBLIC_KEY *)peer->pubkey.ptr; 717 j = i + 5 + temp / 4; 718 if (len < VALUE_LEN) { 719 rval = RV_LEN; 720 } else if (kp == NULL) { 721 rval = RV_PUB; 722 } else if (ntohl(pkt[j]) != kp->bits / 8) { 723 rval = RV_SIG; 724 } else if (tstamp == 0) { 725 rval = RV_TSP; 726 } else if (tstamp < ntohl(dhparam.fstamp) || 727 fstamp < ntohl(dhparam.fstamp)) { 728 rval = RV_FSP; 729 } else if (fstamp == ntohl(dhparam.fstamp) && 730 (peer->flags & FLAG_AUTOKEY)) { 731 peer->crypto &= ~CRYPTO_FLAG_DH; 732 rval = RV_FSP; 733 } else { 734 EVP_VerifyInit(&ctx, DA_MD5); 735 EVP_VerifyUpdate(&ctx, (u_char *)vp, 736 temp + 12); 737 rval = EVP_VerifyFinal(&ctx, 738 (u_char *)&pkt[j + 1], 739 ntohl(pkt[j]), kp); 740 } 741 #ifdef DEBUG 742 if (debug) 743 printf( 744 "crypto_recv: verify %x parameters %u ts %u fs %u\n", 745 rval, temp, tstamp, fstamp); 746 #endif 747 748 /* 749 * If the peer data are newer than the host 750 * data, replace the host data. Otherwise, 751 * wait for the peer to fetch the host data. 752 */ 753 if (rval != RV_OK || temp == 0) { 754 if (rval != RV_TSP) 755 msyslog(LOG_ERR, 756 "crypto: %x parameters %u ts %u fs %u\n", 757 rval, temp, tstamp, fstamp); 758 break; 759 } 760 peer->flash &= ~TEST10; 761 crypto_flags |= CRYPTO_FLAG_DH; 762 peer->crypto &= ~CRYPTO_FLAG_DH; 763 764 /* 765 * Initialize agreement parameters and extension 766 * field in network byte order. Note the private 767 * key length is set arbitrarily at half the 768 * prime length. 769 */ 770 dhparam.tstamp = vp->tstamp; 771 dhparam.fstamp = vp->fstamp; 772 dhparam.vallen = vp->vallen; 773 if (dhparam.ptr != NULL) 774 free(dhparam.ptr); 775 pp = emalloc(temp); 776 dhparam.ptr = (u_char *)pp; 777 memcpy(pp, vp->pkt, temp); 778 dh_params.primeLen = ntohl(*pp++); 779 dh_params.prime = (u_char *)pp; 780 pp += dh_params.primeLen / 4; 781 dh_params.generatorLen = ntohl(*pp++); 782 dh_params.generator = (u_char *)pp; 783 dh_keyLen = dh_params.primeLen / 2; 784 if (dh_private != NULL) 785 free(dh_private); 786 dh_private = emalloc(dh_keyLen); 787 if (dhparam.sig == NULL) 788 dhparam.sig = emalloc(private_key.bits / 789 8); 790 791 /* 792 * Initialize public value extension field. 793 */ 794 dhpub.tstamp = vp->tstamp; 795 dhpub.fstamp = vp->fstamp; 796 dhpub.vallen = htonl(dh_params.primeLen); 797 if (dhpub.ptr != NULL) 798 free(dhpub.ptr); 799 dhpub.ptr = emalloc(dh_params.primeLen); 800 if (dhpub.sig == NULL) 801 dhpub.sig = emalloc(private_key.bits / 802 8); 803 crypto_agree(); 804 break; 805 806 /* 807 * Verify public value and compute agreed key in 808 * symmetric modes. 809 */ 810 case CRYPTO_DH: 811 peer->cmmd = ntohl(pkt[i]); 812 if (!crypto_flags) 813 peer->cmmd |= CRYPTO_ERROR; 814 /* fall through */ 815 816 case CRYPTO_DH | CRYPTO_RESP: 817 if (!crypto_flags) 818 break; 819 vp = (struct value *)&pkt[i + 2]; 820 fstamp = ntohl(vp->fstamp); 821 temp = ntohl(vp->vallen); 822 kp = (R_RSA_PUBLIC_KEY *)peer->pubkey.ptr; 823 j = i + 5 + temp / 4; 824 if (len < VALUE_LEN) { 825 rval = RV_LEN; 826 } else if (temp != dh_params.primeLen) { 827 rval = RV_DH; 828 } else if (kp == NULL) { 829 rval = RV_PUB; 830 } else if (ntohl(pkt[j]) != kp->bits / 8) { 831 rval = RV_SIG; 832 } else if (tstamp == 0 || tstamp < 833 peer->pcookie.tstamp || (tstamp == 834 peer->pcookie.tstamp && (peer->flags & 835 FLAG_AUTOKEY))) { 836 rval = RV_TSP; 837 } else { 838 EVP_VerifyInit(&ctx, DA_MD5); 839 EVP_VerifyUpdate(&ctx, (u_char *)vp, 840 temp + 12); 841 rval = EVP_VerifyFinal(&ctx, 842 (u_char *)&pkt[j + 1], 843 ntohl(pkt[j]), kp); 844 } 845 846 /* 847 * Run the agreement algorithm and stash the key 848 * value. We use only the first u_int32 for the 849 * host cookie. Wasteful. If the association ID 850 * is zero, the other guy hasn't seen us as 851 * synchronized, in which case both of us should 852 * be using a zero cookie. 853 */ 854 if (rval != RV_OK) { 855 temp = 0; 856 } else if (fstamp > dhparam.fstamp) { 857 crypto_flags &= ~CRYPTO_FLAG_DH; 858 rval = RV_FSP; 859 } else { 860 rval = R_ComputeDHAgreedKey(dh_key, 861 (u_char *)&pkt[i + 5], dh_private, 862 dh_keyLen, &dh_params); 863 temp = ntohl(*(u_int32 *)dh_key); 864 } 865 #ifdef DEBUG 866 if (debug) 867 printf( 868 "crypto_recv: verify %x agreement %08x ts %u (%u) fs %u\n", 869 rval, temp, tstamp, 870 peer->pcookie.tstamp, fstamp); 871 #endif 872 if (rval != RV_OK) { 873 if (rval != RV_TSP) 874 msyslog(LOG_ERR, 875 "crypto: %x agreement %08x ts %u (%u) fs %u\n", 876 rval, temp, tstamp, 877 peer->pcookie.tstamp, 878 fstamp); 879 peer->cmmd |= CRYPTO_ERROR; 880 break; 881 } 882 peer->flash &= ~TEST10; 883 peer->flags &= ~FLAG_AUTOKEY; 884 peer->assoc = ntohl(pkt[i + 1]); 885 peer->pcookie.tstamp = tstamp; 886 if (temp != peer->pcookie.key) { 887 peer->pcookie.key = temp; 888 key_expire(peer); 889 } 890 break; 891 892 /* 893 * Install leapseconds table. 894 */ 895 case CRYPTO_TAI | CRYPTO_RESP: 896 if (!crypto_flags) 897 break; 898 vp = (struct value *)&pkt[i + 2]; 899 fstamp = ntohl(vp->fstamp); 900 temp = ntohl(vp->vallen); 901 kp = (R_RSA_PUBLIC_KEY *)peer->pubkey.ptr; 902 j = i + 5 + temp / 4; 903 if (len < VALUE_LEN) { 904 rval = RV_LEN; 905 } if (kp == NULL) { 906 rval = RV_PUB; 907 } else if (ntohl(pkt[j]) != kp->bits / 8) { 908 rval = RV_SIG; 909 } else if (tstamp == 0) { 910 rval = RV_TSP; 911 } else if (tstamp < ntohl(tai_leap.fstamp) || 912 fstamp < ntohl(tai_leap.fstamp)) { 913 rval = RV_FSP; 914 } else if (fstamp == ntohl(tai_leap.fstamp) && 915 (peer->flags & FLAG_AUTOKEY)) { 916 peer->crypto &= ~CRYPTO_FLAG_TAI; 917 rval = RV_FSP; 918 } else { 919 EVP_VerifyInit(&ctx, DA_MD5); 920 EVP_VerifyUpdate(&ctx, (u_char *)vp, 921 temp + 12); 922 rval = EVP_VerifyFinal(&ctx, 923 (u_char *)&pkt[j + 1], 924 ntohl(pkt[j]), kp); 925 } 926 #ifdef DEBUG 927 if (debug) 928 printf( 929 "crypto_recv: verify %x leapseconds %u ts %u fs %u\n", 930 rval, temp, tstamp, fstamp); 931 #endif 932 933 /* 934 * If the peer data are newer than the host 935 * data, replace the host data. Otherwise, 936 * wait for the peer to fetch the host data. 937 */ 938 if (rval != RV_OK || temp == 0) { 939 if (rval != RV_TSP) 940 msyslog(LOG_ERR, 941 "crypto: %x leapseconds %u ts %u fs %u\n", 942 rval, temp, tstamp, fstamp); 943 break; 944 } 945 peer->flash &= ~TEST10; 946 crypto_flags |= CRYPTO_FLAG_TAI; 947 peer->crypto &= ~CRYPTO_FLAG_TAI; 948 sys_tai = temp / 4 + TAI_1972 - 1; 949 #ifdef KERNEL_PLL 950 #if NTP_API > 3 951 ntv.modes = MOD_TAI; 952 ntv.constant = sys_tai; 953 if (ntp_adjtime(&ntv) == TIME_ERROR) 954 msyslog(LOG_ERR, 955 "kernel TAI update failed"); 956 #endif /* NTP_API */ 957 #endif /* KERNEL_PLL */ 958 959 /* 960 * Initialize leapseconds table and extension 961 * field in network byte order. 962 */ 963 tai_leap.tstamp = vp->tstamp; 964 tai_leap.fstamp = vp->fstamp; 965 tai_leap.vallen = vp->vallen; 966 if (tai_leap.ptr == NULL) 967 free(tai_leap.ptr); 968 tai_leap.ptr = emalloc(temp); 969 memcpy(tai_leap.ptr, vp->pkt, temp); 970 if (tai_leap.sig == NULL) 971 tai_leap.sig = 972 emalloc(private_key.bits / 8); 973 crypto_agree(); 974 break; 975 #endif /* PUBKEY */ 976 977 /* 978 * For other requests, save the request code for later; 979 * for unknown responses or errors, just ignore for now. 980 */ 981 default: 982 if (code & (CRYPTO_RESP | CRYPTO_ERROR)) 983 break; 984 peer->cmmd = ntohl(pkt[i]); 985 break; 986 987 } 988 authlen += len; 989 } 990 } 991 992 993 /* 994 * crypto_xmit - construct extension fields 995 * 996 * This routine is called both when an association is configured and 997 * when one is not. The only case where this matters now is to retrieve 998 * the autokey information, in which case the caller has to provide the 999 * association ID to match the association. 1000 */ 1001 int /* return length of extension field */ 1002 crypto_xmit( 1003 u_int32 *xpkt, /* packet pointer */ 1004 int start, /* offset to extension field */ 1005 u_int code, /* extension field code */ 1006 keyid_t cookie, /* session cookie */ 1007 u_int associd /* association ID */ 1008 ) 1009 { 1010 struct peer *peer; /* peer structure pointer */ 1011 struct autokey *ap; /* autokey pointer */ 1012 struct cookie *cp; /* cookie pointer */ 1013 int len; /* extension field length */ 1014 u_int opcode; /* extension field opcode */ 1015 int i; 1016 #ifdef PUBKEY 1017 R_SIGNATURE_CTX ctx; /* signature context */ 1018 struct value *vp; /* value pointer */ 1019 int rval; /* return value */ 1020 u_int temp; 1021 int j; 1022 #endif /* PUBKEY */ 1023 1024 /* 1025 * Generate the requested extension field request code, length 1026 * and association ID. Note that several extension fields are 1027 * used with and without public-key cryptography. If public-key 1028 * cryptography has not been configured, we do the same thing, 1029 * but leave off the signature. 1030 */ 1031 i = start / 4; 1032 opcode = code; 1033 xpkt[i + 1] = htonl(associd); 1034 len = 8; 1035 switch (opcode) { 1036 1037 /* 1038 * Send association ID, timestamp and status word. 1039 */ 1040 case CRYPTO_ASSOC | CRYPTO_RESP: 1041 cp = (struct cookie *)&xpkt[i + 2]; 1042 #ifdef PUBKEY 1043 cp->tstamp = host.tstamp; 1044 #else 1045 cp->tstamp = 0; 1046 #endif /* PUBKEY */ 1047 cp->key = htonl(crypto_flags); 1048 cp->siglen = 0; 1049 len += 12; 1050 break; 1051 1052 /* 1053 * Find peer and send autokey data and signature in broadcast 1054 * server and symmetric modes. If no association is found, 1055 * either the server has restarted with new associations or some 1056 * perp has replayed an old message. 1057 */ 1058 case CRYPTO_AUTO | CRYPTO_RESP: 1059 peer = findpeerbyassoc(associd); 1060 if (peer == NULL) { 1061 opcode |= CRYPTO_ERROR; 1062 break; 1063 } 1064 peer->flags &= ~FLAG_ASSOC; 1065 ap = (struct autokey *)&xpkt[i + 2]; 1066 ap->tstamp = peer->sndauto.tstamp; 1067 ap->seq = peer->sndauto.seq; 1068 ap->key = peer->sndauto.key; 1069 ap->siglen = peer->sndauto.siglen; 1070 len += 16; 1071 #ifdef PUBKEY 1072 if (!crypto_flags) 1073 break; 1074 temp = ntohl(ap->siglen); 1075 if (temp != 0) 1076 memcpy(ap->pkt, peer->sndauto.sig, temp); 1077 len += temp; 1078 #endif /* PUBKEY */ 1079 break; 1080 1081 /* 1082 * Send peer cookie and signature in server mode. 1083 */ 1084 case CRYPTO_PRIV: 1085 case CRYPTO_PRIV | CRYPTO_RESP: 1086 cp = (struct cookie *)&xpkt[i + 2]; 1087 cp->key = htonl(cookie); 1088 cp->siglen = 0; 1089 len += 12; 1090 #ifdef PUBKEY 1091 cp->tstamp = host.tstamp; 1092 if (!crypto_flags) 1093 break; 1094 EVP_SignInit(&ctx, DA_MD5); 1095 EVP_SignUpdate(&ctx, (u_char *)cp, 8); 1096 rval = EVP_SignFinal(&ctx, (u_char *)cp->pkt, &temp, 1097 &private_key); 1098 if (rval != RV_OK) { 1099 msyslog(LOG_ERR, 1100 "crypto: cookie signature fails %x", rval); 1101 break; 1102 } 1103 cp->siglen = htonl(temp); 1104 len += temp; 1105 #endif /* PUBKEY */ 1106 break; 1107 1108 #ifdef PUBKEY 1109 /* 1110 * The following commands and responses work only when public- 1111 * key cryptography has been configured. If configured, but 1112 * disabled due to no crypto command in the configuration file, 1113 * they are ignored and an error response is returned. 1114 */ 1115 /* 1116 * Send certificate, timestamp and signature. 1117 */ 1118 case CRYPTO_CERT | CRYPTO_RESP: 1119 if (!crypto_flags) { 1120 opcode |= CRYPTO_ERROR; 1121 break; 1122 } 1123 vp = (struct value *)&xpkt[i + 2]; 1124 vp->tstamp = certif.tstamp; 1125 vp->fstamp = certif.fstamp; 1126 vp->vallen = 0; 1127 len += 12; 1128 temp = ntohl(certif.vallen); 1129 if (temp == 0) 1130 break; 1131 vp->vallen = htonl(temp); 1132 memcpy(vp->pkt, certif.ptr, temp); 1133 len += temp; 1134 j = i + 5 + temp / 4; 1135 temp = public_key.bits / 8; 1136 xpkt[j++] = htonl(temp); 1137 memcpy(&xpkt[j], certif.sig, temp); 1138 len += temp + 4; 1139 break; 1140 1141 /* 1142 * Send agreement parameters, timestamp and signature. 1143 */ 1144 case CRYPTO_DHPAR | CRYPTO_RESP: 1145 if (!crypto_flags) { 1146 opcode |= CRYPTO_ERROR; 1147 break; 1148 } 1149 vp = (struct value *)&xpkt[i + 2]; 1150 vp->tstamp = dhparam.tstamp; 1151 vp->fstamp = dhparam.fstamp; 1152 vp->vallen = 0; 1153 len += 12; 1154 temp = ntohl(dhparam.vallen); 1155 if (temp == 0) 1156 break; 1157 vp->vallen = htonl(temp); 1158 memcpy(vp->pkt, dhparam.ptr, temp); 1159 len += temp; 1160 j = i + 5 + temp / 4; 1161 temp = public_key.bits / 8; 1162 xpkt[j++] = htonl(temp); 1163 memcpy(&xpkt[j], dhparam.sig, temp); 1164 len += temp + 4; 1165 break; 1166 1167 /* 1168 * Send public value, timestamp and signature. 1169 */ 1170 case CRYPTO_DH: 1171 case CRYPTO_DH | CRYPTO_RESP: 1172 if (!crypto_flags) { 1173 opcode |= CRYPTO_ERROR; 1174 break; 1175 } 1176 vp = (struct value *)&xpkt[i + 2]; 1177 vp->tstamp = dhpub.tstamp; 1178 vp->fstamp = dhpub.fstamp; 1179 vp->vallen = 0; 1180 len += 12; 1181 temp = ntohl(dhpub.vallen); 1182 if (temp == 0) 1183 break; 1184 vp->vallen = htonl(temp); 1185 memcpy(vp->pkt, dhpub.ptr, temp); 1186 len += temp; 1187 j = i + 5 + temp / 4; 1188 temp = public_key.bits / 8; 1189 xpkt[j++] = htonl(temp); 1190 memcpy(&xpkt[j], dhpub.sig, temp); 1191 len += temp + 4; 1192 break; 1193 1194 /* 1195 * Send public key, host name, timestamp and signature. 1196 */ 1197 case CRYPTO_NAME | CRYPTO_RESP: 1198 if (!crypto_flags) { 1199 opcode |= CRYPTO_ERROR; 1200 break; 1201 } 1202 vp = (struct value *)&xpkt[i + 2]; 1203 vp->tstamp = host.tstamp; 1204 vp->fstamp = host.fstamp; 1205 vp->vallen = 0; 1206 len += 12; 1207 temp = ntohl(host.vallen); 1208 if (temp == 0) 1209 break; 1210 vp->vallen = htonl(temp); 1211 memcpy(vp->pkt, host.ptr, temp); 1212 len += temp; 1213 j = i + 5 + temp / 4; 1214 temp = public_key.bits / 8; 1215 xpkt[j++] = htonl(temp); 1216 memcpy(&xpkt[j], host.sig, temp); 1217 len += temp + 4; 1218 break; 1219 1220 /* 1221 * Send leapseconds table, timestamp and signature. 1222 */ 1223 case CRYPTO_TAI | CRYPTO_RESP: 1224 if (!crypto_flags) { 1225 opcode |= CRYPTO_ERROR; 1226 break; 1227 } 1228 vp = (struct value *)&xpkt[i + 2]; 1229 vp->tstamp = tai_leap.tstamp; 1230 vp->fstamp = tai_leap.fstamp; 1231 vp->vallen = 0; 1232 len += 12; 1233 temp = ntohl(tai_leap.vallen); 1234 if (temp == 0) 1235 break; 1236 vp->vallen = htonl(temp); 1237 memcpy(vp->pkt, tai_leap.ptr, temp); 1238 len += temp; 1239 j = i + 5 + temp / 4; 1240 temp = public_key.bits / 8; 1241 xpkt[j++] = htonl(temp); 1242 memcpy(&xpkt[j], tai_leap.sig, temp); 1243 len += temp + 4; 1244 break; 1245 #endif /* PUBKEY */ 1246 1247 /* 1248 * Default - Fall through for requests; for unknown responses, 1249 * flag as error. 1250 */ 1251 default: 1252 if (opcode & CRYPTO_RESP) 1253 opcode |= CRYPTO_ERROR; 1254 break; 1255 } 1256 1257 /* 1258 * Round up the field length to a multiple of 8 octets and save 1259 * the request code and length. 1260 */ 1261 len = ((len + 7) / 8) * 8; 1262 if (len >= 4) { 1263 xpkt[i] = htonl((u_int32)((opcode << 16) | len)); 1264 #ifdef DEBUG 1265 if (debug) 1266 printf( 1267 "crypto_xmit: ext offset %d len %d code %x assocID %d\n", 1268 start, len, code, associd); 1269 #endif 1270 } 1271 return (len); 1272 } 1273 1274 #ifdef PUBKEY 1275 /* 1276 * crypto_setup - load private key, public key, optional agreement 1277 * parameters and optional leapseconds table, then initialize extension 1278 * fields for later signatures. 1279 */ 1280 void 1281 crypto_setup(void) 1282 { 1283 char filename[MAXFILENAME]; 1284 u_int fstamp; /* filestamp */ 1285 u_int len, temp; 1286 u_int32 *pp; 1287 1288 /* 1289 * Initialize structures. 1290 */ 1291 memset(&private_key, 0, sizeof(private_key)); 1292 memset(&public_key, 0, sizeof(public_key)); 1293 memset(&certif, 0, sizeof(certif)); 1294 memset(&dh_params, 0, sizeof(dh_params)); 1295 memset(&host, 0, sizeof(host)); 1296 memset(&dhparam, 0, sizeof(dhparam)); 1297 memset(&dhpub, 0, sizeof(dhpub)); 1298 memset(&tai_leap, 0, sizeof(tai_leap)); 1299 if (!crypto_flags) 1300 return; 1301 1302 /* 1303 * Load required private key from file, default "ntpkey". 1304 */ 1305 if (private_key_file == NULL) 1306 private_key_file = "ntpkey"; 1307 host.fstamp = htonl(crypto_rsa(private_key_file, 1308 (u_char *)&private_key, sizeof(R_RSA_PRIVATE_KEY))); 1309 1310 /* 1311 * Load required public key from file, default 1312 * "ntpkey_host", where "host" is the canonical name of this 1313 * machine. 1314 */ 1315 if (public_key_file == NULL) { 1316 snprintf(filename, MAXFILENAME, "ntpkey_%s", 1317 sys_hostname); 1318 public_key_file = emalloc(strlen(filename) + 1); 1319 strcpy(public_key_file, filename); 1320 } 1321 fstamp = htonl(crypto_rsa(public_key_file, 1322 (u_char *)&public_key, sizeof(R_RSA_PUBLIC_KEY))); 1323 if (fstamp != host.fstamp || strstr(public_key_file, 1324 sys_hostname) == NULL) { 1325 msyslog(LOG_ERR, 1326 "crypto: public/private key files mismatch"); 1327 exit (-1); 1328 } 1329 crypto_flags |= CRYPTO_FLAG_RSA; 1330 1331 /* 1332 * Assemble public key and host name in network byte order. 1333 * These data will later be signed and sent in response to 1334 * a client request. Note that the modulus must be a u_int32 in 1335 * network byte order independent of the host order or u_int 1336 * size. 1337 */ 1338 strcpy(filename, sys_hostname); 1339 for (len = strlen(filename) + 1; len % 4 != 0; len++) 1340 filename[len - 1] = 0; 1341 temp = sizeof(R_RSA_PUBLIC_KEY) - sizeof(u_int) + 4; 1342 host.vallen = htonl(temp + len); 1343 pp = emalloc(temp + len); 1344 host.ptr = (u_char *)pp; 1345 *pp++ = htonl(public_key.bits); 1346 memcpy(pp--, public_key.modulus, temp - 4); 1347 pp += temp / 4; 1348 memcpy(pp, filename, len); 1349 host.sig = emalloc(private_key.bits / 8); 1350 1351 /* 1352 * Load optional certificate from file, default "ntpkey_certif". 1353 * If the file is missing or defective, the values can later be 1354 * retrieved from a server. 1355 */ 1356 if (certif_file == NULL) 1357 snprintf(filename, MAXFILENAME, "ntpkey_certif_%s", 1358 sys_hostname); 1359 certif_file = emalloc(strlen(filename) + 1); 1360 strcpy(certif_file, filename); 1361 crypto_cert(certif_file); 1362 1363 /* 1364 * Load optional agreement parameters from file, default 1365 * "ntpkey_dh". If the file is missing or defective, the values 1366 * can later be retrieved from a server. 1367 */ 1368 if (dh_params_file == NULL) 1369 dh_params_file = "ntpkey_dh"; 1370 crypto_dh(dh_params_file); 1371 1372 /* 1373 * Load optional leapseconds from file, default "ntpkey_leap". 1374 * If the file is missing or defective, the values can later be 1375 * retrieved from a server. 1376 */ 1377 if (tai_leap_file == NULL) 1378 tai_leap_file = "ntpkey_leap"; 1379 crypto_tai(tai_leap_file); 1380 } 1381 1382 1383 /* 1384 * crypto_agree - compute new public value and sign extension fields. 1385 */ 1386 void 1387 crypto_agree(void) 1388 { 1389 R_RANDOM_STRUCT randomstr; /* wiggle bits */ 1390 R_SIGNATURE_CTX ctx; /* signature context */ 1391 l_fp lstamp; /* NTP time */ 1392 tstamp_t tstamp; /* seconds timestamp */ 1393 u_int len, temp; 1394 int rval, i; 1395 1396 /* 1397 * Sign host name and timestamps, but only if the clock is 1398 * synchronized. 1399 */ 1400 if (sys_leap == LEAP_NOTINSYNC) 1401 return; 1402 get_systime(&lstamp); 1403 tstamp = lstamp.l_ui; 1404 host.tstamp = htonl(tstamp); 1405 if (!crypto_flags) 1406 return; 1407 EVP_SignInit(&ctx, DA_MD5); 1408 EVP_SignUpdate(&ctx, (u_char *)&host, 12); 1409 EVP_SignUpdate(&ctx, host.ptr, ntohl(host.vallen)); 1410 rval = EVP_SignFinal(&ctx, host.sig, &len, &private_key); 1411 if (rval != RV_OK || len != private_key.bits / 8) { 1412 msyslog(LOG_ERR, "crypto: host signature fails %x", 1413 rval); 1414 exit (-1); 1415 } 1416 host.siglen = ntohl(len); 1417 1418 /* 1419 * Sign certificate and timestamps. 1420 */ 1421 if (certif.vallen != 0) { 1422 certif.tstamp = htonl(tstamp); 1423 EVP_SignInit(&ctx, DA_MD5); 1424 EVP_SignUpdate(&ctx, (u_char *)&certif, 12); 1425 EVP_SignUpdate(&ctx, certif.ptr, 1426 ntohl(certif.vallen)); 1427 rval = EVP_SignFinal(&ctx, certif.sig, &len, 1428 &private_key); 1429 if (rval != RV_OK || len != private_key.bits / 8) { 1430 msyslog(LOG_ERR, 1431 "crypto: certificate signature fails %x", 1432 rval); 1433 exit (-1); 1434 } 1435 certif.siglen = ntohl(len); 1436 } 1437 1438 /* 1439 * Sign agreement parameters and timestamps. 1440 */ 1441 if (dhparam.vallen != 0) { 1442 dhparam.tstamp = htonl(tstamp); 1443 EVP_SignInit(&ctx, DA_MD5); 1444 EVP_SignUpdate(&ctx, (u_char *)&dhparam, 12); 1445 EVP_SignUpdate(&ctx, dhparam.ptr, 1446 ntohl(dhparam.vallen)); 1447 rval = EVP_SignFinal(&ctx, dhparam.sig, &len, 1448 &private_key); 1449 if (rval != RV_OK || len != private_key.bits / 8) { 1450 msyslog(LOG_ERR, 1451 "crypto: parameters signature fails %x", 1452 rval); 1453 exit (-11); 1454 } 1455 dhparam.siglen = ntohl(len); 1456 1457 /* 1458 * Compute public value. 1459 */ 1460 R_RandomInit(&randomstr); 1461 R_GetRandomBytesNeeded(&len, &randomstr); 1462 for (i = 0; i < len; i++) { 1463 temp = RANDOM; 1464 R_RandomUpdate(&randomstr, (u_char *)&temp, 1); 1465 } 1466 rval = R_SetupDHAgreement(dhpub.ptr, dh_private, 1467 dh_keyLen, &dh_params, &randomstr); 1468 if (rval != RV_OK) { 1469 msyslog(LOG_ERR, 1470 "crypto: invalid public value"); 1471 exit (-1); 1472 } 1473 1474 /* 1475 * Sign public value and timestamps. 1476 */ 1477 dhpub.tstamp = htonl(tstamp); 1478 EVP_SignInit(&ctx, DA_MD5); 1479 EVP_SignUpdate(&ctx, (u_char *)&dhpub, 12); 1480 EVP_SignUpdate(&ctx, dhpub.ptr, ntohl(dhpub.vallen)); 1481 rval = EVP_SignFinal(&ctx, dhpub.sig, &len, 1482 &private_key); 1483 if (rval != RV_OK || len != private_key.bits / 8) { 1484 msyslog(LOG_ERR, 1485 "crypto: public value signature fails %x", 1486 rval); 1487 exit (-1); 1488 } 1489 dhpub.siglen = ntohl(len); 1490 } 1491 1492 /* 1493 * Sign leapseconds table and timestamps. 1494 */ 1495 if (tai_leap.vallen != 0) { 1496 tai_leap.tstamp = htonl(tstamp); 1497 EVP_SignInit(&ctx, DA_MD5); 1498 EVP_SignUpdate(&ctx, (u_char *)&tai_leap, 12); 1499 EVP_SignUpdate(&ctx, tai_leap.ptr, 1500 ntohl(tai_leap.vallen)); 1501 rval = EVP_SignFinal(&ctx, tai_leap.sig, &len, 1502 &private_key); 1503 if (rval != RV_OK || len != private_key.bits / 8) { 1504 msyslog(LOG_ERR, 1505 "crypto: leapseconds signature fails %x", 1506 rval); 1507 exit (-1); 1508 } 1509 tai_leap.siglen = ntohl(len); 1510 } 1511 #ifdef DEBUG 1512 if (debug) 1513 printf( 1514 "cypto_agree: ts %u host %u par %u pub %u leap %u\n", 1515 tstamp, ntohl(host.fstamp), ntohl(dhparam.fstamp), 1516 ntohl(dhpub.fstamp), ntohl(tai_leap.fstamp)); 1517 #endif 1518 } 1519 1520 1521 /* 1522 * crypto_rsa - read RSA key, decode and check for errors. 1523 */ 1524 static u_int 1525 crypto_rsa( 1526 char *cp, /* file name */ 1527 u_char *key, /* key pointer */ 1528 u_int keylen /* key length */ 1529 ) 1530 { 1531 FILE *str; /* file handle */ 1532 u_char buf[MAX_LINLEN]; /* file line buffer */ 1533 u_char encoded_key[MAX_ENCLEN]; /* encoded key buffer */ 1534 char filename[MAXFILENAME]; /* name of parameter file */ 1535 char linkname[MAXFILENAME]; /* file link (for filestamp) */ 1536 u_int fstamp; /* filestamp */ 1537 u_int bits, len; 1538 char *rptr; 1539 int rval; 1540 1541 /* 1542 * Open the file and discard comment lines. If the first 1543 * character of the file name is not '/', prepend the keys 1544 * directory string. 1545 */ 1546 if (*cp == '/') 1547 strcpy(filename, cp); 1548 else 1549 snprintf(filename, MAXFILENAME, "%s/%s", keysdir, cp); 1550 str = fopen(filename, "r"); 1551 if (str == NULL) { 1552 msyslog(LOG_ERR, "crypto: RSA file %s not found", 1553 filename); 1554 exit (-1); 1555 } 1556 1557 /* 1558 * Ignore initial comments and empty lines. 1559 */ 1560 while ((rptr = fgets(buf, MAX_LINLEN - 1, str)) != NULL) { 1561 len = strlen(buf); 1562 if (len < 1) 1563 continue; 1564 if (*buf == '#' || *buf == '\r' || *buf == '\0') 1565 continue; 1566 break; 1567 } 1568 1569 /* 1570 * We are rather paranoid here, since an intruder might cause a 1571 * coredump by infiltrating a naughty key. The line must contain 1572 * a single integer followed by a PEM encoded, null-terminated 1573 * string. 1574 */ 1575 if (rptr == NULL) 1576 rval = RV_DAT; 1577 else if (sscanf(buf, "%d %s", &bits, encoded_key) != 2) 1578 rval = RV_DAT; 1579 else if (R_DecodePEMBlock(&buf[sizeof(u_int)], &len, 1580 encoded_key, strlen(encoded_key))) 1581 rval = RV_DEC; 1582 else if ((len += sizeof(u_int)) != keylen) 1583 rval = RV_KEY; 1584 else if (bits < MIN_RSA_MODULUS_BITS || bits > 1585 MAX_RSA_MODULUS_BITS) 1586 rval = RV_KEY; 1587 else 1588 rval = RV_OK; 1589 if (rval != RV_OK) { 1590 fclose(str); 1591 msyslog(LOG_ERR, "crypto: RSA file %s error %x", cp, 1592 rval); 1593 exit (-1); 1594 } 1595 fclose(str); 1596 *(u_int *)buf = bits; 1597 memcpy(key, buf, keylen); 1598 1599 /* 1600 * Extract filestamp if present. 1601 */ 1602 rval = readlink(filename, linkname, MAXFILENAME - 1); 1603 if (rval > 0) { 1604 linkname[rval] = '\0'; 1605 rptr = strrchr(linkname, '.'); 1606 } else { 1607 rptr = strrchr(filename, '.'); 1608 } 1609 if (rptr != NULL) 1610 sscanf(++rptr, "%u", &fstamp); 1611 else 1612 fstamp = 0; 1613 #ifdef DEBUG 1614 if (debug) 1615 printf( 1616 "crypto_rsa: key file %s link %d fs %u modulus %d\n", 1617 cp, rval, fstamp, bits); 1618 #endif 1619 return (fstamp); 1620 } 1621 1622 1623 /* 1624 * crypto_cert - read certificate 1625 */ 1626 static void 1627 crypto_cert( 1628 char *cp /* file name */ 1629 ) 1630 { 1631 u_char buf[5000]; /* file line buffer */ 1632 char filename[MAXFILENAME]; /* name of certificate file */ 1633 char linkname[MAXFILENAME]; /* file link (for filestamp) */ 1634 u_int fstamp; /* filestamp */ 1635 u_int32 *pp; 1636 u_int len; 1637 char *rptr; 1638 int rval, fd; 1639 1640 /* 1641 * Open the file and discard comment lines. If the first 1642 * character of the file name is not '/', prepend the keys 1643 * directory string. If the file is not found, not to worry; it 1644 * can be retrieved over the net. But, if it is found with 1645 * errors, we crash and burn. 1646 */ 1647 if (*cp == '/') 1648 strcpy(filename, cp); 1649 else 1650 snprintf(filename, MAXFILENAME, "%s/%s", keysdir, cp); 1651 fd = open(filename, O_RDONLY, 0777); 1652 if (fd <= 0) { 1653 msyslog(LOG_INFO, 1654 "crypto: certificate file %s not found", 1655 filename); 1656 return; 1657 } 1658 1659 /* 1660 * We are rather paranoid here, since an intruder might cause a 1661 * coredump by infiltrating naughty values. 1662 */ 1663 rval = RV_OK; 1664 len = read(fd, buf, 5000); 1665 close(fd); 1666 if (rval != RV_OK) { 1667 msyslog(LOG_ERR, 1668 "crypto: certificate file %s error %d", cp, 1669 rval); 1670 exit (-1); 1671 } 1672 1673 /* 1674 * The extension field entry consists of the raw certificate. 1675 */ 1676 certif.vallen = htonl(200); /* xxxxxxxxxxxxxxxxxx */ 1677 pp = emalloc(len); 1678 certif.ptr = (u_char *)pp; 1679 memcpy(pp, buf, len); 1680 certif.sig = emalloc(private_key.bits / 8); 1681 crypto_flags |= CRYPTO_FLAG_CERT; 1682 1683 /* 1684 * Extract filestamp if present. 1685 */ 1686 rval = readlink(filename, linkname, MAXFILENAME - 1); 1687 if (rval > 0) { 1688 linkname[rval] = '\0'; 1689 rptr = strrchr(linkname, '.'); 1690 } else { 1691 rptr = strrchr(filename, '.'); 1692 } 1693 if (rptr != NULL) 1694 sscanf(++rptr, "%u", &fstamp); 1695 else 1696 fstamp = 0; 1697 certif.fstamp = htonl(fstamp); 1698 #ifdef DEBUG 1699 if (debug) 1700 printf( 1701 "crypto_cert: certif file %s link %d fs %u len %d\n", 1702 cp, rval, fstamp, len); 1703 #endif 1704 } 1705 1706 1707 /* 1708 * crypto_dh - read agreement parameters, decode and check for errors. 1709 */ 1710 static void 1711 crypto_dh( 1712 char *cp /* file name */ 1713 ) 1714 { 1715 FILE *str; /* file handle */ 1716 u_char buf[MAX_LINLEN]; /* file line buffer */ 1717 u_char encoded_key[MAX_ENCLEN]; /* encoded key buffer */ 1718 u_char prime[MAX_KEYLEN]; /* decoded prime */ 1719 u_char generator[MAX_KEYLEN]; /* decode generator */ 1720 u_int primelen; /* prime length (octets) */ 1721 u_int generatorlen; /* generator length (octets) */ 1722 char filename[MAXFILENAME]; /* name of parameter file */ 1723 char linkname[MAXFILENAME]; /* file link (for filestamp) */ 1724 u_int fstamp; /* filestamp */ 1725 u_int32 *pp; 1726 u_int len; 1727 char *rptr; 1728 int rval; 1729 1730 /* 1731 * Open the file and discard comment lines. If the first 1732 * character of the file name is not '/', prepend the keys 1733 * directory string. If the file is not found, not to worry; it 1734 * can be retrieved over the net. But, if it is found with 1735 * errors, we crash and burn. 1736 */ 1737 if (*cp == '/') 1738 strcpy(filename, cp); 1739 else 1740 snprintf(filename, MAXFILENAME, "%s/%s", keysdir, cp); 1741 str = fopen(filename, "r"); 1742 if (str == NULL) { 1743 msyslog(LOG_INFO, 1744 "crypto: parameters file %s not found", filename); 1745 return; 1746 } 1747 1748 /* 1749 * Ignore initial comments and empty lines. 1750 */ 1751 while ((rptr = fgets(buf, MAX_LINLEN - 1, str)) != NULL) { 1752 if (strlen(buf) < 1) 1753 continue; 1754 if (*buf == '#' || *buf == '\r' || *buf == '\0') 1755 continue; 1756 break; 1757 } 1758 1759 /* 1760 * We are rather paranoid here, since an intruder might cause a 1761 * coredump by infiltrating a naughty key. There must be two 1762 * lines; the first contains the prime, the second the 1763 * generator. Each line must contain a single integer followed 1764 * by a PEM encoded, null-terminated string. 1765 */ 1766 if (rptr == NULL) 1767 rval = RV_DAT; 1768 else if (sscanf(buf, "%u %s", &primelen, encoded_key) != 2) 1769 rval = RV_DAT; 1770 else if (primelen > MAX_KEYLEN) 1771 rval = RV_KEY; 1772 else if (R_DecodePEMBlock(prime, &len, encoded_key, 1773 strlen(encoded_key))) 1774 rval = RV_DEC; 1775 else if (primelen != len || primelen > 1776 DECODED_CONTENT_LEN(strlen(encoded_key))) 1777 rval = RV_DAT; 1778 else if (fscanf(str, "%u %s", &generatorlen, encoded_key) != 2) 1779 rval = RV_DAT; 1780 else if (generatorlen > MAX_KEYLEN) 1781 rval = RV_KEY; 1782 else if (R_DecodePEMBlock(generator, &len, encoded_key, 1783 strlen(encoded_key))) 1784 rval = RV_DEC; 1785 else if (generatorlen != len || generatorlen > 1786 DECODED_CONTENT_LEN(strlen(encoded_key))) 1787 rval = RV_DAT; 1788 else 1789 rval = RV_OK; 1790 if (rval != RV_OK) { 1791 msyslog(LOG_ERR, 1792 "crypto: parameters file %s error %x", cp, 1793 rval); 1794 exit (-1); 1795 } 1796 fclose(str); 1797 1798 /* 1799 * Initialize agreement parameters and extension field in 1800 * network byte order. Note the private key length is set 1801 * arbitrarily at half the prime length. 1802 */ 1803 len = 4 + primelen + 4 + generatorlen; 1804 dhparam.vallen = htonl(len); 1805 pp = emalloc(len); 1806 dhparam.ptr = (u_char *)pp; 1807 *pp++ = htonl(primelen); 1808 memcpy(pp, prime, primelen); 1809 dh_params.prime = (u_char *)pp; 1810 pp += primelen / 4; 1811 *pp++ = htonl(generatorlen); 1812 memcpy(pp, &generator, generatorlen); 1813 dh_params.generator = (u_char *)pp; 1814 1815 dh_params.primeLen = primelen; 1816 dh_params.generatorLen = generatorlen; 1817 dh_keyLen = primelen / 2; 1818 dh_private = emalloc(dh_keyLen); 1819 dhparam.sig = emalloc(private_key.bits / 8); 1820 crypto_flags |= CRYPTO_FLAG_DH; 1821 1822 /* 1823 * Initialize public value extension field. 1824 */ 1825 dhpub.vallen = htonl(dh_params.primeLen); 1826 dhpub.ptr = emalloc(dh_params.primeLen); 1827 dhpub.sig = emalloc(private_key.bits / 8); 1828 1829 /* 1830 * Extract filestamp if present. 1831 */ 1832 rval = readlink(filename, linkname, MAXFILENAME - 1); 1833 if (rval > 0) { 1834 linkname[rval] = '\0'; 1835 rptr = strrchr(linkname, '.'); 1836 } else { 1837 rptr = strrchr(filename, '.'); 1838 } 1839 if (rptr != NULL) 1840 sscanf(++rptr, "%u", &fstamp); 1841 else 1842 fstamp = 0; 1843 dhparam.fstamp = htonl(fstamp); 1844 dhpub.fstamp = htonl(fstamp); 1845 #ifdef DEBUG 1846 if (debug) 1847 printf( 1848 "crypto_dh: pars file %s link %d fs %u prime %u gen %u\n", 1849 cp, rval, fstamp, dh_params.primeLen, 1850 dh_params.generatorLen); 1851 #endif 1852 } 1853 1854 1855 /* 1856 * crypto_tai - read leapseconds table and check for errors. 1857 */ 1858 static void 1859 crypto_tai( 1860 char *cp /* file name */ 1861 ) 1862 { 1863 FILE *str; /* file handle */ 1864 u_char buf[MAX_LINLEN]; /* file line buffer */ 1865 u_int leapsec[MAX_LEAP]; /* NTP time at leaps */ 1866 u_int offset; /* offset at leap (s) */ 1867 char filename[MAXFILENAME]; /* name of leapseconds file */ 1868 char linkname[MAXFILENAME]; /* file link (for filestamp) */ 1869 u_int fstamp; /* filestamp */ 1870 u_int32 *pp; 1871 u_int len; 1872 char *rptr; 1873 int rval, i; 1874 #ifdef KERNEL_PLL 1875 #if NTP_API > 3 1876 struct timex ntv; /* kernel interface structure */ 1877 #endif /* NTP_API */ 1878 #endif /* KERNEL_PLL */ 1879 1880 /* 1881 * Open the file and discard comment lines. If the first 1882 * character of the file name is not '/', prepend the keys 1883 * directory string. If the file is not found, not to worry; it 1884 * can be retrieved over the net. But, if it is found with 1885 * errors, we crash and burn. 1886 */ 1887 if (*cp == '/') 1888 strcpy(filename, cp); 1889 else 1890 snprintf(filename, MAXFILENAME, "%s/%s", keysdir, cp); 1891 str = fopen(filename, "r"); 1892 if (str == NULL) { 1893 msyslog(LOG_INFO, 1894 "crypto: leapseconds file %s not found", 1895 filename); 1896 return; 1897 } 1898 1899 /* 1900 * We are rather paranoid here, since an intruder might cause a 1901 * coredump by infiltrating naughty values. Empty lines and 1902 * comments are ignored. Other lines must begin with two 1903 * integers followed by junk or comments. The first integer is 1904 * the NTP seconds of leap insertion, the second is the offset 1905 * of TAI relative to UTC after that insertion. The second word 1906 * must equal the initial insertion of ten seconds on 1 January 1907 * 1972 plus one second for each succeeding insertion. 1908 */ 1909 i = 0; 1910 rval = RV_OK; 1911 while (i < MAX_LEAP) { 1912 rptr = fgets(buf, MAX_LINLEN - 1, str); 1913 if (rptr == NULL) 1914 break; 1915 if (strlen(buf) < 1) 1916 continue; 1917 if (*buf == '#') 1918 continue; 1919 if (sscanf(buf, "%u %u", &leapsec[i], &offset) != 2) 1920 continue; 1921 if (i != offset - TAI_1972) { 1922 rval = RV_DAT; 1923 break; 1924 } 1925 i++; 1926 } 1927 fclose(str); 1928 if (rval != RV_OK || i == 0) { 1929 msyslog(LOG_ERR, 1930 "crypto: leapseconds file %s error %d", cp, 1931 rval); 1932 exit (-1); 1933 } 1934 1935 /* 1936 * The extension field table entries consists of the NTP seconds 1937 * of leap insertion in reverse order, so that the most recent 1938 * insertion is the first entry in the table. 1939 */ 1940 len = i * 4; 1941 tai_leap.vallen = htonl(len); 1942 pp = emalloc(len); 1943 tai_leap.ptr = (u_char *)pp; 1944 for (; i >= 0; i--) { 1945 *pp++ = htonl(leapsec[i]); 1946 } 1947 tai_leap.sig = emalloc(private_key.bits / 8); 1948 crypto_flags |= CRYPTO_FLAG_TAI; 1949 sys_tai = len / 4 + TAI_1972 - 1; 1950 #ifdef KERNEL_PLL 1951 #if NTP_API > 3 1952 ntv.modes = MOD_TAI; 1953 ntv.constant = sys_tai; 1954 if (ntp_adjtime(&ntv) == TIME_ERROR) 1955 msyslog(LOG_ERR, 1956 "crypto: kernel TAI update failed"); 1957 #endif /* NTP_API */ 1958 #endif /* KERNEL_PLL */ 1959 1960 1961 /* 1962 * Extract filestamp if present. 1963 */ 1964 rval = readlink(filename, linkname, MAXFILENAME - 1); 1965 if (rval > 0) { 1966 linkname[rval] = '\0'; 1967 rptr = strrchr(linkname, '.'); 1968 } else { 1969 rptr = strrchr(filename, '.'); 1970 } 1971 if (rptr != NULL) 1972 sscanf(++rptr, "%u", &fstamp); 1973 else 1974 fstamp = 0; 1975 tai_leap.fstamp = htonl(fstamp); 1976 #ifdef DEBUG 1977 if (debug) 1978 printf( 1979 "crypto_tai: leapseconds file %s link %d fs %u offset %u\n", 1980 cp, rval, fstamp, ntohl(tai_leap.vallen) / 4 + 1981 TAI_1972); 1982 #endif 1983 } 1984 1985 1986 /* 1987 * crypto_config - configure crypto data from crypto configuration 1988 * command. 1989 */ 1990 void 1991 crypto_config( 1992 int item, /* configuration item */ 1993 char *cp /* file name */ 1994 ) 1995 { 1996 switch (item) { 1997 1998 /* 1999 * Initialize flags 2000 */ 2001 case CRYPTO_CONF_FLAGS: 2002 sscanf(cp, "%x", &crypto_flags); 2003 break; 2004 2005 /* 2006 * Set private key file name. 2007 */ 2008 case CRYPTO_CONF_PRIV: 2009 private_key_file = emalloc(strlen(cp) + 1); 2010 strcpy(private_key_file, cp); 2011 break; 2012 2013 /* 2014 * Set public key file name. 2015 */ 2016 case CRYPTO_CONF_PUBL: 2017 public_key_file = emalloc(strlen(cp) + 1); 2018 strcpy(public_key_file, cp); 2019 break; 2020 2021 /* 2022 * Set certificate file name. 2023 */ 2024 case CRYPTO_CONF_CERT: 2025 certif_file = emalloc(strlen(cp) + 1); 2026 strcpy(certif_file, cp); 2027 break; 2028 2029 /* 2030 * Set agreement parameter file name. 2031 */ 2032 case CRYPTO_CONF_DH: 2033 dh_params_file = emalloc(strlen(cp) + 1); 2034 strcpy(dh_params_file, cp); 2035 break; 2036 2037 /* 2038 * Set leapseconds table file name. 2039 */ 2040 case CRYPTO_CONF_LEAP: 2041 tai_leap_file = emalloc(strlen(cp) + 1); 2042 strcpy(tai_leap_file, cp); 2043 break; 2044 2045 /* 2046 * Set crypto keys directory. 2047 */ 2048 case CRYPTO_CONF_KEYS: 2049 keysdir = emalloc(strlen(cp) + 1); 2050 strcpy(keysdir, cp); 2051 break; 2052 } 2053 crypto_flags |= CRYPTO_FLAG_ENAB; 2054 } 2055 # else 2056 int ntp_crypto_bs_pubkey; 2057 # endif /* PUBKEY */ 2058 #else 2059 int ntp_crypto_bs_autokey; 2060 #endif /* AUTOKEY */ 2061