Fossil

Hex Artifact Content
Login

Artifact c2a7b14c3f541edb96722b702dc2c0b07495487d5dc1c6e74d804bf4f0aa5a90:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 39 20 44 2e 20 52 69 63 68  (c) 2009 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20   Simplified BSD 
00a0: 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a  License (also.**
00b0: 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32   known as the "2
00c0: 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22  -Clause License"
00d0: 20 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63   or "FreeBSD Lic
00e0: 65 6e 73 65 22 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  ense".).**.** Th
00f0: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0100: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65  stributed in the
0110: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69   hope that it wi
0120: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a  ll be useful,.**
0130: 20 62 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79   but without any
0140: 20 77 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f   warranty; witho
0150: 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c  ut even the impl
0160: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a  ied warranty of.
0170: 2a 2a 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69  ** merchantabili
0180: 74 79 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f  ty or fitness fo
0190: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 70  r a particular p
01a0: 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75  urpose..**.** Au
01b0: 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66  thor contact inf
01c0: 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64  ormation:.**   d
01d0: 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20  rh@hwaci.com.** 
01e0: 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61    http://www.hwa
01f0: 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a  ci.com/drh/.**.*
0200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
0250: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 6d  *.** This file m
0260: 61 6e 61 67 65 73 20 6c 6f 77 2d 6c 65 76 65 6c  anages low-level
0270: 20 53 53 4c 20 63 6f 6d 6d 75 6e 69 63 61 74 69   SSL communicati
0280: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
0290: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
02a0: 61 20 73 69 6e 67 6c 65 74 6f 6e 2e 20 20 41 20  a singleton.  A 
02b0: 73 69 6e 67 6c 65 20 53 53 4c 20 63 6f 6e 6e 65  single SSL conne
02c0: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
02d0: 69 76 65 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65  ive.** at a time
02e0: 2e 20 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61  .  State informa
02f0: 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 69  tion is stored i
0300: 6e 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c  n static variabl
0310: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 53  es..**.** The SS
0320: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61  L connections ca
0330: 6e 20 62 65 20 65 69 74 68 65 72 20 61 20 63 6c  n be either a cl
0340: 69 65 6e 74 20 6f 72 20 61 20 73 65 72 76 65 72  ient or a server
0350: 2e 20 20 42 75 74 20 61 6c 6c 0a 2a 2a 20 63 6f  .  But all.** co
0360: 6e 6e 65 63 74 69 6f 6e 73 20 66 6f 72 20 61 20  nnections for a 
0370: 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 6d  single process m
0380: 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 73 61  ust be of the sa
0390: 6d 65 20 74 79 70 65 2c 20 65 69 74 68 65 72 20  me type, either 
03a0: 63 6c 69 65 6e 74 0a 2a 2a 20 6f 72 20 73 65 72  client.** or ser
03b0: 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 53 4c 20 73  ver..**.** SSL s
03c0: 75 70 70 6f 72 74 20 69 73 20 61 62 73 74 72 61  upport is abstra
03d0: 63 74 65 64 20 6f 75 74 20 69 6e 74 6f 20 74 68  cted out into th
03e0: 69 73 20 6d 6f 64 75 6c 65 20 62 65 63 61 75 73  is module becaus
03f0: 65 20 46 6f 73 73 69 6c 20 63 61 6e 0a 2a 2a 20  e Fossil can.** 
0400: 62 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  be compiled with
0410: 6f 75 74 20 53 53 4c 20 73 75 70 70 6f 72 74 20  out SSL support 
0420: 28 77 68 69 63 68 20 72 65 71 75 69 72 65 73 20  (which requires 
0430: 4f 70 65 6e 53 53 4c 20 6c 69 62 72 61 72 79 29  OpenSSL library)
0440: 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 63  .*/..#include "c
0450: 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64  onfig.h".#includ
0460: 65 20 22 68 74 74 70 5f 73 73 6c 2e 68 22 0a 0a  e "http_ssl.h"..
0470: 23 69 66 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e  #ifdef FOSSIL_EN
0480: 41 42 4c 45 5f 53 53 4c 0a 0a 23 69 6e 63 6c 75  ABLE_SSL..#inclu
0490: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 62 69 6f 2e  de <openssl/bio.
04a0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
04b0: 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a 23 69 6e 63  nssl/ssl.h>.#inc
04c0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 65 72  lude <openssl/er
04d0: 72 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f  r.h>.#include <o
04e0: 70 65 6e 73 73 6c 2f 78 35 30 39 2e 68 3e 0a 0a  penssl/x509.h>..
04f0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0500: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0510: 73 2f 74 79 70 65 73 2e 68 3e 0a 0a 2f 2a 0a 2a  s/types.h>../*.*
0520: 2a 20 54 68 65 72 65 20 63 61 6e 20 6f 6e 6c 79  * There can only
0530: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 4f 70 65   be a single Ope
0540: 6e 53 53 4c 20 49 4f 20 63 6f 6e 6e 65 63 74 69  nSSL IO connecti
0550: 6f 6e 20 6f 70 65 6e 20 61 74 20 61 20 74 69 6d  on open at a tim
0560: 65 2e 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f  e..** State info
0570: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
0580: 61 74 20 49 4f 20 69 73 20 73 74 6f 72 65 64 20  at IO is stored 
0590: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
05a0: 0a 2a 2a 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  .** local variab
05b0: 6c 65 73 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les:.*/.static i
05c0: 6e 74 20 73 73 6c 49 73 49 6e 69 74 20 3d 20 30  nt sslIsInit = 0
05d0: 3b 20 20 20 20 2f 2a 20 30 3a 20 75 6e 69 6e 69  ;    /* 0: unini
05e0: 74 20 31 3a 20 69 6e 69 74 20 61 73 20 63 6c 69  t 1: init as cli
05f0: 65 6e 74 20 32 3a 20 69 6e 69 74 20 61 73 20 73  ent 2: init as s
0600: 65 72 76 65 72 20 2a 2f 0a 73 74 61 74 69 63 20  erver */.static 
0610: 42 49 4f 20 2a 69 42 69 6f 20 3d 20 30 3b 20 20  BIO *iBio = 0;  
0620: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 53 53 4c        /* OpenSSL
0630: 20 49 2f 4f 20 61 62 73 74 72 61 63 74 69 6f 6e   I/O abstraction
0640: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
0650: 2a 73 73 6c 45 72 72 4d 73 67 20 3d 20 30 3b 20  *sslErrMsg = 0; 
0660: 20 2f 2a 20 54 65 78 74 20 6f 66 20 6d 6f 73 74   /* Text of most
0670: 20 72 65 63 65 6e 74 20 4f 70 65 6e 53 53 4c 20   recent OpenSSL 
0680: 65 72 72 6f 72 20 2a 2f 0a 73 74 61 74 69 63 20  error */.static 
0690: 53 53 4c 5f 43 54 58 20 2a 73 73 6c 43 74 78 3b  SSL_CTX *sslCtx;
06a0: 20 20 20 20 20 20 2f 2a 20 53 53 4c 20 63 6f 6e        /* SSL con
06b0: 74 65 78 74 20 2a 2f 0a 73 74 61 74 69 63 20 53  text */.static S
06c0: 53 4c 20 2a 73 73 6c 3b 0a 73 74 61 74 69 63 20  SL *ssl;.static 
06d0: 73 74 72 75 63 74 20 7b 20 20 20 20 20 20 20 20  struct {        
06e0: 20 20 20 20 20 20 2f 2a 20 41 63 63 65 70 74 20        /* Accept 
06f0: 74 68 69 73 20 53 53 4c 20 63 65 72 74 20 66 6f  this SSL cert fo
0700: 72 20 74 68 69 73 20 73 65 73 73 69 6f 6e 20 6f  r this session o
0710: 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  nly */.  char *z
0720: 48 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Host;           
0730: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 6a 65 63         /* Subjec
0740: 74 20 6f 72 20 68 6f 73 74 20 6e 61 6d 65 20 2a  t or host name *
0750: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 61 73 68 3b  /.  char *zHash;
0760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0770: 20 20 2f 2a 20 53 48 41 32 2d 32 35 36 20 68 61    /* SHA2-256 ha
0780: 73 68 20 6f 66 20 74 68 65 20 63 65 72 74 20 2a  sh of the cert *
0790: 2f 0a 7d 20 73 45 78 63 65 70 74 69 6f 6e 3b 0a  /.} sException;.
07a0: 73 74 61 74 69 63 20 69 6e 74 20 73 73 6c 4e 6f  static int sslNo
07b0: 43 65 72 74 56 65 72 69 66 79 20 3d 20 30 3b 20  CertVerify = 0; 
07c0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 76 65 72 69 66   /* Do not verif
07d0: 79 20 53 53 4c 20 63 65 72 74 73 20 2a 2f 0a 0a  y SSL certs */..
07e0: 0a 2f 2a 20 54 68 69 73 20 69 73 20 61 20 73 65  ./* This is a se
07f0: 6c 66 2d 73 69 67 6e 65 64 20 63 65 72 74 20 69  lf-signed cert i
0800: 6e 20 74 68 65 20 50 45 4d 20 66 6f 72 6d 61 74  n the PEM format
0810: 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
0820: 64 20 77 68 65 6e 0a 2a 2a 20 6e 6f 20 6f 74 68  d when.** no oth
0830: 65 72 20 63 65 72 74 73 20 61 72 65 20 61 76 61  er certs are ava
0840: 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  ilable..*/.stati
0850: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 73 73 6c  c const char ssl
0860: 53 65 6c 66 43 65 72 74 5b 5d 20 3d 20 0a 22 2d  SelfCert[] = ."-
0870: 2d 2d 2d 2d 42 45 47 49 4e 20 43 45 52 54 49 46  ----BEGIN CERTIF
0880: 49 43 41 54 45 2d 2d 2d 2d 2d 5c 6e 22 0a 22 4d  ICATE-----\n"."M
0890: 49 49 44 4d 54 43 43 41 68 6b 43 46 47 72 44 6d  IIDMTCCAhkCFGrDm
08a0: 75 4a 6b 6b 7a 57 45 52 50 2f 49 54 42 76 7a 77  uJkkzWERP/ITBvzw
08b0: 77 49 32 6c 76 30 54 4d 41 30 47 43 53 71 47 53  wI2lv0TMA0GCSqGS
08c0: 49 62 33 44 51 45 42 43 77 55 41 4d 46 51 78 5c  Ib3DQEBCwUAMFQx\
08d0: 6e 22 0a 22 43 7a 41 4a 42 67 4e 56 42 41 59 54  n"."CzAJBgNVBAYT
08e0: 41 6c 56 54 4d 51 73 77 43 51 59 44 56 51 51 49  AlVTMQswCQYDVQQI
08f0: 44 41 4a 4f 51 7a 45 53 4d 42 41 47 41 31 55 45  DAJOQzESMBAGA1UE
0900: 42 77 77 4a 51 32 68 68 63 6d 78 76 64 48 52 6c  BwwJQ2hhcmxvdHRl
0910: 4d 52 4d 77 5c 6e 22 0a 22 45 51 59 44 56 51 51  MRMw\n"."EQYDVQQ
0920: 4b 44 41 70 47 62 33 4e 7a 61 57 77 74 55 30 4e  KDApGb3NzaWwtU0N
0930: 4e 4d 51 38 77 44 51 59 44 56 51 51 44 44 41 5a  NMQ8wDQYDVQQDDAZ
0940: 47 62 33 4e 7a 61 57 77 77 49 42 63 4e 4d 6a 45  Gb3NzaWwwIBcNMjE
0950: 78 4d 6a 49 33 4d 54 45 7a 5c 6e 22 0a 22 4d 54  xMjI3MTEz\n"."MT
0960: 55 32 57 68 67 50 4d 6a 45 79 4d 54 45 79 4d 6a  U2WhgPMjEyMTEyMj
0970: 63 78 4d 54 4d 78 4e 54 5a 61 4d 46 51 78 43 7a  cxMTMxNTZaMFQxCz
0980: 41 4a 42 67 4e 56 42 41 59 54 41 6c 56 54 4d 51  AJBgNVBAYTAlVTMQ
0990: 73 77 43 51 59 44 56 51 51 49 44 41 4a 4f 5c 6e  swCQYDVQQIDAJO\n
09a0: 22 0a 22 51 7a 45 53 4d 42 41 47 41 31 55 45 42  "."QzESMBAGA1UEB
09b0: 77 77 4a 51 32 68 68 63 6d 78 76 64 48 52 6c 4d  wwJQ2hhcmxvdHRlM
09c0: 52 4d 77 45 51 59 44 56 51 51 4b 44 41 70 47 62  RMwEQYDVQQKDApGb
09d0: 33 4e 7a 61 57 77 74 55 30 4e 4e 4d 51 38 77 44  3NzaWwtU0NNMQ8wD
09e0: 51 59 44 5c 6e 22 0a 22 56 51 51 44 44 41 5a 47  QYD\n"."VQQDDAZG
09f0: 62 33 4e 7a 61 57 77 77 67 67 45 69 4d 41 30 47  b3NzaWwwggEiMA0G
0a00: 43 53 71 47 53 49 62 33 44 51 45 42 41 51 55 41  CSqGSIb3DQEBAQUA
0a10: 41 34 49 42 44 77 41 77 67 67 45 4b 41 6f 49 42  A4IBDwAwggEKAoIB
0a20: 41 51 43 43 62 54 55 32 5c 6e 22 0a 22 36 47 52  AQCCbTU2\n"."6GR
0a30: 51 48 51 71 4c 71 37 76 79 5a 30 4f 78 70 41 78  QHQqLq7vyZ0OxpAx
0a40: 6d 67 66 41 4b 43 78 74 36 65 49 7a 2b 6a 42 69  mgfAKCxt6eIz+jBi
0a50: 32 5a 4d 2f 43 42 35 76 56 58 57 56 68 32 2b 53  2ZM/CB5vVXWVh2+S
0a60: 6b 53 69 57 45 41 33 55 5a 69 55 71 58 5c 6e 22  kSiWEA3UZiUqX\n"
0a70: 0a 22 78 5a 6c 7a 6d 53 2f 43 67 6c 5a 64 69 77  ."xZlzmS/CglZdiw
0a80: 4c 4c 44 4a 4d 4c 38 42 34 4f 69 56 37 32 6f 69  LLDJML8B4OiV72oi
0a90: 76 46 48 2f 76 4a 37 2b 63 62 76 68 31 64 54 78  vFH/vJ7+cbvh1dTx
0aa0: 6e 59 69 48 75 77 77 37 47 66 51 6e 67 50 72 4c  nYiHuww7GfQngPrL
0ab0: 66 65 5c 6e 22 0a 22 66 69 49 59 50 44 6b 31 47  fe\n"."fiIYPDk1G
0ac0: 54 55 4a 48 42 51 37 55 65 34 37 37 46 37 46 38  TUJHBQ7Ue477F7F8
0ad0: 76 4b 75 48 64 56 67 77 6b 74 46 2f 4a 44 4d 36  vKuHdVgwktF/JDM6
0ae0: 4d 36 30 61 53 71 6c 6f 32 44 2f 6f 79 73 69 72  M60aSqlo2D/oysir
0af0: 72 62 2b 64 6c 75 72 5c 6e 22 0a 22 54 6c 76 30  rb+dlur\n"."Tlv0
0b00: 72 6a 73 59 4f 66 71 36 62 4c 41 61 6a 6f 4c 33  rjsYOfq6bLAajoL3
0b10: 71 69 2f 76 65 6b 36 44 4e 73 73 6f 79 77 62 67  qi/vek6DNssoywbg
0b20: 65 34 50 66 62 54 67 53 39 67 37 47 63 67 6e 63  e4PfbTgS9g7Gcgnc
0b30: 62 63 65 74 35 70 76 61 53 31 32 4a 5c 6e 22 0a  bcet5pvaS12J\n".
0b40: 22 61 76 68 46 63 64 34 4a 55 34 49 74 79 34 39  "avhFcd4JU4Ity49
0b50: 48 6c 39 53 2f 43 32 4d 66 5a 31 74 45 35 33 78  Hl9S/C2MfZ1tE53x
0b60: 56 67 67 52 77 4b 7a 34 46 50 6a 36 35 4d 35 75  VggRwKz4FPj65M5u
0b70: 79 6d 54 64 63 78 74 6a 4b 58 74 43 78 49 45 31  ymTdcxtjKXtCxIE1
0b80: 6b 5c 6e 22 0a 22 4b 78 4a 78 58 51 68 37 72 49  k\n"."KxJxXQh7rI
0b90: 59 6a 6d 2b 52 54 41 67 4d 42 41 41 45 77 44 51  Yjm+RTAgMBAAEwDQ
0ba0: 59 4a 4b 6f 5a 49 68 76 63 4e 41 51 45 4c 42 51  YJKoZIhvcNAQELBQ
0bb0: 41 44 67 67 45 42 41 46 6b 64 74 70 71 63 79 62  ADggEBAFkdtpqcyb
0bc0: 41 7a 4a 4e 38 47 5c 6e 22 0a 22 2b 4f 4e 75 55  AzJN8G\n"."+ONuU
0bd0: 6d 35 73 58 4e 62 57 74 61 37 4a 47 76 6d 38 6c  m5sXNbWta7JGvm8l
0be0: 30 42 54 53 42 63 43 55 74 4a 41 33 68 6e 31 36  0BTSBcCUtJA3hn16
0bf0: 69 4a 71 58 41 39 4b 6d 4c 6e 61 46 32 64 65 6e  iJqXA9KmLnaF2den
0c00: 43 34 45 59 6b 2b 4b 6c 56 55 31 5c 6e 22 0a 22  C4EYk+KlVU1\n"."
0c10: 51 58 78 73 6b 50 4a 34 6a 42 38 41 35 42 30 35  QXxskPJ4jB8A5B05
0c20: 6a 4d 69 6a 59 76 30 6e 7a 43 78 4b 68 76 69 49  jMijYv0nzCxKhviI
0c30: 38 43 52 37 47 4c 45 45 47 4b 7a 65 67 39 70 62  8CR7GLEEGKzeg9pb
0c40: 57 30 2b 4f 33 76 61 56 65 68 6f 5a 74 64 46 58  W0+O3vaVehoZtdFX
0c50: 5c 6e 22 0a 22 7a 33 53 73 43 73 73 72 39 51 6a  \n"."z3SsCssr9Qj
0c60: 43 4c 69 41 70 51 78 4d 7a 57 31 49 76 33 6f 64  CLiApQxMzW1Iv3od
0c70: 32 4a 58 65 48 42 77 66 56 4d 46 72 57 41 31 56  2JXeHBwfVMFrWA1V
0c80: 43 45 55 43 52 73 38 4f 53 57 2f 56 4f 71 44 50  CEUCRs8OSW/VOqDP
0c90: 4a 4c 56 45 69 5c 6e 22 0a 22 47 36 77 78 63 34  JLVEi\n"."G6wxc4
0ca0: 6b 4e 39 64 4c 4b 2b 35 53 32 39 71 33 6e 7a 6c  kN9dLK+5S29q3nzl
0cb0: 32 34 2f 71 7a 58 6f 46 38 50 39 52 65 35 4b 42  24/qzXoF8P9Re5KB
0cc0: 43 62 72 77 61 48 67 79 2b 4f 45 45 63 65 71 35  CbrwaHgy+OEEceq5
0cd0: 6a 6b 6d 66 47 46 78 58 6a 77 5c 6e 22 0a 22 70  jkmfGFxXjw\n"."p
0ce0: 76 56 43 4e 72 79 35 75 41 68 48 35 4e 71 62 58  vVCNry5uAhH5NqbX
0cf0: 5a 61 6d 70 55 57 71 69 57 74 4d 34 65 54 61 49  ZampUWqiWtM4eTaI
0d00: 50 6f 37 59 32 6d 44 41 31 75 57 68 75 57 74 4f  Po7Y2mDA1uWhuWtO
0d10: 36 46 39 50 73 6e 46 4a 6c 51 48 43 6e 77 79 5c  6F9PsnFJlQHCnwy\
0d20: 6e 22 0a 22 73 2f 54 73 72 58 6b 3d 5c 6e 22 0a  n"."s/TsrXk=\n".
0d30: 22 2d 2d 2d 2d 2d 45 4e 44 20 43 45 52 54 49 46  "-----END CERTIF
0d40: 49 43 41 54 45 2d 2d 2d 2d 2d 5c 6e 22 3b 0a 0a  ICATE-----\n";..
0d50: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 70  /* This is the p
0d60: 72 69 76 61 74 65 2d 6b 65 79 20 63 6f 72 72 65  rivate-key corre
0d70: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
0d80: 63 65 72 74 20 61 62 6f 76 65 0a 2a 2f 0a 73 74  cert above.*/.st
0d90: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
0da0: 73 73 6c 53 65 6c 66 50 4b 65 79 5b 5d 20 3d 20  sslSelfPKey[] = 
0db0: 0a 22 2d 2d 2d 2d 2d 42 45 47 49 4e 20 50 52 49  ."-----BEGIN PRI
0dc0: 56 41 54 45 20 4b 45 59 2d 2d 2d 2d 2d 5c 6e 22  VATE KEY-----\n"
0dd0: 0a 22 4d 49 49 45 76 41 49 42 41 44 41 4e 42 67  ."MIIEvAIBADANBg
0de0: 6b 71 68 6b 69 47 39 77 30 42 41 51 45 46 41 41  kqhkiG9w0BAQEFAA
0df0: 53 43 42 4b 59 77 67 67 53 69 41 67 45 41 41 6f  SCBKYwggSiAgEAAo
0e00: 49 42 41 51 43 43 62 54 55 32 36 47 52 51 48 51  IBAQCCbTU26GRQHQ
0e10: 71 4c 5c 6e 22 0a 22 71 37 76 79 5a 30 4f 78 70  qL\n"."q7vyZ0Oxp
0e20: 41 78 6d 67 66 41 4b 43 78 74 36 65 49 7a 2b 6a  AxmgfAKCxt6eIz+j
0e30: 42 69 32 5a 4d 2f 43 42 35 76 56 58 57 56 68 32  Bi2ZM/CB5vVXWVh2
0e40: 2b 53 6b 53 69 57 45 41 33 55 5a 69 55 71 58 78  +SkSiWEA3UZiUqXx
0e50: 5a 6c 7a 6d 53 2f 43 5c 6e 22 0a 22 67 6c 5a 64  ZlzmS/C\n"."glZd
0e60: 69 77 4c 4c 44 4a 4d 4c 38 42 34 4f 69 56 37 32  iwLLDJML8B4OiV72
0e70: 6f 69 76 46 48 2f 76 4a 37 2b 63 62 76 68 31 64  oivFH/vJ7+cbvh1d
0e80: 54 78 6e 59 69 48 75 77 77 37 47 66 51 6e 67 50  TxnYiHuww7GfQngP
0e90: 72 4c 66 65 66 69 49 59 50 44 6b 31 5c 6e 22 0a  rLfefiIYPDk1\n".
0ea0: 22 47 54 55 4a 48 42 51 37 55 65 34 37 37 46 37  "GTUJHBQ7Ue477F7
0eb0: 46 38 76 4b 75 48 64 56 67 77 6b 74 46 2f 4a 44  F8vKuHdVgwktF/JD
0ec0: 4d 36 4d 36 30 61 53 71 6c 6f 32 44 2f 6f 79 73  M6M60aSqlo2D/oys
0ed0: 69 72 72 62 2b 64 6c 75 72 54 6c 76 30 72 6a 73  irrb+dlurTlv0rjs
0ee0: 59 5c 6e 22 0a 22 4f 66 71 36 62 4c 41 61 6a 6f  Y\n"."Ofq6bLAajo
0ef0: 4c 33 71 69 2f 76 65 6b 36 44 4e 73 73 6f 79 77  L3qi/vek6DNssoyw
0f00: 62 67 65 34 50 66 62 54 67 53 39 67 37 47 63 67  bge4PfbTgS9g7Gcg
0f10: 6e 63 62 63 65 74 35 70 76 61 53 31 32 4a 61 76  ncbcet5pvaS12Jav
0f20: 68 46 63 64 34 4a 5c 6e 22 0a 22 55 34 49 74 79  hFcd4J\n"."U4Ity
0f30: 34 39 48 6c 39 53 2f 43 32 4d 66 5a 31 74 45 35  49Hl9S/C2MfZ1tE5
0f40: 33 78 56 67 67 52 77 4b 7a 34 46 50 6a 36 35 4d  3xVggRwKz4FPj65M
0f50: 35 75 79 6d 54 64 63 78 74 6a 4b 58 74 43 78 49  5uymTdcxtjKXtCxI
0f60: 45 31 6b 4b 78 4a 78 58 51 68 37 5c 6e 22 0a 22  E1kKxJxXQh7\n"."
0f70: 72 49 59 6a 6d 2b 52 54 41 67 4d 42 41 41 45 43  rIYjm+RTAgMBAAEC
0f80: 67 67 45 41 4e 66 54 48 31 76 63 38 79 49 65 37  ggEANfTH1vc8yIe7
0f90: 48 52 7a 6d 6d 39 6c 73 66 38 6a 46 2b 49 49 34  HRzmm9lsf8jF+II4
0fa0: 73 32 37 30 35 79 32 48 35 71 59 2b 63 76 59 78  s2705y2H5qY+cvYx
0fb0: 5c 6e 22 0a 22 6e 4b 74 5a 4a 47 4f 47 31 58 30  \n"."nKtZJGOG1X0
0fc0: 4b 6b 59 79 37 43 47 6f 46 76 35 4b 30 63 53 55  KkYy7CGoFv5K0cSU
0fd0: 6c 33 6c 53 35 46 56 61 6d 4d 2f 79 57 49 7a 6f  l3lS5FVamM/yWIzo
0fe0: 49 65 78 2f 53 7a 32 43 31 45 49 4c 32 61 49 35  Iex/Sz2C1EIL2aI5
0ff0: 61 73 36 65 7a 5c 6e 22 0a 22 6a 42 36 53 4e 30  as6ez\n"."jB6SN0
1000: 2f 4a 2b 58 49 38 2b 56 74 37 31 38 36 2f 72 48  /J+XI8+Vt7186/rH
1010: 78 66 64 49 50 70 78 75 7a 6a 48 62 78 58 33 48  xfdIPpxuzjHbxX3H
1020: 54 70 53 63 45 54 4e 57 63 4c 72 67 68 62 72 50  TpScETNWcLrghbrP
1030: 78 61 6b 62 54 50 50 78 77 74 5c 6e 22 0a 22 2b  xakbTPPxwt\n"."+
1040: 78 37 51 6c 50 6d 6d 6b 46 4e 75 4d 66 76 6b 7a  x7QlPmmkFNuMfvkz
1050: 54 6f 46 66 39 4e 64 77 4c 2b 2b 34 34 54 65 42  ToFf9NdwL++44TeB
1060: 50 4f 70 76 44 2f 4c 72 77 2b 65 79 71 64 74 68  POpvD/Lrw+eyqdth
1070: 39 52 4a 50 71 39 63 4d 39 36 70 6c 68 39 56 5c  9RJPq9cM96plh9V\
1080: 6e 22 0a 22 48 75 52 71 65 44 38 2b 51 4e 61 66  n"."HuRqeD8+QNaf
1090: 61 58 42 64 53 51 73 33 46 4a 4b 2f 63 44 4b 2f  aXBdSQs3FJK/cDK/
10a0: 76 57 47 4b 5a 57 49 66 46 56 53 44 62 44 68 77  vWGKZWIfFVSDbDhw
10b0: 59 6c 6a 6b 58 47 69 6a 72 65 46 6a 74 58 51 66  YljkXGijreFjtXQf
10c0: 6b 6b 70 46 5c 6e 22 0a 22 72 6c 31 4a 38 37 2f  kkpF\n"."rl1J87/
10d0: 48 39 45 65 37 7a 38 66 54 44 32 59 58 51 48 6c  H9Ee7z8fTD2YXQHl
10e0: 2b 30 2f 72 67 68 41 56 74 61 63 33 75 35 34 64  +0/rghAVtac3u54d
10f0: 70 51 51 4b 42 67 51 43 32 58 47 33 4f 45 65 4d  pQQKBgQC2XG3OEeM
1100: 72 4f 70 39 64 4e 6b 55 64 5c 6e 22 0a 22 46 38  rOp9dNkUd\n"."F8
1110: 56 66 66 55 67 30 65 63 77 47 2b 39 4c 33 4c 43  VffUg0ecwG+9L3LC
1120: 65 37 55 37 31 4b 30 6b 50 6d 58 6a 56 36 78 4e  e7U71K0kPmXjV6xN
1130: 6e 75 59 63 4e 51 75 38 34 6b 70 74 63 35 76 49  nuYcNQu84kptc5vI
1140: 38 77 44 32 33 70 32 39 4c 61 78 64 4e 63 5c 6e  8wD23p29LaxdNc\n
1150: 22 0a 22 39 6d 30 6c 63 77 30 36 2f 59 59 42 4f  "."9m0lcw06/YYBO
1160: 50 6b 4e 70 68 63 48 6b 49 4e 59 5a 54 76 56 4a  PkNphcHkINYZTvVJ
1170: 46 31 30 6d 4c 33 69 73 79 6d 7a 4d 61 54 74 77  F10mL3isymzMaTtw
1180: 44 6b 5a 55 6b 4f 6a 4c 31 42 2b 4d 54 69 46 54  DkZUkOjL1B+MTiFT
1190: 2f 71 70 5c 6e 22 0a 22 41 52 4b 72 54 59 47 4a  /qp\n"."ARKrTYGJ
11a0: 34 48 78 59 37 2b 74 55 6b 49 35 70 55 6d 67 34  4HxY7+tUkI5pUmg4
11b0: 50 51 4b 42 67 51 43 33 47 41 34 64 31 52 7a 33  PQKBgQC3GA4d1Rz3
11c0: 50 62 2f 52 52 70 63 73 5a 67 57 6b 6e 4b 73 4b  Pb/RRpcsZgWknKsK
11d0: 68 6f 4e 33 36 6d 53 6e 5c 6e 22 0a 22 78 46 4a  hoN36mSn\n"."xFJ
11e0: 33 77 50 42 76 56 76 32 42 31 6c 74 54 4d 7a 68  3wPBvVv2B1ltTMzh
11f0: 2f 2b 74 68 65 30 74 79 36 63 6c 7a 4d 72 76 6f  /+the0ty6clzMrvo
1200: 4c 45 52 7a 52 63 68 65 44 73 4e 72 63 2f 6a 2f  LERzRcheDsNrc/j/
1210: 54 55 56 47 38 73 56 64 42 59 4a 77 58 5c 6e 22  TUVG8sVdBYJwX\n"
1220: 0a 22 74 4d 5a 79 46 57 34 4e 56 4d 4f 45 72 54  ."tMZyFW4NVMOErT
1230: 2f 31 75 6b 68 36 6a 42 71 49 4d 42 6f 36 4e 4a  /1ukh6jBqIMBo6NJ
1240: 4c 33 45 56 2f 41 4b 6a 30 79 6e 69 6b 73 67 4b  L3EV/AKj0yniksgK
1250: 4f 72 30 2f 41 41 64 75 41 63 63 6e 47 53 54 38  Or0/AAduAccnGST8
1260: 4a 64 5c 6e 22 0a 22 53 48 4f 64 6a 77 76 48 7a  Jd\n"."SHOdjwvHz
1270: 77 4b 42 67 47 5a 42 71 2f 7a 71 67 4e 54 44 75  wKBgGZBq/zqgNTDu
1280: 59 73 65 48 47 45 30 37 43 4d 67 63 44 57 6b 75  YseHGE07CMgcDWku
1290: 6d 69 4d 47 76 38 6f 7a 6c 71 33 6d 53 52 30 68  miMGv8ozlq3mSR0h
12a0: 55 69 50 4f 54 50 50 5c 6e 22 0a 22 59 46 6a 51  UiPOTPP\n"."YFjQ
12b0: 6a 79 49 64 50 58 6e 46 36 46 66 69 79 50 50 74  jyIdPXnF6FfiyPPt
12c0: 49 76 67 49 6f 4e 4b 32 4c 56 41 71 69 6f 64 2b  IvgIoNK2LVAqiod+
12d0: 58 55 50 66 31 35 32 6c 34 64 6e 71 63 57 31 33  XUPf152l4dnqcW13
12e0: 64 6e 39 42 76 4f 78 47 79 50 54 52 5c 6e 22 0a  dn9BvOxGyPTR\n".
12f0: 22 6c 57 43 69 6b 46 61 41 46 76 69 4f 57 6a 59  "lWCikFaAFviOWjY
1300: 39 72 39 6d 34 64 55 31 64 73 6c 44 6d 79 53 71  9r9m4dU1dslDmySq
1310: 74 68 46 64 30 54 5a 67 50 76 67 70 73 39 69 76  thFd0TZgPvgps9iv
1320: 6b 4a 30 63 64 77 33 30 4e 41 6f 47 41 4d 43 2f  kJ0cdw30NAoGAMC/
1330: 45 5c 6e 22 0a 22 68 31 56 76 4b 69 4b 32 4f 50  E\n"."h1VvKiK2OP
1340: 32 37 43 35 52 4f 4a 2b 53 54 6e 31 47 48 69 43  27C5ROJ+STn1GHiC
1350: 66 49 46 64 38 31 56 51 38 53 4f 44 74 4d 76 4c  fIFd81VQ8SODtMvL
1360: 38 4e 69 66 67 52 42 70 32 65 46 46 61 71 67 4f  8NifgRBp2eFFaqgO
1370: 64 59 52 51 5a 49 5c 6e 22 0a 22 43 47 47 59 6c  dYRQZI\n"."CGGYl
1380: 41 62 53 36 58 58 43 4a 43 64 46 35 50 65 68 36  AbS6XXCJCdF5Peh6
1390: 32 64 41 37 35 50 64 67 4e 2b 79 32 70 4f 4a 51  2dA75PdgN+y2pOJQ
13a0: 7a 6a 72 76 42 39 63 6c 65 39 51 34 2b 2b 37 69  zjrvB9cle9Q4++7i
13b0: 39 77 64 43 76 53 4c 4f 54 72 35 5c 6e 22 0a 22  9wdCvSLOTr5\n"."
13c0: 57 44 6e 46 6f 57 79 2b 71 56 65 78 75 36 63 72  WDnFoWy+qVexu6cr
13d0: 6f 76 4f 6d 52 39 5a 57 7a 59 72 77 50 46 79 31  ovOmR9ZWzYrwPFy1
13e0: 45 4f 4a 30 31 30 45 43 67 59 42 6c 37 51 2b 6a  EOJ010ECgYBl7Q+j
13f0: 6d 6a 4f 53 71 73 56 77 68 46 5a 30 55 37 4c 47  mjOSqsVwhFZ0U7LG
1400: 5c 6e 22 0a 22 64 69 4e 2b 76 58 68 57 66 6e 31  \n"."diN+vXhWfn1
1410: 77 66 4f 57 64 38 75 37 39 6f 61 71 55 2f 4f 79  wfOWd8u79oaqU/Oy
1420: 37 78 79 4b 57 32 70 33 48 35 7a 32 4b 46 72 42  7xyKW2p3H5z2KFrB
1430: 4d 2f 76 69 62 35 33 4c 68 34 45 77 46 5a 6a 63  M/vib53Lh4EwFZjc
1440: 58 2b 6a 56 47 5c 6e 22 0a 22 6b 72 41 6d 62 4c  X+jVG\n"."krAmbL
1450: 2b 4d 2f 68 50 37 7a 33 54 44 32 55 62 45 53 41  +M/hP7z3TD2UbESA
1460: 7a 52 2f 63 36 6c 37 46 55 34 35 78 4e 38 34 4c  zR/c6l7FU45xN84L
1470: 73 7a 35 6e 70 6b 52 38 48 2f 75 41 48 75 71 4c  sz5npkR8H/uAHuqL
1480: 67 62 39 65 34 33 30 4d 6a 78 5c 6e 22 0a 22 59  gb9e430Mjx\n"."Y
1490: 4e 4d 77 64 62 38 72 43 68 48 48 43 68 4e 5a 75  NMwdb8rChHHChNZu
14a0: 36 7a 75 78 77 3d 3d 5c 6e 22 0a 22 2d 2d 2d 2d  6zuxw==\n"."----
14b0: 2d 45 4e 44 20 50 52 49 56 41 54 45 20 4b 45 59  -END PRIVATE KEY
14c0: 2d 2d 2d 2d 2d 5c 6e 22 3b 0a 0a 2f 2a 0a 2a 2a  -----\n";../*.**
14d0: 20 52 65 61 64 20 61 20 50 45 4d 20 63 65 72 74   Read a PEM cert
14e0: 69 66 69 63 61 74 65 20 66 72 6f 6d 20 6d 65 6d  ificate from mem
14f0: 6f 72 79 20 61 6e 64 20 70 75 73 68 20 69 74 20  ory and push it 
1500: 69 6e 74 6f 20 61 6e 20 53 53 4c 5f 43 54 58 2e  into an SSL_CTX.
1510: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1520: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
1530: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1540: 73 6c 63 74 78 5f 75 73 65 5f 63 65 72 74 5f 66  slctx_use_cert_f
1550: 72 6f 6d 5f 6d 65 6d 28 0a 20 20 53 53 4c 5f 43  rom_mem(.  SSL_C
1560: 54 58 20 2a 63 74 78 2c 0a 20 20 63 6f 6e 73 74  TX *ctx,.  const
1570: 20 63 68 61 72 20 2a 70 44 61 74 61 2c 0a 20 20   char *pData,.  
1580: 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20 42  int nData.){.  B
1590: 49 4f 20 2a 69 6e 3b 0a 20 20 69 6e 74 20 72 63  IO *in;.  int rc
15a0: 20 3d 20 31 3b 0a 20 20 58 35 30 39 20 2a 78 20   = 1;.  X509 *x 
15b0: 3d 20 30 3b 0a 20 20 58 35 30 39 20 2a 63 65 72  = 0;.  X509 *cer
15c0: 74 20 3d 20 30 3b 0a 0a 20 20 69 6e 20 3d 20 42  t = 0;..  in = B
15d0: 49 4f 5f 6e 65 77 5f 6d 65 6d 5f 62 75 66 28 70  IO_new_mem_buf(p
15e0: 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20  Data, nData);.  
15f0: 69 66 28 20 69 6e 3d 3d 30 20 29 20 67 6f 74 6f  if( in==0 ) goto
1600: 20 65 6e 64 5f 6f 66 5f 75 63 66 6d 3b 0a 20 20   end_of_ucfm;.  
1610: 2f 2f 20 78 20 3d 20 58 35 30 39 5f 6e 65 77 5f  // x = X509_new_
1620: 65 78 28 63 74 78 2d 3e 6c 69 62 63 74 78 2c 20  ex(ctx->libctx, 
1630: 63 74 78 2d 3e 70 72 6f 70 71 29 3b 0a 20 20 78  ctx->propq);.  x
1640: 20 3d 20 58 35 30 39 5f 6e 65 77 28 29 3b 0a 20   = X509_new();. 
1650: 20 69 66 28 20 78 3d 3d 30 20 29 20 67 6f 74 6f   if( x==0 ) goto
1660: 20 65 6e 64 5f 6f 66 5f 75 63 66 6d 3b 0a 20 20   end_of_ucfm;.  
1670: 63 65 72 74 20 3d 20 50 45 4d 5f 72 65 61 64 5f  cert = PEM_read_
1680: 62 69 6f 5f 58 35 30 39 28 69 6e 2c 20 26 78 2c  bio_X509(in, &x,
1690: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 63 65   0, 0);.  if( ce
16a0: 72 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64  rt==0 ) goto end
16b0: 5f 6f 66 5f 75 63 66 6d 3b 0a 20 20 72 63 20 3d  _of_ucfm;.  rc =
16c0: 20 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72   SSL_CTX_use_cer
16d0: 74 69 66 69 63 61 74 65 28 63 74 78 2c 20 78 29  tificate(ctx, x)
16e0: 3c 3d 30 3b 0a 65 6e 64 5f 6f 66 5f 75 63 66 6d  <=0;.end_of_ucfm
16f0: 3a 0a 20 20 58 35 30 39 5f 66 72 65 65 28 78 29  :.  X509_free(x)
1700: 3b 0a 20 20 42 49 4f 5f 66 72 65 65 28 69 6e 29  ;.  BIO_free(in)
1710: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1720: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 50  ../*.** Read a P
1730: 45 4d 20 70 72 69 76 61 74 65 20 6b 65 79 20 66  EM private key f
1740: 72 6f 6d 20 6d 65 6d 6f 72 79 20 61 6e 64 20 61  rom memory and a
1750: 64 64 20 69 74 20 74 6f 20 61 6e 20 53 53 4c 5f  dd it to an SSL_
1760: 43 54 58 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  CTX..** Return t
1770: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
1780: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ors..*/.static i
1790: 6e 74 20 73 73 6c 63 74 78 5f 75 73 65 5f 70 6b  nt sslctx_use_pk
17a0: 65 79 5f 66 72 6f 6d 5f 6d 65 6d 28 0a 20 20 53  ey_from_mem(.  S
17b0: 53 4c 5f 43 54 58 20 2a 63 74 78 2c 0a 20 20 63  SL_CTX *ctx,.  c
17c0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 44 61 74 61  onst char *pData
17d0: 2c 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b  ,.  int nData.){
17e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 0a 20  .  int rc = 1;. 
17f0: 20 42 49 4f 20 2a 69 6e 3b 0a 20 20 45 56 50 5f   BIO *in;.  EVP_
1800: 50 4b 45 59 20 2a 70 6b 65 79 20 3d 20 30 3b 0a  PKEY *pkey = 0;.
1810: 0a 20 20 69 6e 20 3d 20 42 49 4f 5f 6e 65 77 5f  .  in = BIO_new_
1820: 6d 65 6d 5f 62 75 66 28 70 44 61 74 61 2c 20 6e  mem_buf(pData, n
1830: 44 61 74 61 29 3b 0a 20 20 69 66 28 20 69 6e 3d  Data);.  if( in=
1840: 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  =0 ) goto end_of
1850: 5f 75 70 6b 66 6d 3b 0a 20 20 70 6b 65 79 20 3d  _upkfm;.  pkey =
1860: 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 50 72   PEM_read_bio_Pr
1870: 69 76 61 74 65 4b 65 79 28 69 6e 2c 20 30 2c 20  ivateKey(in, 0, 
1880: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 6b 65  0, 0);.  if( pke
1890: 79 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f  y==0 ) goto end_
18a0: 6f 66 5f 75 70 6b 66 6d 3b 0a 20 20 72 63 20 3d  of_upkfm;.  rc =
18b0: 20 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69   SSL_CTX_use_Pri
18c0: 76 61 74 65 4b 65 79 28 63 74 78 2c 20 70 6b 65  vateKey(ctx, pke
18d0: 79 29 3c 3d 30 3b 0a 20 20 45 56 50 5f 50 4b 45  y)<=0;.  EVP_PKE
18e0: 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 65 6e  Y_free(pkey);.en
18f0: 64 5f 6f 66 5f 75 70 6b 66 6d 3a 0a 20 20 42 49  d_of_upkfm:.  BI
1900: 4f 5f 66 72 65 65 28 69 6e 29 3b 0a 20 20 72 65  O_free(in);.  re
1910: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1920: 2a 20 43 6c 65 61 72 20 74 68 65 20 53 53 4c 20  * Clear the SSL 
1930: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2f  error message.*/
1940: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 73 6c  .static void ssl
1950: 5f 63 6c 65 61 72 5f 65 72 72 6d 73 67 28 76 6f  _clear_errmsg(vo
1960: 69 64 29 7b 0a 20 20 66 72 65 65 28 73 73 6c 45  id){.  free(sslE
1970: 72 72 4d 73 67 29 3b 0a 20 20 73 73 6c 45 72 72  rrMsg);.  sslErr
1980: 4d 73 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Msg = 0;.}../*.*
1990: 2a 20 53 65 74 20 74 68 65 20 53 53 4c 20 65 72  * Set the SSL er
19a0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
19b0: 76 6f 69 64 20 73 73 6c 5f 73 65 74 5f 65 72 72  void ssl_set_err
19c0: 6d 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  msg(const char *
19d0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
19e0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 73   va_list ap;.  s
19f0: 73 6c 5f 63 6c 65 61 72 5f 65 72 72 6d 73 67 28  sl_clear_errmsg(
1a00: 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  );.  va_start(ap
1a10: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 73 73  , zFormat);.  ss
1a20: 6c 45 72 72 4d 73 67 20 3d 20 76 6d 70 72 69 6e  lErrMsg = vmprin
1a30: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
1a40: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d  .  va_end(ap);.}
1a50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1a60: 68 65 20 63 75 72 72 65 6e 74 20 53 53 4c 20 65  he current SSL e
1a70: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2f 0a  rror message.*/.
1a80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 73 6c 5f  const char *ssl_
1a90: 65 72 72 6d 73 67 28 76 6f 69 64 29 7b 0a 20 20  errmsg(void){.  
1aa0: 72 65 74 75 72 6e 20 73 73 6c 45 72 72 4d 73 67  return sslErrMsg
1ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
1ac0: 61 20 73 65 72 76 65 72 20 72 65 71 75 65 73 74  a server request
1ad0: 73 20 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69  s a client certi
1ae0: 66 69 63 61 74 65 20 74 68 61 74 20 68 61 73 6e  ficate that hasn
1af0: 27 74 20 62 65 65 6e 20 70 72 6f 76 69 64 65 64  't been provided
1b00: 2c 0a 2a 2a 20 64 69 73 70 6c 61 79 20 61 20 77  ,.** display a w
1b10: 61 72 6e 69 6e 67 20 6d 65 73 73 61 67 65 20 65  arning message e
1b20: 78 70 6c 61 69 6e 69 6e 67 20 77 68 61 74 20 74  xplaining what t
1b30: 6f 20 64 6f 20 6e 65 78 74 2e 0a 2a 2f 0a 73 74  o do next..*/.st
1b40: 61 74 69 63 20 69 6e 74 20 73 73 6c 5f 63 6c 69  atic int ssl_cli
1b50: 65 6e 74 5f 63 65 72 74 5f 63 61 6c 6c 62 61 63  ent_cert_callbac
1b60: 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 58 35 30 39  k(SSL *ssl, X509
1b70: 20 2a 2a 78 35 30 39 2c 20 45 56 50 5f 50 4b 45   **x509, EVP_PKE
1b80: 59 20 2a 2a 70 6b 65 79 29 7b 0a 20 20 66 6f 73  Y **pkey){.  fos
1b90: 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22 54 68 65  sil_warning("The
1ba0: 20 72 65 6d 6f 74 65 20 73 65 72 76 65 72 20 72   remote server r
1bb0: 65 71 75 65 73 74 65 64 20 61 20 63 6c 69 65 6e  equested a clien
1bc0: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f  t certificate fo
1bd0: 72 20 22 0a 20 20 20 20 22 61 75 74 68 65 6e 74  r ".    "authent
1be0: 69 63 61 74 69 6f 6e 2e 20 53 70 65 63 69 66 79  ication. Specify
1bf0: 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 74 6f   the pathname to
1c00: 20 61 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69   a file containi
1c10: 6e 67 20 74 68 65 20 50 45 4d 20 22 0a 20 20 20  ng the PEM ".   
1c20: 20 22 65 6e 63 6f 64 65 64 20 63 65 72 74 69 66   "encoded certif
1c30: 69 63 61 74 65 20 61 6e 64 20 70 72 69 76 61 74  icate and privat
1c40: 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 2d  e key with the -
1c50: 2d 73 73 6c 2d 69 64 65 6e 74 69 74 79 20 6f 70  -ssl-identity op
1c60: 74 69 6f 6e 20 22 0a 20 20 20 20 22 6f 72 20 74  tion ".    "or t
1c70: 68 65 20 73 73 6c 2d 69 64 65 6e 74 69 74 79 20  he ssl-identity 
1c80: 73 65 74 74 69 6e 67 2e 22 29 3b 0a 20 20 72 65  setting.");.  re
1c90: 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63 65  turn 0; /* no ce
1ca0: 72 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  rt available */.
1cb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
1cc0: 20 61 6e 20 4f 70 65 6e 53 53 4c 20 41 53 4e 31   an OpenSSL ASN1
1cd0: 5f 54 49 4d 45 20 74 6f 20 61 6e 20 49 53 4f 38  _TIME to an ISO8
1ce0: 36 30 31 20 74 69 6d 65 73 74 61 6d 70 2e 0a 2a  601 timestamp..*
1cf0: 2a 0a 2a 2a 20 50 65 72 20 52 46 43 20 35 32 38  *.** Per RFC 528
1d00: 30 2c 20 41 53 4e 31 20 74 69 6d 65 73 74 61 6d  0, ASN1 timestam
1d10: 70 73 20 69 6e 20 58 2e 35 30 39 20 63 65 72 74  ps in X.509 cert
1d20: 69 66 69 63 61 74 65 73 20 6d 75 73 74 20 0a 2a  ificates must .*
1d30: 2a 20 62 65 20 69 6e 20 55 54 43 20 28 5a 75 6c  * be in UTC (Zul
1d40: 75 20 74 69 6d 65 7a 6f 6e 65 29 20 77 69 74 68  u timezone) with
1d50: 20 6e 6f 20 66 72 61 63 74 69 6f 6e 61 6c 20 73   no fractional s
1d60: 65 63 6f 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  econds..**.** If
1d70: 20 73 68 6f 77 55 74 63 3d 3d 31 2c 20 61 64 64   showUtc==1, add
1d80: 20 22 20 55 54 43 22 20 61 74 20 74 68 65 20 65   " UTC" at the e
1d90: 6e 64 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  nd of the return
1da0: 65 64 20 73 74 72 69 6e 67 2e 20 54 68 69 73 20  ed string. This 
1db0: 69 73 0a 2a 2a 20 6e 6f 74 20 49 53 4f 38 36 30  is.** not ISO860
1dc0: 31 2d 63 6f 6d 70 6c 69 61 6e 74 2c 20 62 75 74  1-compliant, but
1dd0: 20 6d 61 6b 65 73 20 74 68 65 20 64 69 73 70 6c   makes the displ
1de0: 61 79 65 64 20 76 61 6c 75 65 20 6d 6f 72 65 20  ayed value more 
1df0: 75 73 65 72 2d 66 72 69 65 6e 64 6c 79 2e 0a 2a  user-friendly..*
1e00: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
1e10: 68 61 72 20 2a 73 73 6c 5f 61 73 6e 31 74 69 6d  har *ssl_asn1tim
1e20: 65 5f 74 6f 5f 69 73 6f 38 36 30 31 28 41 53 4e  e_to_iso8601(ASN
1e30: 31 5f 54 49 4d 45 20 2a 61 73 6e 31 5f 74 69 6d  1_TIME *asn1_tim
1e40: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1e70: 74 20 73 68 6f 77 55 74 63 29 7b 0a 20 20 61 73  t showUtc){.  as
1e80: 73 65 72 74 28 20 73 68 6f 77 55 74 63 3d 3d 30  sert( showUtc==0
1e90: 20 7c 7c 20 73 68 6f 77 55 74 63 3d 3d 31 20 29   || showUtc==1 )
1ea0: 3b 0a 20 20 69 66 28 20 21 41 53 4e 31 5f 54 49  ;.  if( !ASN1_TI
1eb0: 4d 45 5f 63 68 65 63 6b 28 61 73 6e 31 5f 74 69  ME_check(asn1_ti
1ec0: 6d 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  me) ){.    retur
1ed0: 6e 20 6d 70 72 69 6e 74 66 28 22 42 61 64 20 74  n mprintf("Bad t
1ee0: 69 6d 65 20 76 61 6c 75 65 22 29 3b 0a 20 20 7d  ime value");.  }
1ef0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 72  else{.    char r
1f00: 65 73 5b 32 30 5d 3b 0a 20 20 20 20 63 68 61 72  es[20];.    char
1f10: 20 2a 70 72 20 3d 20 72 65 73 3b 0a 20 20 20 20   *pr = res;.    
1f20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 74 20 3d  const char *pt =
1f30: 20 28 63 68 61 72 20 2a 29 61 73 6e 31 5f 74 69   (char *)asn1_ti
1f40: 6d 65 2d 3e 64 61 74 61 3b 0a 20 20 20 20 2f 2a  me->data;.    /*
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32     0123456789 12
1f70: 33 34 0a 20 20 20 20 2a 2a 20 20 55 54 43 54 69  34.    **  UTCTi
1f80: 6d 65 3a 20 20 20 20 20 20 20 20 20 59 59 4d 4d  me:         YYMM
1f90: 44 44 48 48 4d 4d 53 53 5a 20 20 20 20 20 20 28  DDHHMMSSZ      (
1fa0: 59 59 20 3e 3d 20 35 30 20 3f 20 31 39 59 59 20  YY >= 50 ? 19YY 
1fb0: 3a 20 32 30 59 59 29 0a 20 20 20 20 2a 2a 20 20  : 20YY).    **  
1fc0: 47 65 6e 65 72 61 6c 69 7a 65 64 54 69 6d 65 3a  GeneralizedTime:
1fd0: 20 59 59 59 59 4d 4d 44 44 48 48 4d 4d 53 53 5a   YYYYMMDDHHMMSSZ
1fe0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 73 6e 31   */.    if( asn1
1ff0: 5f 74 69 6d 65 2d 3e 6c 65 6e 67 74 68 20 3c 20  _time->length < 
2000: 31 35 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55  15 ){.      /* U
2010: 54 43 54 69 6d 65 2c 20 66 69 6c 6c 20 6f 75 74  TCTime, fill out
2020: 20 63 65 6e 74 75 72 79 20 64 69 67 69 74 73 20   century digits 
2030: 2a 2f 0a 20 20 20 20 20 20 2a 70 72 2b 2b 20 3d  */.      *pr++ =
2040: 20 70 74 5b 30 5d 3e 3d 27 35 27 20 3f 20 27 31   pt[0]>='5' ? '1
2050: 27 20 3a 20 27 32 27 3b 0a 20 20 20 20 20 20 2a  ' : '2';.      *
2060: 70 72 2b 2b 20 3d 20 70 74 5b 30 5d 3e 3d 27 35  pr++ = pt[0]>='5
2070: 27 20 3f 20 27 39 27 20 3a 20 27 30 27 3b 0a 20  ' ? '9' : '0';. 
2080: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2090: 2f 2a 20 47 65 6e 65 72 61 6c 69 7a 65 64 54 69  /* GeneralizedTi
20a0: 6d 65 2c 20 63 6f 70 79 20 63 65 6e 74 75 72 79  me, copy century
20b0: 20 64 69 67 69 74 73 20 61 6e 64 20 61 64 76 61   digits and adva
20c0: 6e 63 65 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20  nce source */.  
20d0: 20 20 20 20 2a 70 72 2b 2b 20 3d 20 70 74 5b 30      *pr++ = pt[0
20e0: 5d 3b 20 2a 70 72 2b 2b 20 3d 20 70 74 5b 31 5d  ]; *pr++ = pt[1]
20f0: 3b 0a 20 20 20 20 20 20 70 74 20 2b 3d 20 32 3b  ;.      pt += 2;
2100: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 72 2b 2b  .    }.    *pr++
2110: 20 3d 20 70 74 5b 30 5d 3b 20 2a 70 72 2b 2b 20   = pt[0]; *pr++ 
2120: 3d 20 70 74 5b 31 5d 3b 20 2a 70 72 2b 2b 20 3d  = pt[1]; *pr++ =
2130: 20 27 2d 27 3b 0a 20 20 20 20 2a 70 72 2b 2b 20   '-';.    *pr++ 
2140: 3d 20 70 74 5b 32 5d 3b 20 2a 70 72 2b 2b 20 3d  = pt[2]; *pr++ =
2150: 20 70 74 5b 33 5d 3b 20 2a 70 72 2b 2b 20 3d 20   pt[3]; *pr++ = 
2160: 27 2d 27 3b 0a 20 20 20 20 2a 70 72 2b 2b 20 3d  '-';.    *pr++ =
2170: 20 70 74 5b 34 5d 3b 20 2a 70 72 2b 2b 20 3d 20   pt[4]; *pr++ = 
2180: 70 74 5b 35 5d 3b 20 2a 70 72 2b 2b 20 3d 20 27  pt[5]; *pr++ = '
2190: 20 27 3b 0a 20 20 20 20 2a 70 72 2b 2b 20 3d 20   ';.    *pr++ = 
21a0: 70 74 5b 36 5d 3b 20 2a 70 72 2b 2b 20 3d 20 70  pt[6]; *pr++ = p
21b0: 74 5b 37 5d 3b 20 2a 70 72 2b 2b 20 3d 20 27 3a  t[7]; *pr++ = ':
21c0: 27 3b 0a 20 20 20 20 2a 70 72 2b 2b 20 3d 20 70  ';.    *pr++ = p
21d0: 74 5b 38 5d 3b 20 2a 70 72 2b 2b 20 3d 20 70 74  t[8]; *pr++ = pt
21e0: 5b 39 5d 3b 20 2a 70 72 2b 2b 20 3d 20 27 3a 27  [9]; *pr++ = ':'
21f0: 3b 0a 20 20 20 20 2a 70 72 2b 2b 20 3d 20 70 74  ;.    *pr++ = pt
2200: 5b 31 30 5d 3b 20 2a 70 72 2b 2b 20 3d 20 70 74  [10]; *pr++ = pt
2210: 5b 31 31 5d 3b 20 2a 70 72 20 3d 20 27 5c 30 27  [11]; *pr = '\0'
2220: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 70 72  ;.    return mpr
2230: 69 6e 74 66 28 22 25 73 25 73 22 2c 20 72 65 73  intf("%s%s", res
2240: 2c 20 28 73 68 6f 77 55 74 63 20 3f 20 22 20 55  , (showUtc ? " U
2250: 54 43 22 20 3a 20 22 22 29 29 3b 0a 20 20 7d 0a  TC" : ""));.  }.
2260: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  }../*.** Call th
2270: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
2280: 62 65 66 6f 72 65 20 61 6e 79 20 6f 74 68 65 72  before any other
2290: 20 75 73 65 20 6f 66 20 74 68 65 20 53 53 4c 20   use of the SSL 
22a0: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68  interface..** Th
22b0: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
22c0: 69 6e 69 74 69 61 6c 20 63 6f 6e 66 69 67 75 72  initial configur
22d0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 53 4c  ation of the SSL
22e0: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
22f0: 69 63 20 76 6f 69 64 20 73 73 6c 5f 67 6c 6f 62  ic void ssl_glob
2300: 61 6c 5f 69 6e 69 74 5f 63 6c 69 65 6e 74 28 76  al_init_client(v
2310: 6f 69 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  oid){.  const ch
2320: 61 72 20 2a 7a 43 61 53 65 74 74 69 6e 67 20 3d  ar *zCaSetting =
2330: 20 30 2c 20 2a 7a 43 61 46 69 6c 65 20 3d 20 30   0, *zCaFile = 0
2340: 2c 20 2a 7a 43 61 44 69 72 65 63 74 6f 72 79 20  , *zCaDirectory 
2350: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
2360: 72 20 2a 69 64 65 6e 74 69 74 79 46 69 6c 65 3b  r *identityFile;
2370: 0a 0a 20 20 69 66 28 20 73 73 6c 49 73 49 6e 69  ..  if( sslIsIni
2380: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 53 53 4c 5f  t==0 ){.    SSL_
2390: 6c 69 62 72 61 72 79 5f 69 6e 69 74 28 29 3b 0a  library_init();.
23a0: 20 20 20 20 53 53 4c 5f 6c 6f 61 64 5f 65 72 72      SSL_load_err
23b0: 6f 72 5f 73 74 72 69 6e 67 73 28 29 3b 0a 20 20  or_strings();.  
23c0: 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c    OpenSSL_add_al
23d0: 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 0a  l_algorithms();.
23e0: 20 20 20 20 73 73 6c 43 74 78 20 3d 20 53 53 4c      sslCtx = SSL
23f0: 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 33 5f  _CTX_new(SSLv23_
2400: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 29  client_method())
2410: 3b 0a 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65  ;.    /* Disable
2420: 20 53 53 4c 76 32 20 61 6e 64 20 53 53 4c 76 33   SSLv2 and SSLv3
2430: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f   */.    SSL_CTX_
2440: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 73 73 6c 43  set_options(sslC
2450: 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53  tx, SSL_OP_NO_SS
2460: 4c 76 32 7c 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53  Lv2|SSL_OP_NO_SS
2470: 4c 76 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  Lv3);..    /* Se
2480: 74 20 75 70 20 61 63 63 65 70 74 61 62 6c 65 20  t up acceptable 
2490: 43 41 20 72 6f 6f 74 20 63 65 72 74 69 66 69 63  CA root certific
24a0: 61 74 65 73 20 2a 2f 0a 20 20 20 20 7a 43 61 53  ates */.    zCaS
24b0: 65 74 74 69 6e 67 20 3d 20 64 62 5f 67 65 74 28  etting = db_get(
24c0: 22 73 73 6c 2d 63 61 2d 6c 6f 63 61 74 69 6f 6e  "ssl-ca-location
24d0: 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a  ", 0);.    if( z
24e0: 43 61 53 65 74 74 69 6e 67 3d 3d 30 20 7c 7c 20  CaSetting==0 || 
24f0: 7a 43 61 53 65 74 74 69 6e 67 5b 30 5d 3d 3d 27  zCaSetting[0]=='
2500: 5c 30 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  \0' ){.      /* 
2510: 43 41 20 6c 6f 63 61 74 69 6f 6e 20 6e 6f 74 20  CA location not 
2520: 73 70 65 63 69 66 69 65 64 2c 20 75 73 65 20 70  specified, use p
2530: 6c 61 74 66 6f 72 6d 27 73 20 64 65 66 61 75 6c  latform's defaul
2540: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 73 74  t certificate st
2550: 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 58 35 30  ore */.      X50
2560: 39 5f 53 54 4f 52 45 5f 73 65 74 5f 64 65 66 61  9_STORE_set_defa
2570: 75 6c 74 5f 70 61 74 68 73 28 53 53 4c 5f 43 54  ult_paths(SSL_CT
2580: 58 5f 67 65 74 5f 63 65 72 74 5f 73 74 6f 72 65  X_get_cert_store
2590: 28 73 73 6c 43 74 78 29 29 3b 0a 20 20 20 20 7d  (sslCtx));.    }
25a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55  else{.      /* U
25b0: 73 65 72 20 68 61 73 20 73 70 65 63 69 66 69 65  ser has specifie
25c0: 64 20 61 20 43 41 20 6c 6f 63 61 74 69 6f 6e 2c  d a CA location,
25d0: 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 65 78   make sure it ex
25e0: 69 73 74 73 20 61 6e 64 20 75 73 65 20 69 74 20  ists and use it 
25f0: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
2600: 20 66 69 6c 65 5f 69 73 64 69 72 28 7a 43 61 53   file_isdir(zCaS
2610: 65 74 74 69 6e 67 2c 20 45 78 74 46 49 4c 45 29  etting, ExtFILE)
2620: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
2630: 20 30 3a 20 7b 20 2f 2a 20 64 6f 65 73 6e 27 74   0: { /* doesn't
2640: 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 20 20   exist */.      
2650: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c      fossil_fatal
2660: 28 22 73 73 6c 2d 63 61 2d 6c 6f 63 61 74 69 6f  ("ssl-ca-locatio
2670: 6e 20 69 73 20 73 65 74 20 74 6f 20 27 25 73 27  n is set to '%s'
2680: 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
2690: 20 20 22 62 75 74 20 69 73 20 6e 6f 74 20 61 20    "but is not a 
26a0: 66 69 6c 65 20 6f 72 20 64 69 72 65 63 74 6f 72  file or director
26b0: 79 22 2c 20 7a 43 61 53 65 74 74 69 6e 67 29 3b  y", zCaSetting);
26c0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
26d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26e0: 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a      case 1: { /*
26f0: 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20   directory */.  
2700: 20 20 20 20 20 20 20 20 7a 43 61 44 69 72 65 63          zCaDirec
2710: 74 6f 72 79 20 3d 20 7a 43 61 53 65 74 74 69 6e  tory = zCaSettin
2720: 67 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  g;.          bre
2730: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2740: 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20        case 2: { 
2750: 2f 2a 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  /* file */.     
2760: 20 20 20 20 20 7a 43 61 46 69 6c 65 20 3d 20 7a       zCaFile = z
2770: 43 61 53 65 74 74 69 6e 67 3b 0a 20 20 20 20 20  CaSetting;.     
2780: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2790: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
27a0: 20 20 20 20 69 66 28 20 53 53 4c 5f 43 54 58 5f      if( SSL_CTX_
27b0: 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61  load_verify_loca
27c0: 74 69 6f 6e 73 28 73 73 6c 43 74 78 2c 20 7a 43  tions(sslCtx, zC
27d0: 61 46 69 6c 65 2c 20 7a 43 61 44 69 72 65 63 74  aFile, zCaDirect
27e0: 6f 72 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ory)==0 ){.     
27f0: 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28     fossil_fatal(
2800: 22 46 61 69 6c 65 64 20 74 6f 20 75 73 65 20 43  "Failed to use C
2810: 41 20 72 6f 6f 74 20 63 65 72 74 69 66 69 63 61  A root certifica
2820: 74 65 73 20 66 72 6f 6d 20 22 0a 20 20 20 20 20  tes from ".     
2830: 20 20 20 20 20 22 73 73 6c 2d 63 61 2d 6c 6f 63       "ssl-ca-loc
2840: 61 74 69 6f 6e 20 27 25 73 27 22 2c 20 7a 43 61  ation '%s'", zCa
2850: 53 65 74 74 69 6e 67 29 3b 0a 20 20 20 20 20 20  Setting);.      
2860: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2870: 4c 6f 61 64 20 63 6c 69 65 6e 74 20 53 53 4c 20  Load client SSL 
2880: 69 64 65 6e 74 69 74 79 2c 20 70 72 65 66 65 72  identity, prefer
2890: 72 69 6e 67 20 74 68 65 20 66 69 6c 65 6e 61 6d  ring the filenam
28a0: 65 20 73 70 65 63 69 66 69 65 64 20 6f 6e 20 74  e specified on t
28b0: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  he.    ** comman
28c0: 64 20 6c 69 6e 65 20 2a 2f 0a 20 20 20 20 69 66  d line */.    if
28d0: 28 20 67 2e 7a 53 53 4c 49 64 65 6e 74 69 74 79  ( g.zSSLIdentity
28e0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 64 65  !=0 ){.      ide
28f0: 6e 74 69 74 79 46 69 6c 65 20 3d 20 67 2e 7a 53  ntityFile = g.zS
2900: 53 4c 49 64 65 6e 74 69 74 79 3b 0a 20 20 20 20  SLIdentity;.    
2910: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 64 65  }else{.      ide
2920: 6e 74 69 74 79 46 69 6c 65 20 3d 20 64 62 5f 67  ntityFile = db_g
2930: 65 74 28 22 73 73 6c 2d 69 64 65 6e 74 69 74 79  et("ssl-identity
2940: 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 0);.    }.   
2950: 20 69 66 28 20 69 64 65 6e 74 69 74 79 46 69 6c   if( identityFil
2960: 65 21 3d 30 20 26 26 20 69 64 65 6e 74 69 74 79  e!=0 && identity
2970: 46 69 6c 65 5b 30 5d 21 3d 27 5c 30 27 20 29 7b  File[0]!='\0' ){
2980: 0a 20 20 20 20 20 20 69 66 28 20 53 53 4c 5f 43  .      if( SSL_C
2990: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61  TX_use_certifica
29a0: 74 65 5f 63 68 61 69 6e 5f 66 69 6c 65 28 73 73  te_chain_file(ss
29b0: 6c 43 74 78 2c 69 64 65 6e 74 69 74 79 46 69 6c  lCtx,identityFil
29c0: 65 29 21 3d 31 0a 20 20 20 20 20 20 20 7c 7c 20  e)!=1.       || 
29d0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76  SSL_CTX_use_Priv
29e0: 61 74 65 4b 65 79 5f 66 69 6c 65 28 73 73 6c 43  ateKey_file(sslC
29f0: 74 78 2c 69 64 65 6e 74 69 74 79 46 69 6c 65 2c  tx,identityFile,
2a00: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d  SSL_FILETYPE_PEM
2a10: 29 21 3d 31 0a 20 20 20 20 20 20 29 7b 0a 20 20  )!=1.      ){.  
2a20: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74        fossil_fat
2a30: 61 6c 28 22 43 6f 75 6c 64 20 6e 6f 74 20 6c 6f  al("Could not lo
2a40: 61 64 20 53 53 4c 20 69 64 65 6e 74 69 74 79 20  ad SSL identity 
2a50: 66 72 6f 6d 20 25 73 22 2c 20 69 64 65 6e 74 69  from %s", identi
2a60: 74 79 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d  tyFile);.      }
2a70: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 52 65  .    }.    /* Re
2a80: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
2a90: 6b 20 74 6f 20 74 65 6c 6c 20 74 68 65 20 75 73  k to tell the us
2aa0: 65 72 20 77 68 61 74 20 74 6f 20 64 6f 20 77 68  er what to do wh
2ab0: 65 6e 20 74 68 65 20 73 65 72 76 65 72 20 61 73  en the server as
2ac0: 6b 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 20  ks.    ** for a 
2ad0: 63 65 72 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  cert */.    SSL_
2ae0: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 63  CTX_set_client_c
2af0: 65 72 74 5f 63 62 28 73 73 6c 43 74 78 2c 20 73  ert_cb(sslCtx, s
2b00: 73 6c 5f 63 6c 69 65 6e 74 5f 63 65 72 74 5f 63  sl_client_cert_c
2b10: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 73  allback);..    s
2b20: 73 6c 49 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  slIsInit = 1;.  
2b30: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2b40: 74 28 20 73 73 6c 49 73 49 6e 69 74 3d 3d 31 20  t( sslIsInit==1 
2b50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2b60: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
2b70: 65 20 74 6f 20 73 68 75 74 64 6f 77 6e 20 74 68  e to shutdown th
2b80: 65 20 53 53 4c 20 6d 6f 64 75 6c 65 20 70 72 69  e SSL module pri
2b90: 6f 72 20 74 6f 20 70 72 6f 67 72 61 6d 20 65 78  or to program ex
2ba0: 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 73 6c 5f  it..*/.void ssl_
2bb0: 67 6c 6f 62 61 6c 5f 73 68 75 74 64 6f 77 6e 28  global_shutdown(
2bc0: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 73 73 6c  void){.  if( ssl
2bd0: 49 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 53 53  IsInit ){.    SS
2be0: 4c 5f 43 54 58 5f 66 72 65 65 28 73 73 6c 43 74  L_CTX_free(sslCt
2bf0: 78 29 3b 0a 20 20 20 20 73 73 6c 5f 63 6c 65 61  x);.    ssl_clea
2c00: 72 5f 65 72 72 6d 73 67 28 29 3b 0a 20 20 20 20  r_errmsg();.    
2c10: 73 73 6c 49 73 49 6e 69 74 20 3d 20 30 3b 0a 20  sslIsInit = 0;. 
2c20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
2c30: 65 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  e the currently 
2c40: 6f 70 65 6e 20 63 6c 69 65 6e 74 20 53 53 4c 20  open client SSL 
2c50: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20  connection.  If 
2c60: 6e 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  no connection is
2c70: 20 6f 70 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 72   open,.** this r
2c80: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2c90: 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 73 6c 5f 63  p..*/.void ssl_c
2ca0: 6c 6f 73 65 5f 63 6c 69 65 6e 74 28 76 6f 69 64  lose_client(void
2cb0: 29 7b 0a 20 20 69 66 28 20 69 42 69 6f 21 3d 4e  ){.  if( iBio!=N
2cc0: 55 4c 4c 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  ULL ){.    (void
2cd0: 29 42 49 4f 5f 72 65 73 65 74 28 69 42 69 6f 29  )BIO_reset(iBio)
2ce0: 3b 0a 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61  ;.    BIO_free_a
2cf0: 6c 6c 28 69 42 69 6f 29 3b 0a 20 20 20 20 69 42  ll(iBio);.    iB
2d00: 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d  io = NULL;.  }.}
2d10: 0a 0a 2f 2a 20 53 65 65 20 52 46 43 32 38 31 37  ../* See RFC2817
2d20: 20 66 6f 72 20 64 65 74 61 69 6c 73 20 2a 2f 0a   for details */.
2d30: 73 74 61 74 69 63 20 69 6e 74 20 65 73 74 61 62  static int estab
2d40: 6c 69 73 68 5f 70 72 6f 78 79 5f 74 75 6e 6e 65  lish_proxy_tunne
2d50: 6c 28 55 72 6c 44 61 74 61 20 2a 70 55 72 6c 44  l(UrlData *pUrlD
2d60: 61 74 61 2c 20 42 49 4f 20 2a 62 69 6f 29 7b 0a  ata, BIO *bio){.
2d70: 20 20 69 6e 74 20 72 63 2c 20 68 74 74 70 56 65    int rc, httpVe
2d80: 72 4d 69 6e 3b 0a 20 20 63 68 61 72 20 2a 62 62  rMin;.  char *bb
2d90: 75 66 3b 0a 20 20 42 6c 6f 62 20 73 6e 64 2c 20  uf;.  Blob snd, 
2da0: 72 65 70 6c 79 3b 0a 20 20 69 6e 74 20 64 6f 6e  reply;.  int don
2db0: 65 3d 30 2c 65 6e 64 3d 30 3b 0a 20 20 62 6c 6f  e=0,end=0;.  blo
2dc0: 62 5f 7a 65 72 6f 28 26 73 6e 64 29 3b 0a 20 20  b_zero(&snd);.  
2dd0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 6e  blob_appendf(&sn
2de0: 64 2c 20 22 43 4f 4e 4e 45 43 54 20 25 73 3a 25  d, "CONNECT %s:%
2df0: 64 20 48 54 54 50 2f 31 2e 31 5c 72 5c 6e 22 2c  d HTTP/1.1\r\n",
2e00: 20 70 55 72 6c 44 61 74 61 2d 3e 68 6f 73 74 6e   pUrlData->hostn
2e10: 61 6d 65 2c 0a 20 20 20 20 20 20 70 55 72 6c 44  ame,.      pUrlD
2e20: 61 74 61 2d 3e 70 72 6f 78 79 4f 72 69 67 50 6f  ata->proxyOrigPo
2e30: 72 74 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65  rt);.  blob_appe
2e40: 6e 64 66 28 26 73 6e 64 2c 20 22 48 6f 73 74 3a  ndf(&snd, "Host:
2e50: 20 25 73 3a 25 64 5c 72 5c 6e 22 2c 0a 20 20 20   %s:%d\r\n",.   
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 70 55 72 6c              pUrl
2e70: 44 61 74 61 2d 3e 68 6f 73 74 6e 61 6d 65 2c 20  Data->hostname, 
2e80: 70 55 72 6c 44 61 74 61 2d 3e 70 72 6f 78 79 4f  pUrlData->proxyO
2e90: 72 69 67 50 6f 72 74 29 3b 0a 20 20 69 66 28 20  rigPort);.  if( 
2ea0: 70 55 72 6c 44 61 74 61 2d 3e 70 72 6f 78 79 41  pUrlData->proxyA
2eb0: 75 74 68 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f  uth ){.    blob_
2ec0: 61 70 70 65 6e 64 66 28 26 73 6e 64 2c 20 22 50  appendf(&snd, "P
2ed0: 72 6f 78 79 2d 41 75 74 68 6f 72 69 7a 61 74 69  roxy-Authorizati
2ee0: 6f 6e 3a 20 25 73 5c 72 5c 6e 22 2c 20 70 55 72  on: %s\r\n", pUr
2ef0: 6c 44 61 74 61 2d 3e 70 72 6f 78 79 41 75 74 68  lData->proxyAuth
2f00: 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 61 70  );.  }.  blob_ap
2f10: 70 65 6e 64 28 26 73 6e 64 2c 20 22 50 72 6f 78  pend(&snd, "Prox
2f20: 79 2d 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 6b 65  y-Connection: ke
2f30: 65 70 2d 61 6c 69 76 65 5c 72 5c 6e 22 2c 20 2d  ep-alive\r\n", -
2f40: 31 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e  1);.  blob_appen
2f50: 64 66 28 26 73 6e 64 2c 20 22 55 73 65 72 2d 41  df(&snd, "User-A
2f60: 67 65 6e 74 3a 20 25 73 5c 72 5c 6e 22 2c 20 67  gent: %s\r\n", g
2f70: 65 74 5f 75 73 65 72 5f 61 67 65 6e 74 28 29 29  et_user_agent())
2f80: 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28  ;.  blob_append(
2f90: 26 73 6e 64 2c 20 22 5c 72 5c 6e 22 2c 20 32 29  &snd, "\r\n", 2)
2fa0: 3b 0a 20 20 42 49 4f 5f 77 72 69 74 65 28 62 69  ;.  BIO_write(bi
2fb0: 6f 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26  o, blob_buffer(&
2fc0: 73 6e 64 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28  snd), blob_size(
2fd0: 26 73 6e 64 29 29 3b 0a 20 20 62 6c 6f 62 5f 72  &snd));.  blob_r
2fe0: 65 73 65 74 28 26 73 6e 64 29 3b 0a 0a 20 20 2f  eset(&snd);..  /
2ff0: 2a 20 57 61 69 74 20 66 6f 72 20 65 6e 64 20 6f  * Wait for end o
3000: 66 20 72 65 70 6c 79 20 2a 2f 0a 20 20 62 6c 6f  f reply */.  blo
3010: 62 5f 7a 65 72 6f 28 26 72 65 70 6c 79 29 3b 0a  b_zero(&reply);.
3020: 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 6c 65    do{.    int le
3030: 6e 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 5b  n;.    char buf[
3040: 32 35 36 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  256];.    len = 
3050: 42 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 62 75  BIO_read(bio, bu
3060: 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b  f, sizeof(buf));
3070: 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  .    blob_append
3080: 28 26 72 65 70 6c 79 2c 20 62 75 66 2c 20 6c 65  (&reply, buf, le
3090: 6e 29 3b 0a 0a 20 20 20 20 62 62 75 66 20 3d 20  n);..    bbuf = 
30a0: 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 72 65 70  blob_buffer(&rep
30b0: 6c 79 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 62  ly);.    len = b
30c0: 6c 6f 62 5f 73 69 7a 65 28 26 72 65 70 6c 79 29  lob_size(&reply)
30d0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 65 6e 64 20  ;.    while(end 
30e0: 3c 20 6c 65 6e 29 20 7b 0a 20 20 20 20 20 20 69  < len) {.      i
30f0: 66 28 62 62 75 66 5b 65 6e 64 5d 20 3d 3d 20 27  f(bbuf[end] == '
3100: 5c 72 27 29 20 7b 0a 20 20 20 20 20 20 20 20 69  \r') {.        i
3110: 66 28 6c 65 6e 20 2d 20 65 6e 64 20 3c 20 34 29  f(len - end < 4)
3120: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {.          /* 
3130: 6e 65 65 64 20 6d 6f 72 65 20 64 61 74 61 20 2a  need more data *
3140: 2f 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  /.          brea
3150: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
3160: 20 20 20 20 20 69 66 28 6d 65 6d 63 6d 70 28 26       if(memcmp(&
3170: 62 62 75 66 5b 65 6e 64 5d 2c 20 22 5c 72 5c 6e  bbuf[end], "\r\n
3180: 5c 72 5c 6e 22 2c 20 34 29 20 3d 3d 20 30 29 20  \r\n", 4) == 0) 
3190: 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 6e 65  {.          done
31a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
31b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
31c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
31d0: 6e 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  nd++;.    }.  }w
31e0: 68 69 6c 65 28 21 64 6f 6e 65 29 3b 0a 20 20 73  hile(!done);.  s
31f0: 73 63 61 6e 66 28 62 62 75 66 2c 20 22 48 54 54  scanf(bbuf, "HTT
3200: 50 2f 31 2e 25 64 20 25 64 22 2c 20 26 68 74 74  P/1.%d %d", &htt
3210: 70 56 65 72 4d 69 6e 2c 20 26 72 63 29 3b 0a 20  pVerMin, &rc);. 
3220: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 72 65 70   blob_reset(&rep
3230: 6c 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ly);.  return rc
3240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
3250: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  e this routine t
3260: 6f 20 64 69 73 61 62 6c 65 20 53 53 4c 20 63 65  o disable SSL ce
3270: 72 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e 2e  rt verification.
3280: 20 20 41 66 74 65 72 0a 2a 2a 20 74 68 69 73 20    After.** this 
3290: 63 61 6c 6c 20 69 73 20 6d 61 64 65 2c 20 61 6e  call is made, an
32a0: 79 20 53 53 4c 20 63 65 72 74 20 74 68 61 74 20  y SSL cert that 
32b0: 74 68 65 20 73 65 72 76 65 72 20 70 72 6f 76 69  the server provi
32c0: 64 65 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 61  des will.** be a
32d0: 63 63 65 70 74 65 64 2e 20 20 43 6f 6d 6d 75 6e  ccepted.  Commun
32e0: 69 63 61 74 69 6f 6e 20 77 69 6c 6c 20 73 74 69  ication will sti
32f0: 6c 6c 20 62 65 20 65 6e 63 72 79 70 74 65 64 2c  ll be encrypted,
3300: 20 62 75 74 20 74 68 65 0a 2a 2a 20 63 6c 69 65   but the.** clie
3310: 6e 74 20 68 61 73 20 6e 6f 20 77 61 79 20 6f 66  nt has no way of
3320: 20 6b 6e 6f 77 69 6e 67 20 77 68 65 74 68 65 72   knowing whether
3330: 20 69 74 20 69 73 20 74 61 6c 6b 69 6e 67 20 74   it is talking t
3340: 6f 20 74 68 65 0a 2a 2a 20 72 65 61 6c 20 73 65  o the.** real se
3350: 72 76 65 72 20 6f 72 20 61 20 6d 61 6e 2d 69 6e  rver or a man-in
3360: 2d 74 68 65 2d 6d 69 64 64 6c 65 20 69 6d 70 6f  -the-middle impo
3370: 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 73  ster..*/.void ss
3380: 6c 5f 64 69 73 61 62 6c 65 5f 63 65 72 74 5f 76  l_disable_cert_v
3390: 65 72 69 66 69 63 61 74 69 6f 6e 28 76 6f 69 64  erification(void
33a0: 29 7b 0a 20 20 73 73 6c 4e 6f 43 65 72 74 56 65  ){.  sslNoCertVe
33b0: 72 69 66 79 20 3d 20 31 3b 20 20 0a 7d 0a 0a 2f  rify = 1;  .}../
33c0: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20 53 53 4c  *.** Open an SSL
33d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 61   connection as a
33e0: 20 63 6c 69 65 6e 74 20 74 68 61 74 20 69 73 20   client that is 
33f0: 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68  to connect to th
3400: 65 20 73 65 72 76 65 72 0a 2a 2a 20 69 64 65 6e  e server.** iden
3410: 74 69 66 69 65 64 20 62 79 20 70 55 72 6c 44 61  tified by pUrlDa
3420: 74 61 2e 0a 2a 2a 0a 2a 20 20 54 68 65 20 69 64  ta..**.*  The id
3430: 65 6e 74 69 66 79 20 6f 66 20 74 68 65 20 73 65  entify of the se
3440: 72 76 65 72 20 69 73 20 64 65 74 65 72 6d 69 6e  rver is determin
3450: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
3460: 2a 0a 2a 2a 20 20 20 20 70 55 72 6c 44 61 74 61  *.**    pUrlData
3470: 2d 3e 6e 61 6d 65 20 20 4e 61 6d 65 20 6f 66 20  ->name  Name of 
3480: 74 68 65 20 73 65 72 76 65 72 2e 20 20 45 78 3a  the server.  Ex:
3490: 20 66 6f 73 73 69 6c 2d 73 63 6d 2e 6f 72 67 0a   fossil-scm.org.
34a0: 2a 2a 20 20 20 20 67 2e 75 72 6c 2e 6e 61 6d 65  **    g.url.name
34b0: 20 20 20 20 20 20 4e 61 6d 65 20 6f 66 20 74 68        Name of th
34c0: 65 20 70 72 6f 78 79 20 73 65 72 76 65 72 2c 20  e proxy server, 
34d0: 69 66 20 70 72 6f 78 79 69 6e 67 2e 0a 2a 2a 20  if proxying..** 
34e0: 20 20 20 70 55 72 6c 44 61 74 61 2d 3e 70 6f 72     pUrlData->por
34f0: 74 20 20 54 43 50 2f 49 50 20 70 6f 72 74 20 74  t  TCP/IP port t
3500: 6f 20 75 73 65 2e 20 20 45 78 3a 20 38 30 0a 2a  o use.  Ex: 80.*
3510: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
3520: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
3530: 2e 0a 2a 2f 0a 69 6e 74 20 73 73 6c 5f 6f 70 65  ..*/.int ssl_ope
3540: 6e 5f 63 6c 69 65 6e 74 28 55 72 6c 44 61 74 61  n_client(UrlData
3550: 20 2a 70 55 72 6c 44 61 74 61 29 7b 0a 20 20 58   *pUrlData){.  X
3560: 35 30 39 20 2a 63 65 72 74 3b 0a 20 20 63 6f 6e  509 *cert;.  con
3570: 73 74 20 63 68 61 72 20 2a 7a 52 65 6d 6f 74 65  st char *zRemote
3580: 48 6f 73 74 3b 0a 0a 20 20 73 73 6c 5f 67 6c 6f  Host;..  ssl_glo
3590: 62 61 6c 5f 69 6e 69 74 5f 63 6c 69 65 6e 74 28  bal_init_client(
35a0: 29 3b 0a 20 20 69 66 28 20 70 55 72 6c 44 61 74  );.  if( pUrlDat
35b0: 61 2d 3e 75 73 65 50 72 6f 78 79 20 29 7b 0a 20  a->useProxy ){. 
35c0: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63     int rc;.    c
35d0: 68 61 72 20 2a 63 6f 6e 6e 53 74 72 20 3d 20 6d  har *connStr = m
35e0: 70 72 69 6e 74 66 28 22 25 73 3a 25 64 22 2c 20  printf("%s:%d", 
35f0: 67 2e 75 72 6c 2e 6e 61 6d 65 2c 20 70 55 72 6c  g.url.name, pUrl
3600: 44 61 74 61 2d 3e 70 6f 72 74 29 3b 0a 20 20 20  Data->port);.   
3610: 20 42 49 4f 20 2a 73 42 69 6f 20 3d 20 42 49 4f   BIO *sBio = BIO
3620: 5f 6e 65 77 5f 63 6f 6e 6e 65 63 74 28 63 6f 6e  _new_connect(con
3630: 6e 53 74 72 29 3b 0a 20 20 20 20 66 72 65 65 28  nStr);.    free(
3640: 63 6f 6e 6e 53 74 72 29 3b 0a 20 20 20 20 69 66  connStr);.    if
3650: 28 20 42 49 4f 5f 64 6f 5f 63 6f 6e 6e 65 63 74  ( BIO_do_connect
3660: 28 73 42 69 6f 29 3c 3d 30 20 29 7b 0a 20 20 20  (sBio)<=0 ){.   
3670: 20 20 20 73 73 6c 5f 73 65 74 5f 65 72 72 6d 73     ssl_set_errms
3680: 67 28 22 53 53 4c 3a 20 63 61 6e 6e 6f 74 20 63  g("SSL: cannot c
3690: 6f 6e 6e 65 63 74 20 74 6f 20 70 72 6f 78 79 20  onnect to proxy 
36a0: 25 73 3a 25 64 20 28 25 73 29 22 2c 0a 20 20 20  %s:%d (%s)",.   
36b0: 20 20 20 20 20 20 20 20 20 70 55 72 6c 44 61 74           pUrlDat
36c0: 61 2d 3e 6e 61 6d 65 2c 20 70 55 72 6c 44 61 74  a->name, pUrlDat
36d0: 61 2d 3e 70 6f 72 74 2c 0a 20 20 20 20 20 20 20  a->port,.       
36e0: 20 20 20 20 20 45 52 52 5f 72 65 61 73 6f 6e 5f       ERR_reason_
36f0: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52 52  error_string(ERR
3700: 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 29 3b 0a  _get_error()));.
3710: 20 20 20 20 20 20 73 73 6c 5f 63 6c 6f 73 65 5f        ssl_close_
3720: 63 6c 69 65 6e 74 28 29 3b 0a 20 20 20 20 20 20  client();.      
3730: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
3740: 20 20 20 20 72 63 20 3d 20 65 73 74 61 62 6c 69      rc = establi
3750: 73 68 5f 70 72 6f 78 79 5f 74 75 6e 6e 65 6c 28  sh_proxy_tunnel(
3760: 70 55 72 6c 44 61 74 61 2c 20 73 42 69 6f 29 3b  pUrlData, sBio);
3770: 0a 20 20 20 20 69 66 28 20 72 63 3c 32 30 30 7c  .    if( rc<200|
3780: 7c 72 63 3e 32 39 39 20 29 7b 0a 20 20 20 20 20  |rc>299 ){.     
3790: 20 73 73 6c 5f 73 65 74 5f 65 72 72 6d 73 67 28   ssl_set_errmsg(
37a0: 22 53 53 4c 3a 20 70 72 6f 78 79 20 63 6f 6e 6e  "SSL: proxy conn
37b0: 65 63 74 20 66 61 69 6c 65 64 20 77 69 74 68 20  ect failed with 
37c0: 48 54 54 50 20 73 74 61 74 75 73 20 63 6f 64 65  HTTP status code
37d0: 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 20   %d", rc);.     
37e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
37f0: 0a 0a 20 20 20 20 70 55 72 6c 44 61 74 61 2d 3e  ..    pUrlData->
3800: 70 61 74 68 20 3d 20 70 55 72 6c 44 61 74 61 2d  path = pUrlData-
3810: 3e 70 72 6f 78 79 55 72 6c 50 61 74 68 3b 0a 0a  >proxyUrlPath;..
3820: 20 20 20 20 69 42 69 6f 20 3d 20 42 49 4f 5f 6e      iBio = BIO_n
3830: 65 77 5f 73 73 6c 28 73 73 6c 43 74 78 2c 20 31  ew_ssl(sslCtx, 1
3840: 29 3b 0a 20 20 20 20 42 49 4f 5f 70 75 73 68 28  );.    BIO_push(
3850: 69 42 69 6f 2c 20 73 42 69 6f 29 3b 0a 20 20 20  iBio, sBio);.   
3860: 20 7a 52 65 6d 6f 74 65 48 6f 73 74 20 3d 20 70   zRemoteHost = p
3870: 55 72 6c 44 61 74 61 2d 3e 68 6f 73 74 6e 61 6d  UrlData->hostnam
3880: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
3890: 69 42 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 73  iBio = BIO_new_s
38a0: 73 6c 5f 63 6f 6e 6e 65 63 74 28 73 73 6c 43 74  sl_connect(sslCt
38b0: 78 29 3b 0a 20 20 20 20 7a 52 65 6d 6f 74 65 48  x);.    zRemoteH
38c0: 6f 73 74 20 3d 20 70 55 72 6c 44 61 74 61 2d 3e  ost = pUrlData->
38d0: 6e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  name;.  }.  if( 
38e0: 69 42 69 6f 3d 3d 4e 55 4c 4c 20 29 20 7b 0a 20  iBio==NULL ) {. 
38f0: 20 20 20 73 73 6c 5f 73 65 74 5f 65 72 72 6d 73     ssl_set_errms
3900: 67 28 22 53 53 4c 3a 20 63 61 6e 6e 6f 74 20 6f  g("SSL: cannot o
3910: 70 65 6e 20 53 53 4c 20 28 25 73 29 22 2c 0a 20  pen SSL (%s)",. 
3920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3930: 20 20 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72     ERR_reason_er
3940: 72 6f 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67  ror_string(ERR_g
3950: 65 74 5f 65 72 72 6f 72 28 29 29 29 3b 0a 20 20  et_error()));.  
3960: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
3970: 20 20 42 49 4f 5f 67 65 74 5f 73 73 6c 28 69 42    BIO_get_ssl(iB
3980: 69 6f 2c 20 26 73 73 6c 29 3b 0a 0a 23 69 66 20  io, &ssl);..#if 
3990: 28 53 53 4c 45 41 59 5f 56 45 52 53 49 4f 4e 5f  (SSLEAY_VERSION_
39a0: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 30 30 39 30  NUMBER >= 0x0090
39b0: 38 30 37 30 29 20 26 26 20 21 64 65 66 69 6e 65  8070) && !define
39c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
39d0: 45 58 54 29 0a 20 20 69 66 28 20 21 53 53 4c 5f  EXT).  if( !SSL_
39e0: 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f  set_tlsext_host_
39f0: 6e 61 6d 65 28 73 73 6c 2c 20 7a 52 65 6d 6f 74  name(ssl, zRemot
3a00: 65 48 6f 73 74 29 29 7b 0a 20 20 20 20 66 6f 73  eHost)){.    fos
3a10: 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22 57 41 52  sil_warning("WAR
3a20: 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
3a30: 73 65 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20  set server name 
3a40: 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29  indication (SNI)
3a50: 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
3a60: 20 20 20 20 20 20 22 63 6f 6e 74 69 6e 75 69 6e        "continuin
3a70: 67 20 77 69 74 68 6f 75 74 20 69 74 2e 5c 6e 22  g without it.\n"
3a80: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
3a90: 20 53 53 4c 5f 73 65 74 5f 6d 6f 64 65 28 73 73   SSL_set_mode(ss
3aa0: 6c 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f  l, SSL_MODE_AUTO
3ab0: 5f 52 45 54 52 59 29 3b 0a 23 69 66 20 4f 50 45  _RETRY);.#if OPE
3ac0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
3ad0: 42 45 52 20 3e 3d 20 30 78 30 31 30 30 30 32 30  BER >= 0x0100020
3ae0: 30 30 0a 20 20 69 66 28 20 21 73 73 6c 4e 6f 43  00.  if( !sslNoC
3af0: 65 72 74 56 65 72 69 66 79 20 29 7b 0a 20 20 20  ertVerify ){.   
3b00: 20 58 35 30 39 5f 56 45 52 49 46 59 5f 50 41 52   X509_VERIFY_PAR
3b10: 41 4d 20 2a 70 61 72 61 6d 20 3d 20 30 3b 0a 20  AM *param = 0;. 
3b20: 20 20 20 70 61 72 61 6d 20 3d 20 53 53 4c 5f 67     param = SSL_g
3b30: 65 74 30 5f 70 61 72 61 6d 28 73 73 6c 29 3b 0a  et0_param(ssl);.
3b40: 20 20 20 20 69 66 28 20 21 58 35 30 39 5f 56 45      if( !X509_VE
3b50: 52 49 46 59 5f 50 41 52 41 4d 5f 73 65 74 31 5f  RIFY_PARAM_set1_
3b60: 68 6f 73 74 28 70 61 72 61 6d 2c 20 7a 52 65 6d  host(param, zRem
3b70: 6f 74 65 48 6f 73 74 2c 20 73 74 72 6c 65 6e 28  oteHost, strlen(
3b80: 7a 52 65 6d 6f 74 65 48 6f 73 74 29 29 20 29 7b  zRemoteHost)) ){
3b90: 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61  .      fossil_fa
3ba0: 74 61 6c 28 22 66 61 69 6c 65 64 20 74 6f 20 73  tal("failed to s
3bb0: 65 74 20 68 6f 73 74 6e 61 6d 65 2e 22 29 3b 0a  et hostname.");.
3bc0: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 53 53 4c      }.    /* SSL
3bd0: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 73 6c 2c  _set_verify(ssl,
3be0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52   SSL_VERIFY_PEER
3bf0: 2c 20 30 29 3b 20 2a 2f 0a 20 20 7d 0a 23 65 6e  , 0); */.  }.#en
3c00: 64 69 66 0a 0a 20 20 69 66 28 20 21 70 55 72 6c  dif..  if( !pUrl
3c10: 44 61 74 61 2d 3e 75 73 65 50 72 6f 78 79 20 29  Data->useProxy )
3c20: 7b 0a 20 20 20 20 63 68 61 72 20 2a 63 6f 6e 6e  {.    char *conn
3c30: 53 74 72 20 3d 20 6d 70 72 69 6e 74 66 28 22 25  Str = mprintf("%
3c40: 73 3a 25 64 22 2c 20 70 55 72 6c 44 61 74 61 2d  s:%d", pUrlData-
3c50: 3e 6e 61 6d 65 2c 20 70 55 72 6c 44 61 74 61 2d  >name, pUrlData-
3c60: 3e 70 6f 72 74 29 3b 0a 20 20 20 20 42 49 4f 5f  >port);.    BIO_
3c70: 73 65 74 5f 63 6f 6e 6e 5f 68 6f 73 74 6e 61 6d  set_conn_hostnam
3c80: 65 28 69 42 69 6f 2c 20 63 6f 6e 6e 53 74 72 29  e(iBio, connStr)
3c90: 3b 0a 20 20 20 20 66 72 65 65 28 63 6f 6e 6e 53  ;.    free(connS
3ca0: 74 72 29 3b 0a 20 20 20 20 69 66 28 20 42 49 4f  tr);.    if( BIO
3cb0: 5f 64 6f 5f 63 6f 6e 6e 65 63 74 28 69 42 69 6f  _do_connect(iBio
3cc0: 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 73  )<=0 ){.      ss
3cd0: 6c 5f 73 65 74 5f 65 72 72 6d 73 67 28 22 53 53  l_set_errmsg("SS
3ce0: 4c 3a 20 63 61 6e 6e 6f 74 20 63 6f 6e 6e 65 63  L: cannot connec
3cf0: 74 20 74 6f 20 68 6f 73 74 20 25 73 3a 25 64 20  t to host %s:%d 
3d00: 28 25 73 29 22 2c 0a 20 20 20 20 20 20 20 20 20  (%s)",.         
3d10: 70 55 72 6c 44 61 74 61 2d 3e 6e 61 6d 65 2c 20  pUrlData->name, 
3d20: 70 55 72 6c 44 61 74 61 2d 3e 70 6f 72 74 2c 0a  pUrlData->port,.
3d30: 20 20 20 20 20 20 20 20 20 45 52 52 5f 72 65 61           ERR_rea
3d40: 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  son_error_string
3d50: 28 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29  (ERR_get_error()
3d60: 29 29 3b 0a 20 20 20 20 20 20 73 73 6c 5f 63 6c  ));.      ssl_cl
3d70: 6f 73 65 5f 63 6c 69 65 6e 74 28 29 3b 0a 20 20  ose_client();.  
3d80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3d90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 42    }.  }..  if( B
3da0: 49 4f 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28  IO_do_handshake(
3db0: 69 42 69 6f 29 3c 3d 30 20 29 20 7b 0a 20 20 20  iBio)<=0 ) {.   
3dc0: 20 73 73 6c 5f 73 65 74 5f 65 72 72 6d 73 67 28   ssl_set_errmsg(
3dd0: 22 45 72 72 6f 72 20 65 73 74 61 62 6c 69 73 68  "Error establish
3de0: 69 6e 67 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69  ing SSL connecti
3df0: 6f 6e 20 25 73 3a 25 64 20 28 25 73 29 22 2c 0a  on %s:%d (%s)",.
3e00: 20 20 20 20 20 20 20 20 70 55 72 6c 44 61 74 61          pUrlData
3e10: 2d 3e 75 73 65 50 72 6f 78 79 3f 70 55 72 6c 44  ->useProxy?pUrlD
3e20: 61 74 61 2d 3e 68 6f 73 74 6e 61 6d 65 3a 70 55  ata->hostname:pU
3e30: 72 6c 44 61 74 61 2d 3e 6e 61 6d 65 2c 0a 20 20  rlData->name,.  
3e40: 20 20 20 20 20 20 70 55 72 6c 44 61 74 61 2d 3e        pUrlData->
3e50: 75 73 65 50 72 6f 78 79 3f 70 55 72 6c 44 61 74  useProxy?pUrlDat
3e60: 61 2d 3e 70 72 6f 78 79 4f 72 69 67 50 6f 72 74  a->proxyOrigPort
3e70: 3a 70 55 72 6c 44 61 74 61 2d 3e 70 6f 72 74 2c  :pUrlData->port,
3e80: 0a 20 20 20 20 20 20 20 20 45 52 52 5f 72 65 61  .        ERR_rea
3e90: 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  son_error_string
3ea0: 28 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29  (ERR_get_error()
3eb0: 29 29 3b 0a 20 20 20 20 73 73 6c 5f 63 6c 6f 73  ));.    ssl_clos
3ec0: 65 5f 63 6c 69 65 6e 74 28 29 3b 0a 20 20 20 20  e_client();.    
3ed0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
3ee0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 63 65 72 74  /* Check if cert
3ef0: 69 66 69 63 61 74 65 20 69 73 20 76 61 6c 69 64  ificate is valid
3f00: 20 2a 2f 0a 20 20 63 65 72 74 20 3d 20 53 53 4c   */.  cert = SSL
3f10: 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66  _get_peer_certif
3f20: 69 63 61 74 65 28 73 73 6c 29 3b 0a 0a 20 20 69  icate(ssl);..  i
3f30: 66 20 28 20 63 65 72 74 3d 3d 4e 55 4c 4c 20 29  f ( cert==NULL )
3f40: 7b 0a 20 20 20 20 73 73 6c 5f 73 65 74 5f 65 72  {.    ssl_set_er
3f50: 72 6d 73 67 28 22 4e 6f 20 53 53 4c 20 63 65 72  rmsg("No SSL cer
3f60: 74 69 66 69 63 61 74 65 20 77 61 73 20 70 72 65  tificate was pre
3f70: 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 65  sented by the pe
3f80: 65 72 22 29 3b 0a 20 20 20 20 73 73 6c 5f 63 6c  er");.    ssl_cl
3f90: 6f 73 65 5f 63 6c 69 65 6e 74 28 29 3b 0a 20 20  ose_client();.  
3fa0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
3fb0: 0a 20 20 2f 2a 20 44 65 62 75 67 67 69 6e 67 20  .  /* Debugging 
3fc0: 68 69 6e 74 3a 20 20 20 4f 6e 20 75 6e 69 78 2d  hint:   On unix-
3fd0: 6c 69 6b 65 20 73 79 73 74 65 6d 2c 20 72 75 6e  like system, run
3fe0: 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 3a   something like:
3ff0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
4000: 53 4c 5f 43 45 52 54 5f 44 49 52 3d 2f 74 6d 70  SL_CERT_DIR=/tmp
4010: 20 20 2e 2f 66 6f 73 73 69 6c 20 73 79 6e 63 0a    ./fossil sync.
4020: 20 20 2a 2a 0a 20 20 2a 2a 20 74 6f 20 63 61 75    **.  ** to cau
4030: 73 65 20 63 65 72 74 69 66 69 63 61 74 65 20 76  se certificate v
4040: 61 6c 69 64 61 74 69 6f 6e 20 74 6f 20 66 61 69  alidation to fai
4050: 6c 2c 20 61 6e 64 20 74 68 75 73 20 74 65 73 74  l, and thus test
4060: 20 74 68 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20   the fallback.  
4070: 2a 2a 20 6c 6f 67 69 63 2e 0a 20 20 2a 2f 0a 20  ** logic..  */. 
4080: 20 69 66 28 20 21 73 73 6c 4e 6f 43 65 72 74 56   if( !sslNoCertV
4090: 65 72 69 66 79 20 26 26 20 53 53 4c 5f 67 65 74  erify && SSL_get
40a0: 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73  _verify_result(s
40b0: 73 6c 29 21 3d 58 35 30 39 5f 56 5f 4f 4b 20 29  sl)!=X509_V_OK )
40c0: 7b 0a 20 20 20 20 69 6e 74 20 78 2c 20 64 65 73  {.    int x, des
40d0: 63 6c 65 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a  clen;.    char *
40e0: 64 65 73 63 2c 20 2a 70 72 6f 6d 70 74 3b 0a 20  desc, *prompt;. 
40f0: 20 20 20 42 6c 6f 62 20 61 6e 73 3b 0a 20 20 20     Blob ans;.   
4100: 20 63 68 61 72 20 63 52 65 70 6c 79 3b 0a 20 20   char cReply;.  
4110: 20 20 42 49 4f 20 2a 6d 65 6d 3b 0a 20 20 20 20    BIO *mem;.    
4120: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64  unsigned char md
4130: 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45  [EVP_MAX_MD_SIZE
4140: 5d 3b 0a 20 20 20 20 63 68 61 72 20 7a 48 61 73  ];.    char zHas
4150: 68 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a  h[EVP_MAX_MD_SIZ
4160: 45 2a 32 2b 31 5d 3b 0a 20 20 20 20 75 6e 73 69  E*2+1];.    unsi
4170: 67 6e 65 64 20 69 6e 74 20 6d 64 4c 65 6e 67 74  gned int mdLengt
4180: 68 20 3d 20 28 69 6e 74 29 73 69 7a 65 6f 66 28  h = (int)sizeof(
4190: 6d 64 29 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74  md);..    memset
41a0: 28 6d 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  (md, 0, sizeof(m
41b0: 64 29 29 3b 0a 20 20 20 20 7a 48 61 73 68 5b 30  d));.    zHash[0
41c0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41e0: 20 20 20 2f 2a 20 20 4d 4d 4e 4e 46 46 50 50 53     /*  MMNNFFPPS
41f0: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
4200: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
4210: 3d 20 30 78 30 31 30 30 30 30 30 30 30 0a 20 20  = 0x010000000.  
4220: 20 20 78 20 3d 20 58 35 30 39 5f 64 69 67 65 73    x = X509_diges
4230: 74 28 63 65 72 74 2c 20 45 56 50 5f 73 68 61 32  t(cert, EVP_sha2
4240: 35 36 28 29 2c 20 6d 64 2c 20 26 6d 64 4c 65 6e  56(), md, &mdLen
4250: 67 74 68 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  gth);.#else.    
4260: 78 20 3d 20 58 35 30 39 5f 64 69 67 65 73 74 28  x = X509_digest(
4270: 63 65 72 74 2c 20 45 56 50 5f 73 68 61 31 28 29  cert, EVP_sha1()
4280: 2c 20 6d 64 2c 20 26 6d 64 4c 65 6e 67 74 68 29  , md, &mdLength)
4290: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
42a0: 20 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20   x ){.      int 
42b0: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
42c0: 3b 20 6a 3c 6d 64 4c 65 6e 67 74 68 20 26 26 20  ; j<mdLength && 
42d0: 6a 2a 32 2b 31 3c 73 69 7a 65 6f 66 28 7a 48 61  j*2+1<sizeof(zHa
42e0: 73 68 29 3b 20 2b 2b 6a 29 7b 0a 20 20 20 20 20  sh); ++j){.     
42f0: 20 20 20 7a 48 61 73 68 5b 6a 2a 32 5d 20 3d 20     zHash[j*2] = 
4300: 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
4310: 66 22 5b 6d 64 5b 6a 5d 3e 3e 34 5d 3b 0a 20 20  f"[md[j]>>4];.  
4320: 20 20 20 20 20 20 7a 48 61 73 68 5b 6a 2a 32 2b        zHash[j*2+
4330: 31 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38 39  1] = "0123456789
4340: 61 62 63 64 65 66 22 5b 6d 64 5b 6a 5d 26 30 78  abcdef"[md[j]&0x
4350: 66 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  f];.      }.    
4360: 20 20 7a 48 61 73 68 5b 6a 2a 32 5d 20 3d 20 30    zHash[j*2] = 0
4370: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
4380: 20 73 73 6c 5f 63 65 72 74 69 66 69 63 61 74 65   ssl_certificate
4390: 5f 65 78 63 65 70 74 69 6f 6e 5f 65 78 69 73 74  _exception_exist
43a0: 73 28 70 55 72 6c 44 61 74 61 2c 20 7a 48 61 73  s(pUrlData, zHas
43b0: 68 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  h) ){.      /* I
43c0: 67 6e 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72  gnore the failur
43d0: 65 20 62 65 63 61 75 73 65 20 61 6e 20 65 78 63  e because an exc
43e0: 65 70 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f  eption exists */
43f0: 0a 20 20 20 20 20 20 73 73 6c 5f 6f 6e 65 5f 74  .      ssl_one_t
4400: 69 6d 65 5f 65 78 63 65 70 74 69 6f 6e 28 70 55  ime_exception(pU
4410: 72 6c 44 61 74 61 2c 20 7a 48 61 73 68 29 3b 0a  rlData, zHash);.
4420: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4430: 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 75 73 65   /* Tell the use
4440: 72 20 61 62 6f 75 74 20 74 68 65 20 66 61 69 6c  r about the fail
4450: 75 72 65 20 61 6e 64 20 61 73 6b 20 77 68 61 74  ure and ask what
4460: 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 20 20 20 20   to do */.      
4470: 6d 65 6d 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49  mem = BIO_new(BI
4480: 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 20 20 20 20  O_s_mem());.    
4490: 20 20 42 49 4f 5f 70 75 74 73 28 6d 65 6d 2c 20    BIO_puts(mem, 
44a0: 20 20 20 20 22 20 20 73 75 62 6a 65 63 74 3a 20      "  subject: 
44b0: 20 20 22 29 3b 0a 20 20 20 20 20 20 58 35 30 39    ");.      X509
44c0: 5f 4e 41 4d 45 5f 70 72 69 6e 74 5f 65 78 28 6d  _NAME_print_ex(m
44d0: 65 6d 2c 20 58 35 30 39 5f 67 65 74 5f 73 75 62  em, X509_get_sub
44e0: 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 2c  ject_name(cert),
44f0: 20 30 2c 20 58 4e 5f 46 4c 41 47 5f 4f 4e 45 4c   0, XN_FLAG_ONEL
4500: 49 4e 45 29 3b 0a 20 20 20 20 20 20 42 49 4f 5f  INE);.      BIO_
4510: 70 75 74 73 28 6d 65 6d 2c 20 20 20 22 5c 6e 20  puts(mem,   "\n 
4520: 20 69 73 73 75 65 72 3a 20 20 20 20 22 29 3b 0a   issuer:    ");.
4530: 20 20 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 5f        X509_NAME_
4540: 70 72 69 6e 74 5f 65 78 28 6d 65 6d 2c 20 58 35  print_ex(mem, X5
4550: 30 39 5f 67 65 74 5f 69 73 73 75 65 72 5f 6e 61  09_get_issuer_na
4560: 6d 65 28 63 65 72 74 29 2c 20 30 2c 20 58 4e 5f  me(cert), 0, XN_
4570: 46 4c 41 47 5f 4f 4e 45 4c 49 4e 45 29 3b 0a 20  FLAG_ONELINE);. 
4580: 20 20 20 20 20 42 49 4f 5f 70 72 69 6e 74 66 28       BIO_printf(
4590: 6d 65 6d 2c 20 22 5c 6e 20 20 6e 6f 74 42 65 66  mem, "\n  notBef
45a0: 6f 72 65 3a 20 25 73 22 2c 0a 20 20 20 20 20 20  ore: %s",.      
45b0: 20 20 20 20 20 20 20 20 20 20 20 73 73 6c 5f 61             ssl_a
45c0: 73 6e 31 74 69 6d 65 5f 74 6f 5f 69 73 6f 38 36  sn1time_to_iso86
45d0: 30 31 28 58 35 30 39 5f 67 65 74 5f 6e 6f 74 42  01(X509_get_notB
45e0: 65 66 6f 72 65 28 63 65 72 74 29 2c 20 31 29 29  efore(cert), 1))
45f0: 3b 0a 20 20 20 20 20 20 42 49 4f 5f 70 72 69 6e  ;.      BIO_prin
4600: 74 66 28 6d 65 6d 2c 20 22 5c 6e 20 20 6e 6f 74  tf(mem, "\n  not
4610: 41 66 74 65 72 3a 20 20 25 73 22 2c 0a 20 20 20  After:  %s",.   
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 73                ss
4630: 6c 5f 61 73 6e 31 74 69 6d 65 5f 74 6f 5f 69 73  l_asn1time_to_is
4640: 6f 38 36 30 31 28 58 35 30 39 5f 67 65 74 5f 6e  o8601(X509_get_n
4650: 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c 20 31  otAfter(cert), 1
4660: 29 29 3b 0a 20 20 20 20 20 20 42 49 4f 5f 70 72  ));.      BIO_pr
4670: 69 6e 74 66 28 6d 65 6d 2c 20 22 5c 6e 20 20 73  intf(mem, "\n  s
4680: 68 61 32 35 36 3a 20 20 20 20 25 73 22 2c 20 7a  ha256:    %s", z
4690: 48 61 73 68 29 3b 0a 20 20 20 20 20 20 64 65 73  Hash);.      des
46a0: 63 6c 65 6e 20 3d 20 42 49 4f 5f 67 65 74 5f 6d  clen = BIO_get_m
46b0: 65 6d 5f 64 61 74 61 28 6d 65 6d 2c 20 26 64 65  em_data(mem, &de
46c0: 73 63 29 3b 0a 20 20 0a 20 20 20 20 20 20 70 72  sc);.  .      pr
46d0: 6f 6d 70 74 20 3d 20 6d 70 72 69 6e 74 66 28 22  ompt = mprintf("
46e0: 55 6e 61 62 6c 65 20 74 6f 20 76 65 72 69 66 79  Unable to verify
46f0: 20 53 53 4c 20 63 65 72 74 20 66 72 6f 6d 20 25   SSL cert from %
4700: 73 5c 6e 25 2e 2a 73 5c 6e 22 0a 20 20 20 20 20  s\n%.*s\n".     
4710: 20 20 20 20 20 22 61 63 63 65 70 74 20 74 68 69       "accept thi
4720: 73 20 63 65 72 74 20 61 6e 64 20 63 6f 6e 74 69  s cert and conti
4730: 6e 75 65 20 28 79 2f 4e 2f 66 69 6e 67 65 72 70  nue (y/N/fingerp
4740: 72 69 6e 74 29 3f 20 22 2c 0a 20 20 20 20 20 20  rint)? ",.      
4750: 20 20 20 20 70 55 72 6c 44 61 74 61 2d 3e 6e 61      pUrlData->na
4760: 6d 65 2c 20 64 65 73 63 6c 65 6e 2c 20 64 65 73  me, desclen, des
4770: 63 29 3b 0a 20 20 20 20 20 20 42 49 4f 5f 66 72  c);.      BIO_fr
4780: 65 65 28 6d 65 6d 29 3b 0a 20 20 0a 20 20 20 20  ee(mem);.  .    
4790: 20 20 70 72 6f 6d 70 74 5f 75 73 65 72 28 70 72    prompt_user(pr
47a0: 6f 6d 70 74 2c 20 26 61 6e 73 29 3b 0a 20 20 20  ompt, &ans);.   
47b0: 20 20 20 66 72 65 65 28 70 72 6f 6d 70 74 29 3b     free(prompt);
47c0: 0a 20 20 20 20 20 20 63 52 65 70 6c 79 20 3d 20  .      cReply = 
47d0: 62 6c 6f 62 5f 73 74 72 28 26 61 6e 73 29 5b 30  blob_str(&ans)[0
47e0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 52 65  ];.      if( cRe
47f0: 70 6c 79 21 3d 27 79 27 20 26 26 20 63 52 65 70  ply!='y' && cRep
4800: 6c 79 21 3d 27 59 27 0a 20 20 20 20 20 20 20 26  ly!='Y'.       &
4810: 26 20 66 6f 73 73 69 6c 5f 73 74 72 69 63 6d 70  & fossil_stricmp
4820: 28 62 6c 6f 62 5f 73 74 72 28 26 61 6e 73 29 2c  (blob_str(&ans),
4830: 7a 48 61 73 68 29 21 3d 30 0a 20 20 20 20 20 20  zHash)!=0.      
4840: 29 7b 0a 20 20 20 20 20 20 20 20 58 35 30 39 5f  ){.        X509_
4850: 66 72 65 65 28 63 65 72 74 29 3b 0a 20 20 20 20  free(cert);.    
4860: 20 20 20 20 73 73 6c 5f 73 65 74 5f 65 72 72 6d      ssl_set_errm
4870: 73 67 28 22 53 53 4c 20 63 65 72 74 20 64 65 63  sg("SSL cert dec
4880: 6c 69 6e 65 64 22 29 3b 0a 20 20 20 20 20 20 20  lined");.       
4890: 20 73 73 6c 5f 63 6c 6f 73 65 5f 63 6c 69 65 6e   ssl_close_clien
48a0: 74 28 29 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f  t();.        blo
48b0: 62 5f 72 65 73 65 74 28 26 61 6e 73 29 3b 0a 20  b_reset(&ans);. 
48c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
48d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
48e0: 6c 6f 62 5f 72 65 73 65 74 28 26 61 6e 73 29 3b  lob_reset(&ans);
48f0: 0a 20 20 20 20 20 20 73 73 6c 5f 6f 6e 65 5f 74  .      ssl_one_t
4900: 69 6d 65 5f 65 78 63 65 70 74 69 6f 6e 28 70 55  ime_exception(pU
4910: 72 6c 44 61 74 61 2c 20 7a 48 61 73 68 29 3b 0a  rlData, zHash);.
4920: 20 20 20 20 20 20 70 72 6f 6d 70 74 5f 75 73 65        prompt_use
4930: 72 28 22 72 65 6d 65 6d 62 65 72 20 74 68 69 73  r("remember this
4940: 20 65 78 63 65 70 74 69 6f 6e 20 28 79 2f 4e 29   exception (y/N)
4950: 3f 20 22 2c 20 26 61 6e 73 29 3b 0a 20 20 20 20  ? ", &ans);.    
4960: 20 20 63 52 65 70 6c 79 20 3d 20 62 6c 6f 62 5f    cReply = blob_
4970: 73 74 72 28 26 61 6e 73 29 5b 30 5d 3b 0a 20 20  str(&ans)[0];.  
4980: 20 20 20 20 69 66 28 20 63 52 65 70 6c 79 3d 3d      if( cReply==
4990: 27 79 27 20 7c 7c 20 63 52 65 70 6c 79 3d 3d 27  'y' || cReply=='
49a0: 59 27 29 20 7b 0a 20 20 20 20 20 20 20 20 64 62  Y') {.        db
49b0: 5f 6f 70 65 6e 5f 63 6f 6e 66 69 67 28 30 2c 30  _open_config(0,0
49c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 73 6c 5f 72  );.        ssl_r
49d0: 65 6d 65 6d 62 65 72 5f 63 65 72 74 69 66 69 63  emember_certific
49e0: 61 74 65 5f 65 78 63 65 70 74 69 6f 6e 28 70 55  ate_exception(pU
49f0: 72 6c 44 61 74 61 2c 20 7a 48 61 73 68 29 3b 0a  rlData, zHash);.
4a00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 6c        }.      bl
4a10: 6f 62 5f 72 65 73 65 74 28 26 61 6e 73 29 3b 0a  ob_reset(&ans);.
4a20: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
4a30: 53 65 74 20 74 68 65 20 47 6c 6f 62 61 6c 2e 7a  Set the Global.z
4a40: 49 70 41 64 64 72 20 76 61 72 69 61 62 6c 65 20  IpAddr variable 
4a50: 74 6f 20 74 68 65 20 73 65 72 76 65 72 20 77 65  to the server we
4a60: 20 61 72 65 20 74 61 6c 6b 69 6e 67 20 74 6f 2e   are talking to.
4a70: 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73  .  ** This is us
4a80: 65 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ed to populate t
4a90: 68 65 20 69 70 61 64 64 72 20 63 6f 6c 75 6d 6e  he ipaddr column
4aa0: 20 6f 66 20 74 68 65 20 72 63 76 66 72 6f 6d 20   of the rcvfrom 
4ab0: 74 61 62 6c 65 2c 0a 20 20 2a 2a 20 69 66 20 61  table,.  ** if a
4ac0: 6e 79 20 66 69 6c 65 73 20 61 72 65 20 72 65 63  ny files are rec
4ad0: 65 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73  eived from the s
4ae0: 65 72 76 65 72 2e 0a 20 20 2a 2f 0a 20 20 7b 0a  erver..  */.  {.
4af0: 20 20 2f 2a 20 41 73 20 73 6f 6f 6e 20 61 73 20    /* As soon as 
4b00: 6c 69 62 72 65 73 73 6c 20 69 6d 70 6c 65 6d 65  libressl impleme
4b10: 6e 74 73 0a 20 20 2a 2a 20 42 49 4f 5f 41 44 44  nts.  ** BIO_ADD
4b20: 52 5f 68 6f 73 74 6e 61 6d 65 5f 73 74 72 69 6e  R_hostname_strin
4b30: 67 2f 42 49 4f 5f 67 65 74 5f 63 6f 6e 6e 5f 61  g/BIO_get_conn_a
4b40: 64 64 72 65 73 73 2e 0a 20 20 2a 2a 20 63 68 65  ddress..  ** che
4b50: 63 6b 20 68 65 72 65 20 66 6f 72 20 74 68 65 20  ck here for the 
4b60: 63 6f 72 72 65 63 74 20 4c 49 42 52 45 53 53 4c  correct LIBRESSL
4b70: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
4b80: 74 6f 6f 2e 20 46 6f 72 20 6e 6f 77 3a 20 64 69  too. For now: di
4b90: 73 61 62 6c 65 0a 20 20 2a 2f 0a 23 69 66 20 64  sable.  */.#if d
4ba0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 56  efined(OPENSSL_V
4bb0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 20 26  ERSION_NUMBER) &
4bc0: 26 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  & OPENSSL_VERSIO
4bd0: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30  N_NUMBER >= 0x10
4be0: 31 30 30 30 30 30 4c 20 5c 0a 20 20 20 20 20 20  100000L \.      
4bf0: 26 26 20 21 64 65 66 69 6e 65 64 28 4c 49 42 52  && !defined(LIBR
4c00: 45 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  ESSL_VERSION_NUM
4c10: 42 45 52 29 0a 20 20 20 20 63 68 61 72 20 2a 69  BER).    char *i
4c20: 70 20 3d 20 42 49 4f 5f 41 44 44 52 5f 68 6f 73  p = BIO_ADDR_hos
4c30: 74 6e 61 6d 65 5f 73 74 72 69 6e 67 28 42 49 4f  tname_string(BIO
4c40: 5f 67 65 74 5f 63 6f 6e 6e 5f 61 64 64 72 65 73  _get_conn_addres
4c50: 73 28 69 42 69 6f 29 2c 31 29 3b 0a 20 20 20 20  s(iBio),1);.    
4c60: 67 2e 7a 49 70 41 64 64 72 20 3d 20 6d 70 72 69  g.zIpAddr = mpri
4c70: 6e 74 66 28 22 25 73 22 2c 20 69 70 29 3b 0a 20  ntf("%s", ip);. 
4c80: 20 20 20 4f 50 45 4e 53 53 4c 5f 66 72 65 65 28     OPENSSL_free(
4c90: 69 70 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 2f  ip);.#else.    /
4ca0: 2a 20 49 50 76 34 20 6f 6e 6c 79 20 63 6f 64 65  * IPv4 only code
4cb0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
4cc0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 70 3b  signed char *ip;
4cd0: 0a 20 20 20 20 69 70 20 3d 20 28 63 6f 6e 73 74  .    ip = (const
4ce0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29   unsigned char*)
4cf0: 42 49 4f 5f 70 74 72 5f 63 74 72 6c 28 69 42 69  BIO_ptr_ctrl(iBi
4d00: 6f 2c 42 49 4f 5f 43 5f 47 45 54 5f 43 4f 4e 4e  o,BIO_C_GET_CONN
4d10: 45 43 54 2c 32 29 3b 0a 20 20 20 20 67 2e 7a 49  ECT,2);.    g.zI
4d20: 70 41 64 64 72 20 3d 20 6d 70 72 69 6e 74 66 28  pAddr = mprintf(
4d30: 22 25 64 2e 25 64 2e 25 64 2e 25 64 22 2c 20 69  "%d.%d.%d.%d", i
4d40: 70 5b 30 5d 2c 20 69 70 5b 31 5d 2c 20 69 70 5b  p[0], ip[1], ip[
4d50: 32 5d 2c 20 69 70 5b 33 5d 29 3b 0a 23 65 6e 64  2], ip[3]);.#end
4d60: 69 66 0a 20 20 7d 0a 0a 20 20 58 35 30 39 5f 66  if.  }..  X509_f
4d70: 72 65 65 28 63 65 72 74 29 3b 0a 20 20 72 65 74  ree(cert);.  ret
4d80: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4d90: 52 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68  Remember that th
4da0: 65 20 63 65 72 74 20 77 69 74 68 20 74 68 65 20  e cert with the 
4db0: 67 69 76 65 6e 20 68 61 73 68 20 69 73 20 61 20  given hash is a 
4dc0: 61 63 63 65 70 74 61 62 6c 65 20 66 6f 72 0a 2a  acceptable for.*
4dd0: 2a 20 75 73 65 20 77 69 74 68 20 70 55 72 6c 44  * use with pUrlD
4de0: 61 74 61 2d 3e 6e 61 6d 65 2e 0a 2a 2f 0a 4c 4f  ata->name..*/.LO
4df0: 43 41 4c 20 76 6f 69 64 20 73 73 6c 5f 72 65 6d  CAL void ssl_rem
4e00: 65 6d 62 65 72 5f 63 65 72 74 69 66 69 63 61 74  ember_certificat
4e10: 65 5f 65 78 63 65 70 74 69 6f 6e 28 0a 20 20 55  e_exception(.  U
4e20: 72 6c 44 61 74 61 20 2a 70 55 72 6c 44 61 74 61  rlData *pUrlData
4e30: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
4e40: 7a 48 61 73 68 0a 29 7b 0a 20 20 64 62 5f 73 65  zHash.){.  db_se
4e50: 74 5f 6d 70 72 69 6e 74 66 28 7a 48 61 73 68 2c  t_mprintf(zHash,
4e60: 20 31 2c 20 22 63 65 72 74 3a 25 73 22 2c 20 70   1, "cert:%s", p
4e70: 55 72 6c 44 61 74 61 2d 3e 6e 61 6d 65 29 3b 0a  UrlData->name);.
4e80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4e90: 74 72 75 65 20 69 66 20 74 68 65 20 74 68 65 72  true if the ther
4ea0: 65 20 65 78 69 73 74 73 20 61 20 63 65 72 74 69  e exists a certi
4eb0: 66 69 63 61 74 65 20 65 78 63 65 70 74 69 6f 6e  ficate exception
4ec0: 20 66 6f 72 0a 2a 2a 20 70 55 72 6c 44 61 74 61   for.** pUrlData
4ed0: 2d 3e 6e 61 6d 65 20 74 68 61 74 20 6d 61 74 63  ->name that matc
4ee0: 68 65 73 20 74 68 65 20 68 61 73 68 2e 0a 2a 2f  hes the hash..*/
4ef0: 0a 4c 4f 43 41 4c 20 69 6e 74 20 73 73 6c 5f 63  .LOCAL int ssl_c
4f00: 65 72 74 69 66 69 63 61 74 65 5f 65 78 63 65 70  ertificate_excep
4f10: 74 69 6f 6e 5f 65 78 69 73 74 73 28 0a 20 20 55  tion_exists(.  U
4f20: 72 6c 44 61 74 61 20 2a 70 55 72 6c 44 61 74 61  rlData *pUrlData
4f30: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
4f40: 7a 48 61 73 68 0a 29 7b 0a 20 20 63 68 61 72 20  zHash.){.  char 
4f50: 2a 7a 4e 61 6d 65 2c 20 2a 7a 56 61 6c 75 65 3b  *zName, *zValue;
4f60: 0a 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74  .  if( fossil_st
4f70: 72 63 6d 70 28 73 45 78 63 65 70 74 69 6f 6e 2e  rcmp(sException.
4f80: 7a 48 6f 73 74 2c 70 55 72 6c 44 61 74 61 2d 3e  zHost,pUrlData->
4f90: 6e 61 6d 65 29 3d 3d 30 0a 20 20 20 26 26 20 66  name)==0.   && f
4fa0: 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 73 45 78  ossil_strcmp(sEx
4fb0: 63 65 70 74 69 6f 6e 2e 7a 48 61 73 68 2c 7a 48  ception.zHash,zH
4fc0: 61 73 68 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  ash)==0.  ){.   
4fd0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
4fe0: 20 7a 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66   zName = mprintf
4ff0: 28 22 63 65 72 74 3a 25 73 22 2c 20 70 55 72 6c  ("cert:%s", pUrl
5000: 44 61 74 61 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7a  Data->name);.  z
5010: 56 61 6c 75 65 20 3d 20 64 62 5f 67 65 74 28 7a  Value = db_get(z
5020: 4e 61 6d 65 2c 30 29 3b 0a 20 20 66 6f 73 73 69  Name,0);.  fossi
5030: 6c 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  l_free(zName);. 
5040: 20 72 65 74 75 72 6e 20 7a 56 61 6c 75 65 21 3d   return zValue!=
5050: 30 20 26 26 20 73 74 72 63 6d 70 28 7a 48 61 73  0 && strcmp(zHas
5060: 68 2c 7a 56 61 6c 75 65 29 3d 3d 30 3b 0a 7d 0a  h,zValue)==0;.}.
5070: 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
5080: 7a 48 61 73 68 20 61 73 20 61 6e 20 61 63 63 65  zHash as an acce
5090: 70 74 61 62 6c 65 20 63 65 72 74 69 66 69 63 61  ptable certifica
50a0: 74 65 20 66 6f 72 20 74 68 69 73 20 73 65 73 73  te for this sess
50b0: 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a 4c 4f 43  ion only..*/.LOC
50c0: 41 4c 20 76 6f 69 64 20 73 73 6c 5f 6f 6e 65 5f  AL void ssl_one_
50d0: 74 69 6d 65 5f 65 78 63 65 70 74 69 6f 6e 28 0a  time_exception(.
50e0: 20 20 55 72 6c 44 61 74 61 20 2a 70 55 72 6c 44    UrlData *pUrlD
50f0: 61 74 61 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ata,.  const cha
5100: 72 20 2a 7a 48 61 73 68 0a 29 7b 0a 20 20 66 6f  r *zHash.){.  fo
5110: 73 73 69 6c 5f 66 72 65 65 28 73 45 78 63 65 70  ssil_free(sExcep
5120: 74 69 6f 6e 2e 7a 48 6f 73 74 29 3b 0a 20 20 73  tion.zHost);.  s
5130: 45 78 63 65 70 74 69 6f 6e 2e 7a 48 6f 73 74 20  Exception.zHost 
5140: 3d 20 66 6f 73 73 69 6c 5f 73 74 72 64 75 70 28  = fossil_strdup(
5150: 70 55 72 6c 44 61 74 61 2d 3e 6e 61 6d 65 29 3b  pUrlData->name);
5160: 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 73  .  fossil_free(s
5170: 45 78 63 65 70 74 69 6f 6e 2e 7a 48 61 73 68 29  Exception.zHash)
5180: 3b 0a 20 20 73 45 78 63 65 70 74 69 6f 6e 2e 7a  ;.  sException.z
5190: 48 61 73 68 20 3d 20 66 6f 73 73 69 6c 5f 73 74  Hash = fossil_st
51a0: 72 64 75 70 28 7a 48 61 73 68 29 3b 0a 7d 0a 0a  rdup(zHash);.}..
51b0: 2f 2a 0a 2a 2a 20 53 65 6e 64 20 63 6f 6e 74 65  /*.** Send conte
51c0: 6e 74 20 6f 75 74 20 6f 76 65 72 20 74 68 65 20  nt out over the 
51d0: 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  SSL connection f
51e0: 72 6f 6d 20 74 68 65 20 63 6c 69 65 6e 74 20 74  rom the client t
51f0: 6f 0a 2a 2a 20 74 68 65 20 73 65 72 76 65 72 2e  o.** the server.
5200: 0a 2a 2f 0a 73 69 7a 65 5f 74 20 73 73 6c 5f 73  .*/.size_t ssl_s
5210: 65 6e 64 28 76 6f 69 64 20 2a 4e 6f 74 55 73 65  end(void *NotUse
5220: 64 2c 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 6e  d, void *pConten
5230: 74 2c 20 73 69 7a 65 5f 74 20 4e 29 7b 0a 20 20  t, size_t N){.  
5240: 73 69 7a 65 5f 74 20 74 6f 74 61 6c 20 3d 20 30  size_t total = 0
5250: 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 30 20 29  ;.  while( N>0 )
5260: 7b 0a 20 20 20 20 69 6e 74 20 73 65 6e 74 20 3d  {.    int sent =
5270: 20 42 49 4f 5f 77 72 69 74 65 28 69 42 69 6f 2c   BIO_write(iBio,
5280: 20 70 43 6f 6e 74 65 6e 74 2c 20 4e 29 3b 0a 20   pContent, N);. 
5290: 20 20 20 69 66 28 20 73 65 6e 74 3c 3d 30 20 29     if( sent<=0 )
52a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 42 49 4f 5f  {.      if( BIO_
52b0: 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 69 42 69  should_retry(iBi
52c0: 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  o) ){.        co
52d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
52e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
52f0: 20 7d 0a 20 20 20 20 74 6f 74 61 6c 20 2b 3d 20   }.    total += 
5300: 73 65 6e 74 3b 0a 20 20 20 20 4e 20 2d 3d 20 73  sent;.    N -= s
5310: 65 6e 74 3b 0a 20 20 20 20 70 43 6f 6e 74 65 6e  ent;.    pConten
5320: 74 20 3d 20 28 76 6f 69 64 2a 29 26 28 28 63 68  t = (void*)&((ch
5330: 61 72 2a 29 70 43 6f 6e 74 65 6e 74 29 5b 73 65  ar*)pContent)[se
5340: 6e 74 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nt];.  }.  retur
5350: 6e 20 74 6f 74 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n total;.}../*.*
5360: 2a 20 52 65 63 65 69 76 65 20 63 6f 6e 74 65 6e  * Receive conten
5370: 74 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  t back from the 
5380: 63 6c 69 65 6e 74 20 53 53 4c 20 63 6f 6e 6e 65  client SSL conne
5390: 63 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72  ction.  In other
53a0: 0a 2a 2a 20 77 6f 72 64 73 20 72 65 61 64 20 74  .** words read t
53b0: 68 65 20 72 65 70 6c 79 20 62 61 63 6b 20 66 72  he reply back fr
53c0: 6f 6d 20 74 68 65 20 73 65 72 76 65 72 2e 0a 2a  om the server..*
53d0: 2f 0a 73 69 7a 65 5f 74 20 73 73 6c 5f 72 65 63  /.size_t ssl_rec
53e0: 65 69 76 65 28 76 6f 69 64 20 2a 4e 6f 74 55 73  eive(void *NotUs
53f0: 65 64 2c 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65  ed, void *pConte
5400: 6e 74 2c 20 73 69 7a 65 5f 74 20 4e 29 7b 0a 20  nt, size_t N){. 
5410: 20 73 69 7a 65 5f 74 20 74 6f 74 61 6c 20 3d 20   size_t total = 
5420: 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 30 20  0;.  while( N>0 
5430: 29 7b 0a 20 20 20 20 69 6e 74 20 67 6f 74 20 3d  ){.    int got =
5440: 20 42 49 4f 5f 72 65 61 64 28 69 42 69 6f 2c 20   BIO_read(iBio, 
5450: 70 43 6f 6e 74 65 6e 74 2c 20 4e 29 3b 0a 20 20  pContent, N);.  
5460: 20 20 69 66 28 20 67 6f 74 3c 3d 30 20 29 7b 0a    if( got<=0 ){.
5470: 20 20 20 20 20 20 69 66 28 20 42 49 4f 5f 73 68        if( BIO_sh
5480: 6f 75 6c 64 5f 72 65 74 72 79 28 69 42 69 6f 29  ould_retry(iBio)
5490: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
54a0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
54b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
54c0: 0a 20 20 20 20 74 6f 74 61 6c 20 2b 3d 20 67 6f  .    total += go
54d0: 74 3b 0a 20 20 20 20 4e 20 2d 3d 20 67 6f 74 3b  t;.    N -= got;
54e0: 0a 20 20 20 20 70 43 6f 6e 74 65 6e 74 20 3d 20  .    pContent = 
54f0: 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29  (void*)&((char*)
5500: 70 43 6f 6e 74 65 6e 74 29 5b 67 6f 74 5d 3b 0a  pContent)[got];.
5510: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 6f 74    }.  return tot
5520: 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  al;.}../*.** Ini
5530: 74 69 61 6c 69 7a 65 20 74 68 65 20 53 53 4c 20  tialize the SSL 
5540: 6c 69 62 72 61 72 79 20 73 6f 20 74 68 61 74 20  library so that 
5550: 69 74 20 69 73 20 61 62 6c 65 20 74 6f 20 68 61  it is able to ha
5560: 6e 64 6c 65 0a 2a 2a 20 73 65 72 76 65 72 2d 73  ndle.** server-s
5570: 69 64 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ide connections.
5580: 20 20 49 6e 76 6f 6b 65 20 66 6f 73 73 69 6c 5f    Invoke fossil_
5590: 66 61 74 61 6c 28 29 20 69 66 20 74 68 65 72 65  fatal() if there
55a0: 20 61 72 65 0a 2a 2a 20 61 6e 79 20 70 72 6f 62   are.** any prob
55b0: 6c 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  lems..**.** If z
55c0: 4b 65 79 46 69 6c 65 20 61 6e 64 20 7a 43 65 72  KeyFile and zCer
55d0: 74 46 69 6c 65 20 61 72 65 20 6e 6f 74 20 4e 55  tFile are not NU
55e0: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 79 20 61 72  LL, then they ar
55f0: 65 20 74 68 65 20 6e 61 6d 65 73 0a 2a 2a 20 6f  e the names.** o
5600: 66 20 64 69 73 6b 20 66 69 6c 65 73 20 74 68 61  f disk files tha
5610: 74 20 68 6f 6c 64 20 74 68 65 20 63 65 72 74 69  t hold the certi
5620: 66 69 63 61 74 65 20 61 6e 64 20 70 72 69 76 61  ficate and priva
5630: 74 65 2d 6b 65 79 20 66 6f 72 20 74 68 65 0a 2a  te-key for the.*
5640: 2a 20 73 65 72 76 65 72 2e 20 20 49 66 20 7a 43  * server.  If zC
5650: 65 72 74 46 69 6c 65 20 69 73 20 6e 6f 74 20 4e  ertFile is not N
5660: 55 4c 4c 20 62 75 74 20 7a 4b 65 79 46 69 6c 65  ULL but zKeyFile
5670: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 0a 2a   is NULL, then.*
5680: 2a 20 7a 43 65 72 74 46 69 6c 65 20 69 73 20 61  * zCertFile is a
5690: 73 73 75 6d 65 64 20 74 6f 20 62 65 20 61 20 63  ssumed to be a c
56a0: 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20  oncatenation of 
56b0: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
56c0: 61 6e 64 0a 2a 2a 20 74 68 65 20 70 72 69 76 61  and.** the priva
56d0: 74 65 2d 6b 65 79 20 69 6e 20 74 68 65 20 50 45  te-key in the PE
56e0: 4d 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  M format..**.** 
56f0: 49 66 20 7a 43 65 72 74 46 69 6c 65 20 69 73 20  If zCertFile is 
5700: 4e 55 4c 4c 2c 20 74 68 65 6e 20 22 73 73 6c 2d  NULL, then "ssl-
5710: 63 65 72 74 22 20 73 65 74 74 69 6e 67 20 69 73  cert" setting is
5720: 20 63 6f 6e 73 75 6c 74 65 64 0a 2a 2a 20 74 6f   consulted.** to
5730: 20 67 65 74 20 74 68 65 20 63 65 72 74 69 66 69   get the certifi
5740: 63 61 74 65 20 61 6e 64 20 70 72 69 76 61 74 65  cate and private
5750: 2d 6b 65 79 20 28 63 6f 6e 63 61 74 65 6e 61 74  -key (concatenat
5760: 65 64 20 74 6f 67 65 74 68 65 72 2c 20 69 6e 0a  ed together, in.
5770: 2a 2a 20 74 68 65 20 50 45 4d 20 66 6f 72 6d 61  ** the PEM forma
5780: 74 29 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  t).  If there is
5790: 20 6e 6f 20 73 73 6c 2d 63 65 72 74 20 73 65 74   no ssl-cert set
57a0: 74 69 6e 67 2c 20 74 68 65 6e 0a 2a 2a 20 61 20  ting, then.** a 
57b0: 62 75 69 6c 74 2d 69 6e 20 73 65 6c 66 2d 73 69  built-in self-si
57c0: 67 6e 65 64 20 63 65 72 74 20 69 73 20 75 73 65  gned cert is use
57d0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 73 6c 5f 69  d..*/.void ssl_i
57e0: 6e 69 74 5f 73 65 72 76 65 72 28 63 6f 6e 73 74  nit_server(const
57f0: 20 63 68 61 72 20 2a 7a 43 65 72 74 46 69 6c 65   char *zCertFile
5800: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b  , const char *zK
5810: 65 79 46 69 6c 65 29 7b 0a 20 20 69 66 28 20 73  eyFile){.  if( s
5820: 73 6c 49 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  slIsInit==0 ){. 
5830: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5840: 54 6c 73 43 65 72 74 3b 0a 20 20 20 20 53 53 4c  TlsCert;.    SSL
5850: 5f 6c 69 62 72 61 72 79 5f 69 6e 69 74 28 29 3b  _library_init();
5860: 0a 20 20 20 20 53 53 4c 5f 6c 6f 61 64 5f 65 72  .    SSL_load_er
5870: 72 6f 72 5f 73 74 72 69 6e 67 73 28 29 3b 0a 20  ror_strings();. 
5880: 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61     OpenSSL_add_a
5890: 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b  ll_algorithms();
58a0: 0a 20 20 20 20 73 73 6c 43 74 78 20 3d 20 53 53  .    sslCtx = SS
58b0: 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 33  L_CTX_new(SSLv23
58c0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
58d0: 29 3b 0a 20 20 20 20 69 66 28 20 73 73 6c 43 74  );.    if( sslCt
58e0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 52  x==0 ){.      ER
58f0: 52 5f 70 72 69 6e 74 5f 65 72 72 6f 72 73 5f 66  R_print_errors_f
5900: 70 28 73 74 64 65 72 72 29 3b 0a 20 20 20 20 20  p(stderr);.     
5910: 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 45   fossil_fatal("E
5920: 72 72 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e  rror initializin
5930: 67 20 74 68 65 20 53 53 4c 20 73 65 72 76 65 72  g the SSL server
5940: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
5950: 28 20 7a 43 65 72 74 46 69 6c 65 20 26 26 20 7a  ( zCertFile && z
5960: 43 65 72 74 46 69 6c 65 5b 30 5d 20 29 7b 0a 20  CertFile[0] ){. 
5970: 20 20 20 20 20 69 66 28 20 53 53 4c 5f 43 54 58       if( SSL_CTX
5980: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65  _use_certificate
5990: 5f 66 69 6c 65 28 73 73 6c 43 74 78 2c 7a 43 65  _file(sslCtx,zCe
59a0: 72 74 46 69 6c 65 2c 53 53 4c 5f 46 49 4c 45 54  rtFile,SSL_FILET
59b0: 59 50 45 5f 50 45 4d 29 3c 3d 30 20 29 7b 0a 20  YPE_PEM)<=0 ){. 
59c0: 20 20 20 20 20 20 20 45 52 52 5f 70 72 69 6e 74         ERR_print
59d0: 5f 65 72 72 6f 72 73 5f 66 70 28 73 74 64 65 72  _errors_fp(stder
59e0: 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 73 73  r);.        foss
59f0: 69 6c 5f 66 61 74 61 6c 28 22 45 72 72 6f 72 20  il_fatal("Error 
5a00: 6c 6f 61 64 69 6e 67 20 43 45 52 54 20 66 69 6c  loading CERT fil
5a10: 65 20 5c 22 25 73 5c 22 22 2c 20 7a 43 65 72 74  e \"%s\"", zCert
5a20: 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  File);.      }. 
5a30: 20 20 20 20 20 69 66 28 20 7a 4b 65 79 46 69 6c       if( zKeyFil
5a40: 65 3d 3d 30 20 29 20 7a 4b 65 79 46 69 6c 65 20  e==0 ) zKeyFile 
5a50: 3d 20 7a 43 65 72 74 46 69 6c 65 3b 0a 20 20 20  = zCertFile;.   
5a60: 20 20 20 69 66 28 20 53 53 4c 5f 43 54 58 5f 75     if( SSL_CTX_u
5a70: 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69  se_PrivateKey_fi
5a80: 6c 65 28 73 73 6c 43 74 78 2c 20 7a 4b 65 79 46  le(sslCtx, zKeyF
5a90: 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50  ile, SSL_FILETYP
5aa0: 45 5f 50 45 4d 29 3c 3d 30 20 29 7b 0a 20 20 20  E_PEM)<=0 ){.   
5ab0: 20 20 20 20 20 45 52 52 5f 70 72 69 6e 74 5f 65       ERR_print_e
5ac0: 72 72 6f 72 73 5f 66 70 28 73 74 64 65 72 72 29  rrors_fp(stderr)
5ad0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 73 73 69 6c  ;.        fossil
5ae0: 5f 66 61 74 61 6c 28 22 45 72 72 6f 72 20 6c 6f  _fatal("Error lo
5af0: 61 64 69 6e 67 20 50 52 49 56 41 54 45 20 4b 45  ading PRIVATE KE
5b00: 59 20 66 72 6f 6d 20 66 69 6c 65 20 5c 22 25 73  Y from file \"%s
5b10: 5c 22 22 2c 20 7a 4b 65 79 46 69 6c 65 29 3b 0a  \"", zKeyFile);.
5b20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5b30: 65 0a 20 20 20 20 69 66 28 20 28 7a 54 6c 73 43  e.    if( (zTlsC
5b40: 65 72 74 20 3d 20 64 62 5f 67 65 74 28 22 73 73  ert = db_get("ss
5b50: 6c 2d 63 65 72 74 22 2c 30 29 29 21 3d 30 20 29  l-cert",0))!=0 )
5b60: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 73 6c 63  {.      if( sslc
5b70: 74 78 5f 75 73 65 5f 63 65 72 74 5f 66 72 6f 6d  tx_use_cert_from
5b80: 5f 6d 65 6d 28 73 73 6c 43 74 78 2c 20 7a 54 6c  _mem(sslCtx, zTl
5b90: 73 43 65 72 74 2c 20 2d 31 29 0a 20 20 20 20 20  sCert, -1).     
5ba0: 20 20 7c 7c 20 73 73 6c 63 74 78 5f 75 73 65 5f    || sslctx_use_
5bb0: 70 6b 65 79 5f 66 72 6f 6d 5f 6d 65 6d 28 73 73  pkey_from_mem(ss
5bc0: 6c 43 74 78 2c 20 7a 54 6c 73 43 65 72 74 2c 20  lCtx, zTlsCert, 
5bd0: 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  -1).      ){.   
5be0: 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61       fossil_fata
5bf0: 6c 28 22 45 72 72 6f 72 20 6c 6f 61 64 69 6e 67  l("Error loading
5c00: 20 74 68 65 20 43 45 52 54 20 66 72 6f 6d 20 74   the CERT from t
5c10: 68 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  he".            
5c20: 20 20 20 20 20 20 20 20 20 22 20 27 73 73 6c 2d           " 'ssl-
5c30: 63 65 72 74 27 20 73 65 74 74 69 6e 67 22 29 3b  cert' setting");
5c40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5c50: 73 65 20 69 66 28 20 73 73 6c 63 74 78 5f 75 73  se if( sslctx_us
5c60: 65 5f 63 65 72 74 5f 66 72 6f 6d 5f 6d 65 6d 28  e_cert_from_mem(
5c70: 73 73 6c 43 74 78 2c 20 73 73 6c 53 65 6c 66 43  sslCtx, sslSelfC
5c80: 65 72 74 2c 20 2d 31 29 0a 20 20 20 20 20 20 20  ert, -1).       
5c90: 20 20 20 20 7c 7c 20 73 73 6c 63 74 78 5f 75 73      || sslctx_us
5ca0: 65 5f 70 6b 65 79 5f 66 72 6f 6d 5f 6d 65 6d 28  e_pkey_from_mem(
5cb0: 73 73 6c 43 74 78 2c 20 73 73 6c 53 65 6c 66 50  sslCtx, sslSelfP
5cc0: 4b 65 79 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20  Key, -1) ){.    
5cd0: 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22    fossil_fatal("
5ce0: 45 72 72 6f 72 20 6c 6f 61 64 69 6e 67 20 73 65  Error loading se
5cf0: 6c 66 2d 73 69 67 6e 65 64 20 43 45 52 54 22 29  lf-signed CERT")
5d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5d10: 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70  !SSL_CTX_check_p
5d20: 72 69 76 61 74 65 5f 6b 65 79 28 73 73 6c 43 74  rivate_key(sslCt
5d30: 78 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73  x) ){.      foss
5d40: 69 6c 5f 66 61 74 61 6c 28 22 50 52 49 56 41 54  il_fatal("PRIVAT
5d50: 45 20 4b 45 59 20 5c 22 25 73 5c 22 20 64 6f 65  E KEY \"%s\" doe
5d60: 73 20 6e 6f 74 20 6d 61 74 63 68 20 43 45 52 54  s not match CERT
5d70: 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20   \"%s\"",.      
5d80: 20 20 20 20 20 7a 4b 65 79 46 69 6c 65 2c 20 7a       zKeyFile, z
5d90: 43 65 72 74 46 69 6c 65 29 3b 0a 20 20 20 20 7d  CertFile);.    }
5da0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
5db0: 5f 6d 6f 64 65 28 73 73 6c 43 74 78 2c 20 53 53  _mode(sslCtx, SS
5dc0: 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52  L_MODE_AUTO_RETR
5dd0: 59 29 3b 0a 20 20 20 20 73 73 6c 49 73 49 6e 69  Y);.    sslIsIni
5de0: 74 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 2;.  }else{.
5df0: 20 20 20 20 61 73 73 65 72 74 28 20 73 73 6c 49      assert( sslI
5e00: 73 49 6e 69 74 3d 3d 32 20 29 3b 0a 20 20 7d 0a  sInit==2 );.  }.
5e10: 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  }..typedef struc
5e20: 74 20 53 73 6c 53 65 72 76 65 72 43 6f 6e 6e 20  t SslServerConn 
5e30: 7b 0a 20 20 53 53 4c 20 2a 73 73 6c 3b 20 20 20  {.  SSL *ssl;   
5e40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 53         /* The SS
5e50: 4c 20 63 6f 64 65 63 20 2a 2f 0a 20 20 69 6e 74  L codec */.  int
5e60: 20 61 74 45 6f 66 3b 20 20 20 20 20 20 20 20 20   atEof;         
5e70: 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 45 4f 46  /* True when EOF
5e80: 20 72 65 61 63 68 65 64 2e 20 2a 2f 0a 20 20 69   reached. */.  i
5e90: 6e 74 20 69 53 6f 63 6b 65 74 3b 20 20 20 20 20  nt iSocket;     
5ea0: 20 20 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74 20    /* The socket 
5eb0: 2a 2f 0a 7d 20 53 73 6c 53 65 72 76 65 72 43 6f  */.} SslServerCo
5ec0: 6e 6e 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  nn;../*.** Creat
5ed0: 65 20 61 20 6e 65 77 20 73 65 72 76 65 72 2d 73  e a new server-s
5ee0: 69 64 65 20 63 6f 64 65 63 2e 20 20 54 68 65 20  ide codec.  The 
5ef0: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
5f00: 73 6f 63 6b 65 74 27 73 20 66 69 6c 65 0a 2a 2a  socket's file.**
5f10: 20 64 65 73 63 72 69 70 74 6f 72 20 66 72 6f 6d   descriptor from
5f20: 20 77 68 69 63 68 20 74 68 65 20 63 6f 64 65 63   which the codec
5f30: 20 72 65 61 64 73 20 61 6e 64 20 77 72 69 74 65   reads and write
5f40: 73 2e 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a  s. The returned.
5f50: 2a 2a 20 6d 65 6d 6f 72 79 20 6d 75 73 74 20 65  ** memory must e
5f60: 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 70 61 73  ventually be pas
5f70: 73 65 64 20 74 6f 20 73 73 6c 5f 63 6c 6f 73 65  sed to ssl_close
5f80: 5f 73 65 72 76 65 72 28 29 2e 0a 2a 2f 0a 76 6f  _server()..*/.vo
5f90: 69 64 20 2a 73 73 6c 5f 6e 65 77 5f 73 65 72 76  id *ssl_new_serv
5fa0: 65 72 28 69 6e 74 20 69 53 6f 63 6b 65 74 29 7b  er(int iSocket){
5fb0: 0a 20 20 53 73 6c 53 65 72 76 65 72 43 6f 6e 6e  .  SslServerConn
5fc0: 20 2a 70 53 65 72 76 65 72 20 3d 20 66 6f 73 73   *pServer = foss
5fd0: 69 6c 5f 6d 61 6c 6c 6f 63 5f 7a 65 72 6f 28 73  il_malloc_zero(s
5fe0: 69 7a 65 6f 66 28 2a 70 53 65 72 76 65 72 29 29  izeof(*pServer))
5ff0: 3b 0a 20 20 42 49 4f 20 2a 62 20 3d 20 42 49 4f  ;.  BIO *b = BIO
6000: 5f 6e 65 77 5f 73 6f 63 6b 65 74 28 69 53 6f 63  _new_socket(iSoc
6010: 6b 65 74 2c 20 30 29 3b 0a 20 20 70 53 65 72 76  ket, 0);.  pServ
6020: 65 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65  er->ssl = SSL_ne
6030: 77 28 73 73 6c 43 74 78 29 3b 0a 20 20 70 53 65  w(sslCtx);.  pSe
6040: 72 76 65 72 2d 3e 61 74 45 6f 66 20 3d 20 30 3b  rver->atEof = 0;
6050: 0a 20 20 70 53 65 72 76 65 72 2d 3e 69 53 6f 63  .  pServer->iSoc
6060: 6b 65 74 20 3d 20 69 53 6f 63 6b 65 74 3b 0a 20  ket = iSocket;. 
6070: 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 70 53 65   SSL_set_bio(pSe
6080: 72 76 65 72 2d 3e 73 73 6c 2c 20 62 2c 20 62 29  rver->ssl, b, b)
6090: 3b 0a 20 20 53 53 4c 5f 61 63 63 65 70 74 28 70  ;.  SSL_accept(p
60a0: 53 65 72 76 65 72 2d 3e 73 73 6c 29 3b 0a 20 20  Server->ssl);.  
60b0: 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 53  return (void*)pS
60c0: 65 72 76 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erver;.}../*.** 
60d0: 43 6c 6f 73 65 20 61 20 73 65 72 76 65 72 2d 73  Close a server-s
60e0: 69 64 65 20 63 6f 64 65 20 70 72 65 76 69 6f 75  ide code previou
60f0: 73 6c 79 20 72 65 74 75 72 6e 65 64 20 66 72 6f  sly returned fro
6100: 6d 20 73 73 6c 5f 6e 65 77 5f 73 65 72 76 65 72  m ssl_new_server
6110: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 73 6c 5f  ()..*/.void ssl_
6120: 63 6c 6f 73 65 5f 73 65 72 76 65 72 28 76 6f 69  close_server(voi
6130: 64 20 2a 70 53 65 72 76 65 72 41 72 67 29 7b 0a  d *pServerArg){.
6140: 20 20 53 73 6c 53 65 72 76 65 72 43 6f 6e 6e 20    SslServerConn 
6150: 2a 70 53 65 72 76 65 72 20 3d 20 28 53 73 6c 53  *pServer = (SslS
6160: 65 72 76 65 72 43 6f 6e 6e 2a 29 70 53 65 72 76  erverConn*)pServ
6170: 65 72 41 72 67 3b 0a 20 20 53 53 4c 5f 66 72 65  erArg;.  SSL_fre
6180: 65 28 70 53 65 72 76 65 72 2d 3e 73 73 6c 29 3b  e(pServer->ssl);
6190: 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 70  .  fossil_free(p
61a0: 53 65 72 76 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Server);.}../*.*
61b0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
61c0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
61d0: 72 65 20 62 79 74 65 73 20 61 76 61 69 6c 61 62  re bytes availab
61e0: 6c 65 20 74 6f 20 62 65 20 72 65 61 64 20 66 72  le to be read fr
61f0: 6f 6d 0a 2a 2a 20 74 68 65 20 63 6c 69 65 6e 74  om.** the client
6200: 2e 0a 2a 2f 0a 69 6e 74 20 73 73 6c 5f 65 6f 66  ..*/.int ssl_eof
6210: 28 76 6f 69 64 20 2a 70 53 65 72 76 65 72 41 72  (void *pServerAr
6220: 67 29 7b 0a 20 20 53 73 6c 53 65 72 76 65 72 43  g){.  SslServerC
6230: 6f 6e 6e 20 2a 70 53 65 72 76 65 72 20 3d 20 28  onn *pServer = (
6240: 53 73 6c 53 65 72 76 65 72 43 6f 6e 6e 2a 29 70  SslServerConn*)p
6250: 53 65 72 76 65 72 41 72 67 3b 0a 20 20 72 65 74  ServerArg;.  ret
6260: 75 72 6e 20 70 53 65 72 76 65 72 2d 3e 61 74 45  urn pServer->atE
6270: 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  of;.}../*.** Rea
6280: 64 20 63 6c 65 61 72 74 65 78 74 20 62 79 74 65  d cleartext byte
6290: 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  s that have been
62a0: 20 72 65 63 65 69 76 65 64 20 66 72 6f 6d 20 74   received from t
62b0: 68 65 20 63 6c 69 65 6e 74 20 61 6e 64 0a 2a 2a  he client and.**
62c0: 20 64 65 63 72 79 70 74 65 64 20 62 79 20 74 68   decrypted by th
62d0: 65 20 53 53 4c 20 73 65 72 76 65 72 20 63 6f 64  e SSL server cod
62e0: 65 63 2e 0a 2a 2f 0a 73 69 7a 65 5f 74 20 73 73  ec..*/.size_t ss
62f0: 6c 5f 72 65 61 64 5f 73 65 72 76 65 72 28 76 6f  l_read_server(vo
6300: 69 64 20 2a 70 53 65 72 76 65 72 41 72 67 2c 20  id *pServerArg, 
6310: 63 68 61 72 20 2a 7a 42 75 66 2c 20 73 69 7a 65  char *zBuf, size
6320: 5f 74 20 6e 42 75 66 29 7b 0a 20 20 69 6e 74 20  _t nBuf){.  int 
6330: 6e 3b 0a 20 20 53 73 6c 53 65 72 76 65 72 43 6f  n;.  SslServerCo
6340: 6e 6e 20 2a 70 53 65 72 76 65 72 20 3d 20 28 53  nn *pServer = (S
6350: 73 6c 53 65 72 76 65 72 43 6f 6e 6e 2a 29 70 53  slServerConn*)pS
6360: 65 72 76 65 72 41 72 67 3b 0a 20 20 69 66 28 20  erverArg;.  if( 
6370: 70 53 65 72 76 65 72 2d 3e 61 74 45 6f 66 20 29  pServer->atEof )
6380: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
6390: 20 6e 42 75 66 3e 30 78 37 66 66 66 66 66 66 66   nBuf>0x7fffffff
63a0: 20 29 7b 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c   ){ fossil_fatal
63b0: 28 22 53 53 4c 20 72 65 61 64 20 74 6f 6f 20 62  ("SSL read too b
63c0: 69 67 22 29 3b 20 7d 0a 20 20 6e 20 3d 20 53 53  ig"); }.  n = SS
63d0: 4c 5f 72 65 61 64 28 70 53 65 72 76 65 72 2d 3e  L_read(pServer->
63e0: 73 73 6c 2c 20 7a 42 75 66 2c 20 28 69 6e 74 29  ssl, zBuf, (int)
63f0: 6e 42 75 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d  nBuf);.  if( n==
6400: 30 20 29 20 70 53 65 72 76 65 72 2d 3e 61 74 45  0 ) pServer->atE
6410: 6f 66 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  of = 1;.  return
6420: 20 6e 3c 3d 30 20 3f 20 30 20 3a 20 6e 3b 0a 7d   n<=0 ? 0 : n;.}
6430: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
6440: 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 74 65  ingle line of te
6450: 78 74 20 66 72 6f 6d 20 74 68 65 20 63 6c 69 65  xt from the clie
6460: 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 73 6c  nt..*/.char *ssl
6470: 5f 67 65 74 73 28 76 6f 69 64 20 2a 70 53 65 72  _gets(void *pSer
6480: 76 65 72 41 72 67 2c 20 63 68 61 72 20 2a 7a 42  verArg, char *zB
6490: 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20  uf, int nBuf){. 
64a0: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e   int n = 0;.  in
64b0: 74 20 69 3b 0a 20 20 53 73 6c 53 65 72 76 65 72  t i;.  SslServer
64c0: 43 6f 6e 6e 20 2a 70 53 65 72 76 65 72 20 3d 20  Conn *pServer = 
64d0: 28 53 73 6c 53 65 72 76 65 72 43 6f 6e 6e 2a 29  (SslServerConn*)
64e0: 70 53 65 72 76 65 72 41 72 67 3b 0a 20 20 0a 20  pServerArg;.  . 
64f0: 20 69 66 28 20 70 53 65 72 76 65 72 2d 3e 61 74   if( pServer->at
6500: 45 6f 66 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Eof ) return 0;.
6510: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75    for(i=0; i<nBu
6520: 66 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  f-1; i++){.    n
6530: 20 3d 20 53 53 4c 5f 72 65 61 64 28 70 53 65 72   = SSL_read(pSer
6540: 76 65 72 2d 3e 73 73 6c 2c 20 26 7a 42 75 66 5b  ver->ssl, &zBuf[
6550: 69 5d 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  i], 1);.    if( 
6560: 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  n<=0 ){.      re
6570: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
6580: 20 20 69 66 28 20 7a 42 75 66 5b 69 5d 3d 3d 27    if( zBuf[i]=='
6590: 5c 6e 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  \n' ) break;.  }
65a0: 0a 20 20 7a 42 75 66 5b 69 2b 31 5d 20 3d 20 30  .  zBuf[i+1] = 0
65b0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66 3b  ;.  return zBuf;
65c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
65d0: 20 63 6c 65 61 72 74 65 78 74 20 62 79 74 65 73   cleartext bytes
65e0: 20 69 6e 74 6f 20 74 68 65 20 53 53 4c 20 73 65   into the SSL se
65f0: 72 76 65 72 20 63 6f 64 65 63 20 73 6f 20 74 68  rver codec so th
6600: 61 74 20 74 68 65 79 20 63 61 6e 0a 2a 2a 20 62  at they can.** b
6610: 65 20 65 6e 63 72 79 70 74 65 64 20 61 6e 64 20  e encrypted and 
6620: 73 65 6e 74 20 62 61 63 6b 20 74 6f 20 74 68 65  sent back to the
6630: 20 63 6c 69 65 6e 74 2e 0a 2a 2f 0a 73 69 7a 65   client..*/.size
6640: 5f 74 20 73 73 6c 5f 77 72 69 74 65 5f 73 65 72  _t ssl_write_ser
6650: 76 65 72 28 76 6f 69 64 20 2a 70 53 65 72 76 65  ver(void *pServe
6660: 72 41 72 67 2c 20 63 68 61 72 20 2a 7a 42 75 66  rArg, char *zBuf
6670: 2c 20 73 69 7a 65 5f 74 20 6e 42 75 66 29 7b 0a  , size_t nBuf){.
6680: 20 20 69 6e 74 20 6e 3b 0a 20 20 53 73 6c 53 65    int n;.  SslSe
6690: 72 76 65 72 43 6f 6e 6e 20 2a 70 53 65 72 76 65  rverConn *pServe
66a0: 72 20 3d 20 28 53 73 6c 53 65 72 76 65 72 43 6f  r = (SslServerCo
66b0: 6e 6e 2a 29 70 53 65 72 76 65 72 41 72 67 3b 0a  nn*)pServerArg;.
66c0: 20 20 69 66 28 20 6e 42 75 66 3c 3d 30 20 29 20    if( nBuf<=0 ) 
66d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
66e0: 6e 42 75 66 3e 30 78 37 66 66 66 66 66 66 66 20  nBuf>0x7fffffff 
66f0: 29 7b 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28  ){ fossil_fatal(
6700: 22 53 53 4c 20 77 72 69 74 65 20 74 6f 6f 20 62  "SSL write too b
6710: 69 67 22 29 3b 20 7d 0a 20 20 6e 20 3d 20 53 53  ig"); }.  n = SS
6720: 4c 5f 77 72 69 74 65 28 70 53 65 72 76 65 72 2d  L_write(pServer-
6730: 3e 73 73 6c 2c 20 7a 42 75 66 2c 20 28 69 6e 74  >ssl, zBuf, (int
6740: 29 6e 42 75 66 29 3b 0a 20 20 69 66 28 20 6e 3c  )nBuf);.  if( n<
6750: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6760: 20 2d 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28   -SSL_get_error(
6770: 70 53 65 72 76 65 72 2d 3e 73 73 6c 2c 20 6e 29  pServer->ssl, n)
6780: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
6790: 65 74 75 72 6e 20 6e 3b 0a 20 20 7d 0a 7d 0a 0a  eturn n;.  }.}..
67a0: 23 65 6e 64 69 66 20 2f 2a 20 46 4f 53 53 49 4c  #endif /* FOSSIL
67b0: 5f 45 4e 41 42 4c 45 5f 53 53 4c 20 2a 2f 0a 0a  _ENABLE_SSL */..
67c0: 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74  /*.** COMMAND: t
67d0: 6c 73 2d 63 6f 6e 66 69 67 2a 0a 2a 2a 20 43 4f  ls-config*.** CO
67e0: 4d 4d 41 4e 44 3a 20 73 73 6c 2d 63 6f 6e 66 69  MMAND: ssl-confi
67f0: 67 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25  g.**.** Usage: %
6800: 66 6f 73 73 69 6c 20 73 73 6c 2d 63 6f 6e 66 69  fossil ssl-confi
6810: 67 20 5b 53 55 42 43 4f 4d 4d 41 4e 44 5d 20 5b  g [SUBCOMMAND] [
6820: 4f 50 54 49 4f 4e 53 2e 2e 2e 5d 20 5b 41 52 47  OPTIONS...] [ARG
6830: 53 2e 2e 2e 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73  S...].**.** This
6840: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64   command is used
6850: 20 74 6f 20 76 69 65 77 20 6f 72 20 6d 6f 64 69   to view or modi
6860: 66 79 20 74 68 65 20 54 4c 53 20 28 54 72 61 6e  fy the TLS (Tran
6870: 73 70 6f 72 74 20 4c 61 79 65 72 0a 2a 2a 20 53  sport Layer.** S
6880: 65 63 75 72 69 74 79 29 20 63 6f 6e 66 69 67 75  ecurity) configu
6890: 72 61 74 69 6f 6e 20 66 6f 72 20 46 6f 73 73 69  ration for Fossi
68a0: 6c 2e 20 20 54 4c 53 20 28 66 6f 72 6d 65 72 6c  l.  TLS (formerl
68b0: 79 20 53 53 4c 29 20 69 73 20 74 68 65 0a 2a 2a  y SSL) is the.**
68c0: 20 65 6e 63 72 79 70 74 69 6f 6e 20 74 65 63 68   encryption tech
68d0: 6e 6f 6c 6f 67 79 20 75 73 65 64 20 66 6f 72 20  nology used for 
68e0: 73 65 63 75 72 65 20 48 54 54 50 53 20 74 72 61  secure HTTPS tra
68f0: 6e 73 70 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 53 75  nsport..**.** Su
6900: 62 2d 63 6f 6d 6d 61 6e 64 73 3a 0a 2a 2a 0a 2a  b-commands:.**.*
6910: 2a 20 20 20 63 6c 65 61 72 2d 63 65 72 74 20 20  *   clear-cert  
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6930: 52 65 6d 6f 76 65 20 69 6e 66 6f 72 6d 61 74 69  Remove informati
6940: 6f 6e 20 61 62 6f 75 74 20 73 65 72 76 65 72 20  on about server 
6950: 63 65 72 74 69 66 69 63 61 74 65 73 2e 0a 2a 2a  certificates..**
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
6980: 68 69 73 20 69 73 20 61 20 73 75 62 73 65 74 20  his is a subset 
6990: 6f 66 20 74 68 65 20 22 73 63 72 75 62 22 20 63  of the "scrub" c
69a0: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
69b0: 6c 6f 61 64 2d 63 65 72 74 20 50 45 4d 2d 46 49  load-cert PEM-FI
69c0: 4c 45 53 2e 2e 2e 20 20 20 20 20 20 49 64 65 6e  LES...      Iden
69d0: 74 69 66 79 20 73 65 72 76 65 72 20 63 65 72 74  tify server cert
69e0: 69 66 69 63 61 74 65 20 66 69 6c 65 73 2e 20 54  ificate files. T
69f0: 68 65 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  hese.**         
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a10: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
6a20: 69 6e 20 74 68 65 20 50 45 4d 20 66 6f 72 6d 61  in the PEM forma
6a30: 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a  t.  There are.**
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
6a60: 6f 72 6d 61 6c 6c 79 20 74 77 6f 20 66 69 6c 65  ormally two file
6a70: 73 2c 20 74 68 65 20 63 65 72 74 69 66 69 63 61  s, the certifica
6a80: 74 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 20 20  te and the.**   
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76              priv
6ab0: 61 74 65 2d 6b 65 79 2e 20 20 42 79 20 64 65 66  ate-key.  By def
6ac0: 61 75 6c 74 2c 20 74 68 65 20 74 65 78 74 20 6f  ault, the text o
6ad0: 66 20 62 6f 74 68 0a 2a 2a 20 20 20 20 20 20 20  f both.**       
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6af0: 20 20 20 20 20 20 20 20 66 69 6c 65 73 20 69 73          files is
6b00: 20 63 6f 6e 63 61 74 65 6e 61 74 65 64 20 61 6e   concatenated an
6b10: 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 0a 2a  d added to the.*
6b20: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b40: 22 73 73 6c 2d 63 65 72 74 22 20 73 65 74 74 69  "ssl-cert" setti
6b50: 6e 67 2e 20 20 55 73 65 20 2d 2d 66 69 6c 65 6e  ng.  Use --filen
6b60: 61 6d 65 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  ame to store.** 
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 75                ju
6b90: 73 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 73  st the filenames
6ba0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 72 65 6d 6f 76 65  ..**.**   remove
6bb0: 2d 65 78 63 65 70 74 69 6f 6e 20 44 4f 4d 41 49  -exception DOMAI
6bc0: 4e 53 20 20 20 20 52 65 6d 6f 76 65 20 54 4c 53  NS    Remove TLS
6bd0: 20 63 65 72 74 20 65 78 63 65 70 74 69 6f 6e 73   cert exceptions
6be0: 20 66 6f 72 20 74 68 65 20 64 6f 6d 61 69 6e 73   for the domains
6bf0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c10: 20 20 6c 69 73 74 65 64 2e 20 20 4f 72 20 72 65    listed.  Or re
6c20: 6d 6f 76 65 20 74 68 65 6d 20 61 6c 6c 20 69 66  move them all if
6c30: 20 74 68 65 20 2d 2d 61 6c 6c 0a 2a 2a 20 20 20   the --all.**   
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c50: 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 74 69              opti
6c60: 6f 6e 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  on is specified.
6c70: 0a 2a 2a 0a 2a 2a 20 20 20 73 63 72 75 62 20 3f  .**.**   scrub ?
6c80: 2d 2d 66 6f 72 63 65 3f 20 20 20 20 20 20 20 20  --force?        
6c90: 20 20 20 20 20 52 65 6d 6f 76 65 20 61 6c 6c 20       Remove all 
6ca0: 53 53 4c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  SSL configuratio
6cb0: 6e 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 0a  n data from the.
6cc0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ce0: 20 72 65 70 6f 73 69 74 6f 72 79 2e 20 55 73 65   repository. Use
6cf0: 20 2d 2d 66 6f 72 63 65 20 74 6f 20 6f 6d 69 74   --force to omit
6d00: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d20: 20 20 20 20 20 20 63 6f 6e 66 69 72 6d 61 74 69        confirmati
6d30: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 73 68 6f 77  on..**.**   show
6d40: 20 3f 2d 76 3f 20 20 20 20 20 20 20 20 20 20 20   ?-v?           
6d50: 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65          Show the
6d60: 20 54 4c 53 20 63 6f 6e 66 69 67 75 72 61 74 69   TLS configurati
6d70: 6f 6e 2e 20 41 64 64 20 2d 76 20 74 6f 20 73 65  on. Add -v to se
6d80: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6da0: 20 20 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 78     additional ex
6db0: 70 6c 61 69 6e 61 74 69 6f 6e 0a 2a 2f 0a 76 6f  plaination.*/.vo
6dc0: 69 64 20 74 65 73 74 5f 74 6c 73 63 6f 6e 66 69  id test_tlsconfi
6dd0: 67 5f 69 6e 66 6f 28 76 6f 69 64 29 7b 0a 20 20  g_info(void){.  
6de0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64  const char *zCmd
6df0: 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 43 6d 64 3b  ;.  size_t nCmd;
6e00: 0a 20 20 69 6e 74 20 6e 48 69 74 20 3d 20 30 3b  .  int nHit = 0;
6e10: 0a 20 20 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f  .  db_find_and_o
6e20: 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 4f  pen_repository(O
6e30: 50 45 4e 5f 4f 4b 5f 4e 4f 54 5f 46 4f 55 4e 44  PEN_OK_NOT_FOUND
6e40: 7c 4f 50 45 4e 5f 53 55 42 53 54 49 54 55 54 45  |OPEN_SUBSTITUTE
6e50: 2c 30 29 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f 63  ,0);.  db_open_c
6e60: 6f 6e 66 69 67 28 31 2c 30 29 3b 0a 20 20 69 66  onfig(1,0);.  if
6e70: 28 20 67 2e 61 72 67 63 3d 3d 32 20 7c 7c 20 28  ( g.argc==2 || (
6e80: 67 2e 61 72 67 63 3e 3d 33 20 26 26 20 67 2e 61  g.argc>=3 && g.a
6e90: 72 67 76 5b 32 5d 5b 30 5d 3d 3d 27 2d 27 29 20  rgv[2][0]=='-') 
6ea0: 29 7b 0a 20 20 20 20 7a 43 6d 64 20 3d 20 22 73  ){.    zCmd = "s
6eb0: 68 6f 77 22 3b 0a 20 20 20 20 6e 43 6d 64 20 3d  how";.    nCmd =
6ec0: 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   4;.  }else{.   
6ed0: 20 7a 43 6d 64 20 3d 20 67 2e 61 72 67 76 5b 32   zCmd = g.argv[2
6ee0: 5d 3b 0a 20 20 20 20 6e 43 6d 64 20 3d 20 73 74  ];.    nCmd = st
6ef0: 72 6c 65 6e 28 7a 43 6d 64 29 3b 0a 20 20 7d 0a  rlen(zCmd);.  }.
6f00: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 22 63    if( strncmp("c
6f10: 6c 65 61 72 2d 63 65 72 74 22 2c 7a 43 6d 64 2c  lear-cert",zCmd,
6f20: 6e 43 6d 64 29 3d 3d 30 20 26 26 20 6e 43 6d 64  nCmd)==0 && nCmd
6f30: 3e 3d 34 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  >=4 ){.    int b
6f40: 46 6f 72 63 65 20 3d 20 66 69 6e 64 5f 6f 70 74  Force = find_opt
6f50: 69 6f 6e 28 22 66 6f 72 63 65 22 2c 22 66 22 2c  ion("force","f",
6f60: 30 29 21 3d 30 3b 0a 20 20 20 20 76 65 72 69 66  0)!=0;.    verif
6f70: 79 5f 61 6c 6c 5f 6f 70 74 69 6f 6e 73 28 29 3b  y_all_options();
6f80: 0a 20 20 20 20 69 66 28 20 21 62 46 6f 72 63 65  .    if( !bForce
6f90: 20 29 7b 0a 20 20 20 20 20 20 42 6c 6f 62 20 61   ){.      Blob a
6fa0: 6e 73 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63  ns;.      char c
6fb0: 52 65 70 6c 79 3b 0a 20 20 20 20 20 20 70 72 6f  Reply;.      pro
6fc0: 6d 70 74 5f 75 73 65 72 28 0a 20 20 20 20 20 20  mpt_user(.      
6fd0: 20 20 22 43 6f 6e 66 69 72 6d 20 72 65 6d 6f 76    "Confirm remov
6fe0: 69 6e 67 20 6f 66 20 74 68 65 20 53 53 4c 20 73  ing of the SSL s
6ff0: 65 72 76 65 72 20 63 65 72 74 69 66 69 63 61 74  erver certificat
7000: 65 20 66 72 6f 6d 20 74 68 69 73 20 72 65 70 6f  e from this repo
7010: 73 69 74 6f 72 79 2e 5c 6e 22 0a 20 20 20 20 20  sitory.\n".     
7020: 20 20 20 22 54 68 65 20 72 65 6d 6f 76 61 6c 20     "The removal 
7030: 63 61 6e 6e 6f 74 20 62 65 20 75 6e 64 6f 6e 65  cannot be undone
7040: 2e 20 20 43 6f 6e 74 69 6e 75 65 20 28 79 2f 4e  .  Continue (y/N
7050: 29 3f 20 22 2c 20 26 61 6e 73 29 3b 0a 20 20 20  )? ", &ans);.   
7060: 20 20 20 63 52 65 70 6c 79 20 3d 20 62 6c 6f 62     cReply = blob
7070: 5f 73 74 72 28 26 61 6e 73 29 5b 30 5d 3b 0a 20  _str(&ans)[0];. 
7080: 20 20 20 20 20 69 66 28 20 63 52 65 70 6c 79 21       if( cReply!
7090: 3d 27 79 27 20 26 26 20 63 52 65 70 6c 79 21 3d  ='y' && cReply!=
70a0: 27 59 27 20 29 7b 0a 20 20 20 20 20 20 20 20 66  'Y' ){.        f
70b0: 6f 73 73 69 6c 5f 65 78 69 74 28 31 29 3b 0a 20  ossil_exit(1);. 
70c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
70d0: 20 64 62 5f 75 6e 70 72 6f 74 65 63 74 28 50 52   db_unprotect(PR
70e0: 4f 54 45 43 54 5f 41 4c 4c 29 3b 0a 20 20 20 20  OTECT_ALL);.    
70f0: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20  db_multi_exec(. 
7100: 20 20 20 20 20 22 50 52 41 47 4d 41 20 73 65 63       "PRAGMA sec
7110: 75 72 65 5f 64 65 6c 65 74 65 3d 4f 4e 3b 22 0a  ure_delete=ON;".
7120: 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
7130: 4f 4d 20 63 6f 6e 66 69 67 20 22 0a 20 20 20 20  OM config ".    
7140: 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 20 49    " WHERE name I
7150: 4e 20 28 27 73 73 6c 2d 63 65 72 74 27 2c 27 73  N ('ssl-cert','s
7160: 73 6c 2d 63 65 72 74 2d 66 69 6c 65 27 2c 27 73  sl-cert-file','s
7170: 73 6c 2d 63 65 72 74 2d 6b 65 79 27 29 3b 22 0a  sl-cert-key');".
7180: 20 20 20 20 29 3b 0a 20 20 20 20 64 62 5f 70 72      );.    db_pr
7190: 6f 74 65 63 74 5f 70 6f 70 28 29 3b 0a 20 20 7d  otect_pop();.  }
71a0: 65 6c 73 65 0a 20 20 69 66 28 20 73 74 72 6e 63  else.  if( strnc
71b0: 6d 70 28 22 6c 6f 61 64 2d 63 65 72 74 22 2c 7a  mp("load-cert",z
71c0: 43 6d 64 2c 6e 43 6d 64 29 3d 3d 30 20 26 26 20  Cmd,nCmd)==0 && 
71d0: 6e 43 6d 64 3e 3d 34 20 29 7b 0a 20 20 20 20 69  nCmd>=4 ){.    i
71e0: 6e 74 20 62 46 4e 20 3d 20 66 69 6e 64 5f 6f 70  nt bFN = find_op
71f0: 74 69 6f 6e 28 22 66 69 6c 65 6e 61 6d 65 22 2c  tion("filename",
7200: 30 2c 30 29 21 3d 30 3b 0a 20 20 20 20 69 6e 74  0,0)!=0;.    int
7210: 20 69 3b 0a 20 20 20 20 42 6c 6f 62 20 61 6c 6c   i;.    Blob all
7220: 54 65 78 74 20 3d 20 42 4c 4f 42 5f 49 4e 49 54  Text = BLOB_INIT
7230: 49 41 4c 49 5a 45 52 3b 0a 20 20 20 20 69 6e 74  IALIZER;.    int
7240: 20 68 61 76 65 43 65 72 74 20 3d 20 30 3b 0a 20   haveCert = 0;. 
7250: 20 20 20 69 6e 74 20 68 61 76 65 4b 65 79 20 3d     int haveKey =
7260: 20 30 3b 0a 20 20 20 20 76 65 72 69 66 79 5f 61   0;.    verify_a
7270: 6c 6c 5f 6f 70 74 69 6f 6e 73 28 29 3b 0a 20 20  ll_options();.  
7280: 20 20 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73    db_begin_trans
7290: 61 63 74 69 6f 6e 28 29 3b 0a 20 20 20 20 64 62  action();.    db
72a0: 5f 75 6e 70 72 6f 74 65 63 74 28 50 52 4f 54 45  _unprotect(PROTE
72b0: 43 54 5f 41 4c 4c 29 3b 0a 20 20 20 20 64 62 5f  CT_ALL);.    db_
72c0: 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20  multi_exec(.    
72d0: 20 20 22 50 52 41 47 4d 41 20 73 65 63 75 72 65    "PRAGMA secure
72e0: 5f 64 65 6c 65 74 65 3d 4f 4e 3b 22 0a 20 20 20  _delete=ON;".   
72f0: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
7300: 63 6f 6e 66 69 67 20 22 0a 20 20 20 20 20 20 22  config ".      "
7310: 20 57 48 45 52 45 20 6e 61 6d 65 20 49 4e 20 28   WHERE name IN (
7320: 27 73 73 6c 2d 63 65 72 74 27 2c 27 73 73 6c 2d  'ssl-cert','ssl-
7330: 63 65 72 74 2d 66 69 6c 65 27 2c 27 73 73 6c 2d  cert-file','ssl-
7340: 63 65 72 74 2d 6b 65 79 27 29 3b 22 0a 20 20 20  cert-key');".   
7350: 20 29 3b 0a 20 20 20 20 6e 48 69 74 20 3d 20 30   );.    nHit = 0
7360: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33 3b 20 69  ;.    for(i=3; i
7370: 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20  <g.argc; i++){. 
7380: 20 20 20 20 20 42 6c 6f 62 20 78 3b 0a 20 20 20       Blob x;.   
7390: 20 20 20 69 6e 74 20 69 73 43 65 72 74 3b 0a 20     int isCert;. 
73a0: 20 20 20 20 20 69 6e 74 20 69 73 4b 65 79 3b 0a       int isKey;.
73b0: 20 20 20 20 20 20 69 66 28 20 21 66 69 6c 65 5f        if( !file_
73c0: 69 73 66 69 6c 65 28 67 2e 61 72 67 76 5b 69 5d  isfile(g.argv[i]
73d0: 2c 20 45 78 74 46 49 4c 45 29 20 29 7b 0a 20 20  , ExtFILE) ){.  
73e0: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74        fossil_fat
73f0: 61 6c 28 22 6e 6f 20 73 75 63 68 20 66 69 6c 65  al("no such file
7400: 3a 20 5c 22 25 73 5c 22 22 2c 20 67 2e 61 72 67  : \"%s\"", g.arg
7410: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  v[i]);.      }. 
7420: 20 20 20 20 20 62 6c 6f 62 5f 72 65 61 64 5f 66       blob_read_f
7430: 72 6f 6d 5f 66 69 6c 65 28 26 78 2c 20 67 2e 61  rom_file(&x, g.a
7440: 72 67 76 5b 69 5d 2c 20 45 78 74 46 49 4c 45 29  rgv[i], ExtFILE)
7450: 3b 0a 20 20 20 20 20 20 69 73 43 65 72 74 20 3d  ;.      isCert =
7460: 20 73 74 72 73 74 72 28 62 6c 6f 62 5f 73 74 72   strstr(blob_str
7470: 28 26 78 29 2c 22 2d 2d 2d 2d 2d 42 45 47 49 4e  (&x),"-----BEGIN
7480: 20 43 45 52 54 49 46 49 43 41 54 45 2d 2d 2d 2d   CERTIFICATE----
7490: 2d 22 29 21 3d 30 3b 0a 20 20 20 20 20 20 69 73  -")!=0;.      is
74a0: 4b 65 79 20 3d 20 73 74 72 73 74 72 28 62 6c 6f  Key = strstr(blo
74b0: 62 5f 73 74 72 28 26 78 29 2c 22 2d 2d 2d 2d 2d  b_str(&x),"-----
74c0: 42 45 47 49 4e 20 50 52 49 56 41 54 45 20 4b 45  BEGIN PRIVATE KE
74d0: 59 2d 2d 2d 2d 2d 22 29 21 3d 30 3b 0a 20 20 20  Y-----")!=0;.   
74e0: 20 20 20 69 66 28 20 21 69 73 43 65 72 74 20 26     if( !isCert &
74f0: 26 20 21 69 73 4b 65 79 20 29 7b 0a 20 20 20 20  & !isKey ){.    
7500: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c      fossil_fatal
7510: 28 22 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63  ("not a certific
7520: 61 74 65 20 6f 72 20 61 20 70 72 69 76 61 74 65  ate or a private
7530: 20 6b 65 79 3a 20 5c 22 25 73 5c 22 22 2c 20 67   key: \"%s\"", g
7540: 2e 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20  .argv[i]);.     
7550: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 43   }.      if( isC
7560: 65 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ert ){.        i
7570: 66 28 20 68 61 76 65 43 65 72 74 20 29 7b 0a 20  f( haveCert ){. 
7580: 20 20 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f           fossil_
7590: 66 61 74 61 6c 28 22 6d 6f 72 65 20 74 68 61 6e  fatal("more than
75a0: 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74 65   one certificate
75b0: 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 20 20 20   provided");.   
75c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 68       }.        h
75d0: 61 76 65 43 65 72 74 20 3d 20 31 3b 0a 20 20 20  aveCert = 1;.   
75e0: 20 20 20 20 20 69 66 28 20 62 46 4e 20 29 7b 0a       if( bFN ){.
75f0: 20 20 20 20 20 20 20 20 20 20 64 62 5f 73 65 74            db_set
7600: 28 22 73 73 6c 2d 63 65 72 74 2d 66 69 6c 65 22  ("ssl-cert-file"
7610: 2c 20 66 69 6c 65 5f 63 61 6e 6f 6e 69 63 61 6c  , file_canonical
7620: 5f 6e 61 6d 65 5f 64 75 70 28 67 2e 61 72 67 76  _name_dup(g.argv
7630: 5b 69 5d 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  [i]), 0);.      
7640: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7650: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26     blob_append(&
7660: 61 6c 6c 54 65 78 74 2c 20 62 6c 6f 62 5f 62 75  allText, blob_bu
7670: 66 66 65 72 28 26 78 29 2c 20 62 6c 6f 62 5f 73  ffer(&x), blob_s
7680: 69 7a 65 28 26 78 29 29 3b 0a 20 20 20 20 20 20  ize(&x));.      
7690: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
76a0: 69 73 4b 65 79 20 26 26 20 21 68 61 76 65 4b 65  isKey && !haveKe
76b0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 68  y ){.          h
76c0: 61 76 65 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  aveKey = 1;.    
76d0: 20 20 20 20 20 20 69 73 4b 65 79 20 3d 20 30 3b        isKey = 0;
76e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
76f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 4b   }.      if( isK
7700: 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ey ){.        if
7710: 28 20 68 61 76 65 4b 65 79 20 29 7b 0a 20 20 20  ( haveKey ){.   
7720: 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61         fossil_fa
7730: 74 61 6c 28 22 6d 6f 72 65 20 74 68 61 6e 20 6f  tal("more than o
7740: 6e 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 70  ne private key p
7750: 72 6f 76 69 64 65 64 22 29 3b 0a 20 20 20 20 20  rovided");.     
7760: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 68 61 76     }.        hav
7770: 65 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  eKey = 1;.      
7780: 20 20 69 66 28 20 62 46 4e 20 29 7b 0a 20 20 20    if( bFN ){.   
7790: 20 20 20 20 20 20 20 64 62 5f 73 65 74 28 22 73         db_set("s
77a0: 73 6c 2d 6b 65 79 2d 66 69 6c 65 22 2c 20 66 69  sl-key-file", fi
77b0: 6c 65 5f 63 61 6e 6f 6e 69 63 61 6c 5f 6e 61 6d  le_canonical_nam
77c0: 65 5f 64 75 70 28 67 2e 61 72 67 76 5b 69 5d 29  e_dup(g.argv[i])
77d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 0);.        }e
77e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 62  lse{.          b
77f0: 6c 6f 62 5f 61 70 70 65 6e 64 28 26 61 6c 6c 54  lob_append(&allT
7800: 65 78 74 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72  ext, blob_buffer
7810: 28 26 78 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28  (&x), blob_size(
7820: 26 78 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  &x));.        }.
7830: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7840: 20 20 64 62 5f 70 72 6f 74 65 63 74 5f 70 6f 70    db_protect_pop
7850: 28 29 3b 0a 20 20 20 20 69 66 28 20 21 68 61 76  ();.    if( !hav
7860: 65 43 65 72 74 20 29 7b 0a 20 20 20 20 20 20 69  eCert ){.      i
7870: 66 28 20 21 68 61 76 65 4b 65 79 20 29 7b 0a 20  f( !haveKey ){. 
7880: 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61         fossil_fa
7890: 74 61 6c 28 22 6d 69 73 73 69 6e 67 20 63 65 72  tal("missing cer
78a0: 74 69 66 69 63 61 74 65 20 61 6e 64 20 70 72 69  tificate and pri
78b0: 76 61 74 65 2d 6b 65 79 22 29 3b 0a 20 20 20 20  vate-key");.    
78c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
78d0: 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6d   fossil_fatal("m
78e0: 69 73 73 69 6e 67 20 63 65 72 74 69 66 69 63 61  issing certifica
78f0: 74 65 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  te");.      }.  
7900: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 68 61 76    }else if( !hav
7910: 65 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 66 6f  eKey ){.      fo
7920: 73 73 69 6c 5f 66 61 74 61 6c 28 22 6d 69 73 73  ssil_fatal("miss
7930: 69 6e 67 20 70 72 69 76 61 74 65 2d 6b 65 79 22  ing private-key"
7940: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
7950: 20 21 62 46 4e 20 29 7b 0a 20 20 20 20 20 20 64   !bFN ){.      d
7960: 62 5f 73 65 74 28 22 73 73 6c 2d 63 65 72 74 22  b_set("ssl-cert"
7970: 2c 20 62 6c 6f 62 5f 73 74 72 28 26 61 6c 6c 54  , blob_str(&allT
7980: 65 78 74 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ext), 0);.    }.
7990: 20 20 20 20 64 62 5f 63 6f 6d 6d 69 74 5f 74 72      db_commit_tr
79a0: 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 7d  ansaction();.  }
79b0: 65 6c 73 65 0a 20 20 69 66 28 20 73 74 72 6e 63  else.  if( strnc
79c0: 6d 70 28 22 73 63 72 75 62 22 2c 7a 43 6d 64 2c  mp("scrub",zCmd,
79d0: 6e 43 6d 64 29 3d 3d 30 20 26 26 20 6e 43 6d 64  nCmd)==0 && nCmd
79e0: 3e 34 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 46  >4 ){.    int bF
79f0: 6f 72 63 65 20 3d 20 66 69 6e 64 5f 6f 70 74 69  orce = find_opti
7a00: 6f 6e 28 22 66 6f 72 63 65 22 2c 22 66 22 2c 30  on("force","f",0
7a10: 29 21 3d 30 3b 0a 20 20 20 20 76 65 72 69 66 79  )!=0;.    verify
7a20: 5f 61 6c 6c 5f 6f 70 74 69 6f 6e 73 28 29 3b 0a  _all_options();.
7a30: 20 20 20 20 69 66 28 20 21 62 46 6f 72 63 65 20      if( !bForce 
7a40: 29 7b 0a 20 20 20 20 20 20 42 6c 6f 62 20 61 6e  ){.      Blob an
7a50: 73 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 52  s;.      char cR
7a60: 65 70 6c 79 3b 0a 20 20 20 20 20 20 70 72 6f 6d  eply;.      prom
7a70: 70 74 5f 75 73 65 72 28 0a 20 20 20 20 20 20 20  pt_user(.       
7a80: 20 22 53 63 72 75 62 62 69 6e 67 20 74 68 65 20   "Scrubbing the 
7a90: 53 53 4c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  SSL configuratio
7aa0: 6e 20 77 69 6c 6c 20 70 65 72 6d 61 6e 65 6e 74  n will permanent
7ab0: 6c 79 20 64 65 6c 65 74 65 20 69 6e 66 6f 72 6d  ly delete inform
7ac0: 61 74 69 6f 6e 2e 5c 6e 22 0a 20 20 20 20 20 20  ation.\n".      
7ad0: 20 20 22 43 68 61 6e 67 65 73 20 63 61 6e 6e 6f    "Changes canno
7ae0: 74 20 62 65 20 75 6e 64 6f 6e 65 2e 20 20 43 6f  t be undone.  Co
7af0: 6e 74 69 6e 75 65 20 28 79 2f 4e 29 3f 20 22 2c  ntinue (y/N)? ",
7b00: 20 26 61 6e 73 29 3b 0a 20 20 20 20 20 20 63 52   &ans);.      cR
7b10: 65 70 6c 79 20 3d 20 62 6c 6f 62 5f 73 74 72 28  eply = blob_str(
7b20: 26 61 6e 73 29 5b 30 5d 3b 0a 20 20 20 20 20 20  &ans)[0];.      
7b30: 69 66 28 20 63 52 65 70 6c 79 21 3d 27 79 27 20  if( cReply!='y' 
7b40: 26 26 20 63 52 65 70 6c 79 21 3d 27 59 27 20 29  && cReply!='Y' )
7b50: 7b 0a 20 20 20 20 20 20 20 20 66 6f 73 73 69 6c  {.        fossil
7b60: 5f 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20  _exit(1);.      
7b70: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 75  }.    }.    db_u
7b80: 6e 70 72 6f 74 65 63 74 28 50 52 4f 54 45 43 54  nprotect(PROTECT
7b90: 5f 41 4c 4c 29 3b 0a 20 20 20 20 64 62 5f 6d 75  _ALL);.    db_mu
7ba0: 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 20  lti_exec(.      
7bb0: 22 50 52 41 47 4d 41 20 73 65 63 75 72 65 5f 64  "PRAGMA secure_d
7bc0: 65 6c 65 74 65 3d 4f 4e 3b 22 0a 20 20 20 20 20  elete=ON;".     
7bd0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 6f   "DELETE FROM co
7be0: 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65 20  nfig WHERE name 
7bf0: 47 4c 4f 42 20 27 73 73 6c 2d 2a 27 3b 22 0a 20  GLOB 'ssl-*';". 
7c00: 20 20 20 29 3b 0a 20 20 20 20 64 62 5f 70 72 6f     );.    db_pro
7c10: 74 65 63 74 5f 70 6f 70 28 29 3b 0a 20 20 7d 65  tect_pop();.  }e
7c20: 6c 73 65 0a 20 20 69 66 28 20 73 74 72 6e 63 6d  lse.  if( strncm
7c30: 70 28 22 73 68 6f 77 22 2c 7a 43 6d 64 2c 6e 43  p("show",zCmd,nC
7c40: 6d 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f  md)==0 ){.    co
7c50: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
7c60: 20 2a 7a 56 61 6c 75 65 3b 0a 20 20 20 20 73 69   *zValue;.    si
7c70: 7a 65 5f 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20  ze_t nName;.    
7c80: 53 74 6d 74 20 71 3b 0a 20 20 20 20 69 6e 74 20  Stmt q;.    int 
7c90: 76 65 72 62 6f 73 65 20 3d 20 66 69 6e 64 5f 6f  verbose = find_o
7ca0: 70 74 69 6f 6e 28 22 76 65 72 62 6f 73 65 22 2c  ption("verbose",
7cb0: 22 76 22 2c 30 29 21 3d 30 3b 0a 20 20 20 20 76  "v",0)!=0;.    v
7cc0: 65 72 69 66 79 5f 61 6c 6c 5f 6f 70 74 69 6f 6e  erify_all_option
7cd0: 73 28 29 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e  s();..#if !defin
7ce0: 65 64 28 46 4f 53 53 49 4c 5f 45 4e 41 42 4c 45  ed(FOSSIL_ENABLE
7cf0: 5f 53 53 4c 29 0a 20 20 20 20 66 6f 73 73 69 6c  _SSL).    fossil
7d00: 5f 70 72 69 6e 74 28 22 4f 70 65 6e 53 53 4c 2d  _print("OpenSSL-
7d10: 76 65 72 73 69 6f 6e 3a 20 20 20 28 6e 6f 6e 65  version:   (none
7d20: 29 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 76  )\n");.    if( v
7d30: 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
7d40: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 5c 6e  fossil_print("\n
7d50: 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 54 68  ".         "  Th
7d60: 65 20 4f 70 65 6e 53 53 4c 20 6c 69 62 72 61 72  e OpenSSL librar
7d70: 79 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  y is not used by
7d80: 20 74 68 69 73 20 62 75 69 6c 64 20 6f 66 20 46   this build of F
7d90: 6f 73 73 69 6c 5c 6e 5c 6e 22 0a 20 20 20 20 20  ossil\n\n".     
7da0: 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a   );.    }.#else.
7db0: 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74      fossil_print
7dc0: 28 22 4f 70 65 6e 53 53 4c 2d 76 65 72 73 69 6f  ("OpenSSL-versio
7dd0: 6e 3a 20 20 20 25 73 20 20 28 30 78 25 30 39 78  n:   %s  (0x%09x
7de0: 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 53  )\n",.         S
7df0: 53 4c 65 61 79 5f 76 65 72 73 69 6f 6e 28 53 53  SLeay_version(SS
7e00: 4c 45 41 59 5f 56 45 52 53 49 4f 4e 29 2c 20 4f  LEAY_VERSION), O
7e10: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
7e20: 55 4d 42 45 52 29 3b 0a 20 20 20 20 69 66 28 20  UMBER);.    if( 
7e30: 76 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  verbose ){.     
7e40: 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 5c   fossil_print("\
7e50: 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 54  n".         "  T
7e60: 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  he version of th
7e70: 65 20 4f 70 65 6e 53 53 4c 20 6c 69 62 72 61 72  e OpenSSL librar
7e80: 79 20 62 65 69 6e 67 20 75 73 65 64 5c 6e 22 0a  y being used\n".
7e90: 20 20 20 20 20 20 20 20 20 22 20 20 62 79 20 74           "  by t
7ea0: 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  his instance of 
7eb0: 46 6f 73 73 69 6c 2e 20 20 56 65 72 73 69 6f 6e  Fossil.  Version
7ec0: 20 33 2e 30 2e 30 20 6f 72 5c 6e 22 0a 20 20 20   3.0.0 or\n".   
7ed0: 20 20 20 20 20 20 22 20 20 6c 61 74 65 72 20 69        "  later i
7ee0: 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 5c 6e  s recommended.\n
7ef0: 5c 6e 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  \n".      );.   
7f00: 20 7d 0a 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70   }..    fossil_p
7f10: 72 69 6e 74 28 22 4f 70 65 6e 53 53 4c 2d 63 65  rint("OpenSSL-ce
7f20: 72 74 2d 66 69 6c 65 3a 20 25 73 5c 6e 22 2c 20  rt-file: %s\n", 
7f30: 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74  X509_get_default
7f40: 5f 63 65 72 74 5f 66 69 6c 65 28 29 29 3b 0a 20  _cert_file());. 
7f50: 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28     fossil_print(
7f60: 22 4f 70 65 6e 53 53 4c 2d 63 65 72 74 2d 64 69  "OpenSSL-cert-di
7f70: 72 3a 20 20 25 73 5c 6e 22 2c 20 58 35 30 39 5f  r:  %s\n", X509_
7f80: 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74  get_default_cert
7f90: 5f 64 69 72 28 29 29 3b 0a 20 20 20 20 69 66 28  _dir());.    if(
7fa0: 20 76 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20   verbose ){.    
7fb0: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
7fc0: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20 20  \n".         "  
7fd0: 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 61  The default loca
7fe0: 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 73 65  tions for the se
7ff0: 74 20 6f 66 20 72 6f 6f 74 20 63 65 72 74 69 66  t of root certif
8000: 69 63 61 74 65 73 5c 6e 22 0a 20 20 20 20 20 20  icates\n".      
8010: 20 20 20 22 20 20 75 73 65 64 20 62 79 20 74 68     "  used by th
8020: 65 20 5c 22 66 6f 73 73 69 6c 20 73 79 6e 63 5c  e \"fossil sync\
8030: 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6f  " and similar co
8040: 6d 6d 61 6e 64 73 20 74 6f 20 76 65 72 69 66 79  mmands to verify
8050: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20 20  \n".         "  
8060: 74 68 65 20 69 64 65 6e 74 69 74 79 20 6f 66 20  the identity of 
8070: 73 65 72 76 65 72 73 20 66 6f 72 20 5c 22 68 74  servers for \"ht
8080: 74 70 73 3a 5c 22 20 55 52 4c 73 2e 20 54 68 65  tps:\" URLs. The
8090: 73 65 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 20  se values\n".   
80a0: 20 20 20 20 20 20 22 20 20 63 6f 6d 65 20 69 6e        "  come in
80b0: 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 46 6f 73  to play when Fos
80c0: 73 69 6c 20 69 73 20 75 73 65 64 20 61 73 20 61  sil is used as a
80d0: 20 54 4c 53 20 63 6c 69 65 6e 74 2e 20 20 54 68   TLS client.  Th
80e0: 65 73 65 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  ese\n".         
80f0: 22 20 20 76 61 6c 75 65 73 20 61 72 65 20 62 75  "  values are bu
8100: 69 6c 74 20 69 6e 74 6f 20 79 6f 75 72 20 4f 70  ilt into your Op
8110: 65 6e 53 53 4c 20 6c 69 62 72 61 72 79 2e 5c 6e  enSSL library.\n
8120: 5c 6e 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  \n".      );.   
8130: 20 7d 0a 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   }..    zName = 
8140: 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74  X509_get_default
8150: 5f 63 65 72 74 5f 66 69 6c 65 5f 65 6e 76 28 29  _cert_file_env()
8160: 3b 0a 20 20 20 20 7a 56 61 6c 75 65 20 3d 20 66  ;.    zValue = f
8170: 6f 73 73 69 6c 5f 67 65 74 65 6e 76 28 7a 4e 61  ossil_getenv(zNa
8180: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 56 61  me);.    if( zVa
8190: 6c 75 65 3d 3d 30 20 29 20 7a 56 61 6c 75 65 20  lue==0 ) zValue 
81a0: 3d 20 22 22 3b 0a 20 20 20 20 6e 4e 61 6d 65 20  = "";.    nName 
81b0: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
81c0: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e  .    fossil_prin
81d0: 74 28 22 25 73 3a 25 2a 73 25 73 5c 6e 22 2c 20  t("%s:%*s%s\n", 
81e0: 7a 4e 61 6d 65 2c 20 31 38 2d 6e 4e 61 6d 65 2c  zName, 18-nName,
81f0: 20 22 22 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 20   "", zValue);.  
8200: 20 20 7a 4e 61 6d 65 20 3d 20 58 35 30 39 5f 67    zName = X509_g
8210: 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f  et_default_cert_
8220: 64 69 72 5f 65 6e 76 28 29 3b 0a 20 20 20 20 7a  dir_env();.    z
8230: 56 61 6c 75 65 20 3d 20 66 6f 73 73 69 6c 5f 67  Value = fossil_g
8240: 65 74 65 6e 76 28 7a 4e 61 6d 65 29 3b 0a 20 20  etenv(zName);.  
8250: 20 20 69 66 28 20 7a 56 61 6c 75 65 3d 3d 30 20    if( zValue==0 
8260: 29 20 7a 56 61 6c 75 65 20 3d 20 22 22 3b 0a 20  ) zValue = "";. 
8270: 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65     nName = strle
8280: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  n(zName);.    fo
8290: 73 73 69 6c 5f 70 72 69 6e 74 28 22 25 73 3a 25  ssil_print("%s:%
82a0: 2a 73 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20  *s%s\n", zName, 
82b0: 31 38 2d 6e 4e 61 6d 65 2c 20 22 22 2c 20 7a 56  18-nName, "", zV
82c0: 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 76  alue);.    if( v
82d0: 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
82e0: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 5c 6e  fossil_print("\n
82f0: 22 0a 20 20 20 20 20 20 20 20 22 20 20 41 6c 74  ".        "  Alt
8300: 65 72 6e 61 74 69 76 65 20 6c 6f 63 61 74 69 6f  ernative locatio
8310: 6e 73 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  ns for the root 
8320: 63 65 72 74 69 66 69 63 61 74 65 73 20 75 73 65  certificates use
8330: 64 20 62 79 20 46 6f 73 73 69 6c 5c 6e 22 0a 20  d by Fossil\n". 
8340: 20 20 20 20 20 20 20 22 20 20 77 68 65 6e 20 69         "  when i
8350: 74 20 69 73 20 61 63 74 69 6e 67 20 61 73 20 61  t is acting as a
8360: 20 53 53 4c 20 63 6c 69 65 6e 74 20 69 6e 20 6f   SSL client in o
8370: 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 20 74  rder to verify t
8380: 68 65 20 69 64 65 6e 74 69 74 79 5c 6e 22 0a 20  he identity\n". 
8390: 20 20 20 20 20 20 20 22 20 20 6f 66 20 73 65 72         "  of ser
83a0: 76 65 72 73 2e 20 49 66 20 73 70 65 63 69 66 69  vers. If specifi
83b0: 65 64 2c 20 74 68 65 73 65 20 61 6c 74 65 72 6e  ed, these altern
83c0: 61 74 69 76 65 20 6c 6f 63 61 74 69 6f 6e 73 20  ative locations 
83d0: 6f 76 65 72 72 69 64 65 5c 6e 22 0a 20 20 20 20  override\n".    
83e0: 20 20 20 20 22 20 20 74 68 65 20 62 75 69 6c 74      "  the built
83f0: 2d 69 6e 20 6c 6f 63 61 74 69 6f 6e 73 2e 5c 6e  -in locations.\n
8400: 5c 6e 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  \n".      );.   
8410: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 46 4f 53   }.#endif /* FOS
8420: 53 49 4c 5f 45 4e 41 42 4c 45 5f 53 53 4c 20 2a  SIL_ENABLE_SSL *
8430: 2f 0a 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72  /..    fossil_pr
8440: 69 6e 74 28 22 73 73 6c 2d 63 61 2d 6c 6f 63 61  int("ssl-ca-loca
8450: 74 69 6f 6e 3a 20 20 20 25 73 5c 6e 22 2c 20 64  tion:   %s\n", d
8460: 62 5f 67 65 74 28 22 73 73 6c 2d 63 61 2d 6c 6f  b_get("ssl-ca-lo
8470: 63 61 74 69 6f 6e 22 2c 22 22 29 29 3b 0a 20 20  cation",""));.  
8480: 20 20 69 66 28 20 76 65 72 62 6f 73 65 20 29 7b    if( verbose ){
8490: 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72  .      fossil_pr
84a0: 69 6e 74 28 22 5c 6e 22 0a 20 20 20 20 20 20 20  int("\n".       
84b0: 20 20 22 20 20 54 68 69 73 20 73 65 74 74 69 6e    "  This settin
84c0: 67 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  g is the name of
84d0: 20 61 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63   a file or direc
84e0: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
84f0: 6e 73 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22  ns\n".         "
8500: 20 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73    the complete s
8510: 65 74 20 6f 66 20 72 6f 6f 74 20 63 65 72 74 69  et of root certi
8520: 66 69 63 61 74 65 73 20 74 6f 20 75 73 65 64 20  ficates to used 
8530: 62 79 20 46 6f 73 73 69 6c 20 77 68 65 6e 20 69  by Fossil when i
8540: 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20  t\n".         " 
8550: 20 69 73 20 61 63 74 69 6e 67 20 61 73 20 61 20   is acting as a 
8560: 53 53 4c 20 63 6c 69 65 6e 74 2e 20 49 66 20 64  SSL client. If d
8570: 65 66 69 6e 65 64 2c 20 74 68 69 73 20 73 65 74  efined, this set
8580: 74 69 6e 67 20 74 61 6b 65 73 5c 6e 22 0a 20 20  ting takes\n".  
8590: 20 20 20 20 20 20 20 22 20 20 70 72 69 6f 72 69         "  priori
85a0: 74 79 20 6f 76 65 72 20 62 75 69 6c 74 2d 69 6e  ty over built-in
85b0: 20 70 61 74 68 73 20 61 6e 64 20 65 6e 76 69 72   paths and envir
85c0: 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73  onment variables
85d0: 5c 6e 5c 6e 22 0a 20 20 20 20 20 20 29 3b 0a 20  \n\n".      );. 
85e0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 73 73 69 6c     }..    fossil
85f0: 5f 70 72 69 6e 74 28 22 73 73 6c 2d 69 64 65 6e  _print("ssl-iden
8600: 74 69 74 79 3a 20 20 20 20 20 20 25 73 5c 6e 22  tity:      %s\n"
8610: 2c 20 64 62 5f 67 65 74 28 22 73 73 6c 2d 69 64  , db_get("ssl-id
8620: 65 6e 74 69 74 79 22 2c 22 22 29 29 3b 0a 20 20  entity",""));.  
8630: 20 20 69 66 28 20 76 65 72 62 6f 73 65 20 29 7b    if( verbose ){
8640: 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72  .      fossil_pr
8650: 69 6e 74 28 22 5c 6e 22 0a 20 20 20 20 20 20 20  int("\n".       
8660: 20 20 22 20 20 54 68 69 73 20 73 65 74 74 69 6e    "  This settin
8670: 67 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  g is the name of
8680: 20 61 20 66 69 6c 65 20 74 68 61 74 20 63 6f 6e   a file that con
8690: 74 61 69 6e 73 20 74 68 65 20 50 45 4d 2d 66 6f  tains the PEM-fo
86a0: 72 6d 61 74 5c 6e 22 0a 20 20 20 20 20 20 20 20  rmat\n".        
86b0: 20 22 20 20 63 65 72 74 69 66 69 63 61 74 65 20   "  certificate 
86c0: 61 6e 64 20 70 72 69 76 61 74 65 2d 6b 65 79 20  and private-key 
86d0: 75 73 65 64 20 62 79 20 46 6f 73 73 69 6c 20 63  used by Fossil c
86e0: 6c 69 65 6e 74 73 20 74 6f 20 61 75 74 68 65 6e  lients to authen
86f0: 74 69 63 65 5c 6e 22 0a 20 20 20 20 20 20 20 20  tice\n".        
8700: 20 22 20 20 77 69 74 68 20 73 65 72 76 65 72 73   "  with servers
8710: 2e 20 46 65 77 20 73 65 72 76 65 72 73 20 61 63  . Few servers ac
8720: 74 75 61 6c 6c 79 20 72 65 71 75 69 72 65 20 74  tually require t
8730: 68 69 73 2c 20 73 6f 20 74 68 69 73 20 73 65 74  his, so this set
8740: 74 69 6e 67 5c 6e 22 0a 20 20 20 20 20 20 20 20  ting\n".        
8750: 20 22 20 20 69 73 20 75 73 75 61 6c 6c 79 20 62   "  is usually b
8760: 6c 61 6e 6b 2e 5c 6e 5c 6e 22 0a 20 20 20 20 20  lank.\n\n".     
8770: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a   );.    }..    z
8780: 56 61 6c 75 65 20 3d 20 64 62 5f 67 65 74 28 22  Value = db_get("
8790: 73 73 6c 2d 63 65 72 74 22 2c 30 29 3b 0a 20 20  ssl-cert",0);.  
87a0: 20 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a    if( zValue ){.
87b0: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69        fossil_pri
87c0: 6e 74 28 22 73 73 6c 2d 63 65 72 74 3a 20 20 20  nt("ssl-cert:   
87d0: 20 20 20 20 20 20 20 28 25 64 2d 62 79 74 65 20         (%d-byte 
87e0: 50 45 4d 29 5c 6e 22 2c 20 28 69 6e 74 29 73 74  PEM)\n", (int)st
87f0: 72 6c 65 6e 28 7a 56 61 6c 75 65 29 29 3b 0a 20  rlen(zValue));. 
8800: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8810: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 73 73  fossil_print("ss
8820: 6c 2d 63 65 72 74 3a 5c 6e 22 29 3b 0a 20 20 20  l-cert:\n");.   
8830: 20 7d 0a 20 20 20 20 69 66 28 20 76 65 72 62 6f   }.    if( verbo
8840: 73 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73  se ){.      foss
8850: 69 6c 5f 70 72 69 6e 74 28 22 5c 6e 22 0a 20 20  il_print("\n".  
8860: 20 20 20 20 20 20 20 22 20 20 54 68 69 73 20 73         "  This s
8870: 65 74 74 69 6e 67 20 69 73 20 74 68 65 20 50 45  etting is the PE
8880: 4d 2d 66 6f 72 6d 61 74 74 65 64 20 76 61 6c 75  M-formatted valu
8890: 65 20 6f 66 20 74 68 65 20 53 53 4c 20 73 65 72  e of the SSL ser
88a0: 76 65 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  ver\n".         
88b0: 22 20 20 63 65 72 74 69 66 69 63 61 74 65 20 61  "  certificate a
88c0: 6e 64 20 70 72 69 76 61 74 65 2d 6b 65 79 2c 20  nd private-key, 
88d0: 75 73 65 64 20 62 79 20 46 6f 73 73 69 6c 20 77  used by Fossil w
88e0: 68 65 6e 20 69 74 20 69 73 20 61 63 74 69 6e 67  hen it is acting
88f0: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20 20  \n".         "  
8900: 61 73 20 61 20 73 65 72 76 65 72 20 76 69 61 20  as a server via 
8910: 74 68 65 20 5c 22 66 6f 73 73 69 6c 20 73 65 72  the \"fossil ser
8920: 76 65 72 5c 22 20 63 6f 6d 6d 61 6e 64 20 6f 72  ver\" command or
8930: 20 73 69 6d 69 6c 61 72 2e 5c 6e 5c 6e 22 0a 20   similar.\n\n". 
8940: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
8950: 20 20 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72    .    fossil_pr
8960: 69 6e 74 28 22 73 73 6c 2d 63 65 72 74 2d 66 69  int("ssl-cert-fi
8970: 6c 65 3a 20 20 20 20 20 25 73 5c 6e 22 2c 20 64  le:     %s\n", d
8980: 62 5f 67 65 74 28 22 73 73 6c 2d 63 65 72 74 2d  b_get("ssl-cert-
8990: 66 69 6c 65 22 2c 22 22 29 29 3b 0a 20 20 20 20  file",""));.    
89a0: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 73 73  fossil_print("ss
89b0: 6c 2d 6b 65 79 2d 66 69 6c 65 3a 20 20 20 20 20  l-key-file:     
89c0: 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28 22   %s\n", db_get("
89d0: 73 73 6c 2d 6b 65 79 2d 66 69 6c 65 22 2c 22 22  ssl-key-file",""
89e0: 29 29 3b 0a 20 20 20 20 69 66 28 20 76 65 72 62  ));.    if( verb
89f0: 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 73  ose ){.      fos
8a00: 73 69 6c 5f 70 72 69 6e 74 28 22 5c 6e 22 0a 20  sil_print("\n". 
8a10: 20 20 20 20 20 20 20 20 22 20 20 54 68 69 73 20          "  This 
8a20: 73 65 74 74 69 6e 67 73 20 61 72 65 20 74 68 65  settings are the
8a30: 20 6e 61 6d 65 73 20 6f 66 20 66 69 6c 65 73 20   names of files 
8a40: 74 68 61 74 20 63 6f 6e 74 69 6e 20 74 68 65 20  that contin the 
8a50: 63 65 72 74 69 66 69 63 61 74 65 5c 6e 22 0a 20  certificate\n". 
8a60: 20 20 20 20 20 20 20 20 22 20 20 70 72 69 76 61          "  priva
8a70: 74 65 2d 6b 65 79 20 75 73 65 64 20 62 79 20 46  te-key used by F
8a80: 6f 73 73 69 6c 20 77 68 65 6e 20 69 74 20 69 73  ossil when it is
8a90: 20 61 63 74 69 6e 67 20 61 73 20 61 20 73 65 72   acting as a ser
8aa0: 76 65 72 2e 5c 6e 5c 6e 22 0a 20 20 20 20 20 20  ver.\n\n".      
8ab0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 62  );.    }..    db
8ac0: 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20  _prepare(&q,.   
8ad0: 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
8ae0: 2c 20 27 27 20 46 52 4f 4d 20 67 6c 6f 62 61 6c  , '' FROM global
8af0: 5f 63 6f 6e 66 69 67 22 0a 20 20 20 20 20 20 20  _config".       
8b00: 22 20 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f  " WHERE name GLO
8b10: 42 20 27 63 65 72 74 3a 2a 27 22 0a 20 20 20 20  B 'cert:*'".    
8b20: 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a     "UNION ALL ".
8b30: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
8b40: 61 6d 65 2c 20 64 61 74 65 28 6d 74 69 6d 65 2c  ame, date(mtime,
8b50: 27 75 6e 69 78 65 70 6f 63 68 27 29 20 46 52 4f  'unixepoch') FRO
8b60: 4d 20 63 6f 6e 66 69 67 22 0a 20 20 20 20 20 20  M config".      
8b70: 20 22 20 57 48 45 52 45 20 6e 61 6d 65 20 47 4c   " WHERE name GL
8b80: 4f 42 20 27 63 65 72 74 3a 2a 27 22 0a 20 20 20  OB 'cert:*'".   
8b90: 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e      " ORDER BY n
8ba0: 61 6d 65 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  ame".    );.    
8bb0: 6e 48 69 74 20 3d 20 30 3b 0a 20 20 20 20 77 68  nHit = 0;.    wh
8bc0: 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29  ile( db_step(&q)
8bd0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
8be0: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69        fossil_pri
8bf0: 6e 74 28 22 65 78 63 65 70 74 69 6f 6e 3a 20 20  nt("exception:  
8c00: 20 20 20 20 20 20 20 25 2d 34 30 73 20 25 73 5c         %-40s %s\
8c10: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 64  n",.           d
8c20: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
8c30: 2c 30 29 2b 35 2c 20 64 62 5f 63 6f 6c 75 6d 6e  ,0)+5, db_column
8c40: 5f 74 65 78 74 28 26 71 2c 31 29 29 3b 0a 20 20  _text(&q,1));.  
8c50: 20 20 20 20 6e 48 69 74 2b 2b 3b 0a 20 20 20 20      nHit++;.    
8c60: 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a  }.    db_finaliz
8c70: 65 28 26 71 29 3b 0a 20 20 20 20 69 66 28 20 6e  e(&q);.    if( n
8c80: 48 69 74 20 26 26 20 76 65 72 62 6f 73 65 20 29  Hit && verbose )
8c90: 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70  {.      fossil_p
8ca0: 72 69 6e 74 28 22 5c 6e 22 0a 20 20 20 20 20 20  rint("\n".      
8cb0: 20 20 20 22 20 20 54 68 65 20 65 78 63 65 70 74     "  The except
8cc0: 69 6f 6e 73 20 61 72 65 20 73 65 72 76 65 72 20  ions are server 
8cd0: 63 65 72 74 69 66 69 63 61 74 65 73 20 74 68 61  certificates tha
8ce0: 74 20 74 68 65 20 46 6f 73 73 69 6c 20 63 6c 69  t the Fossil cli
8cf0: 65 6e 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  ent\n".         
8d00: 22 20 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20  "  is unable to 
8d10: 76 65 72 69 66 79 20 75 73 69 6e 67 20 72 6f 6f  verify using roo
8d20: 74 20 63 65 72 74 69 66 69 63 61 74 65 73 2c 20  t certificates, 
8d30: 62 75 74 20 77 68 69 63 68 20 73 68 6f 75 6c 64  but which should
8d40: 20 62 65 5c 6e 22 0a 20 20 20 20 20 20 20 20 20   be\n".         
8d50: 22 20 20 61 63 63 65 70 74 65 64 20 61 6e 79 68  "  accepted anyh
8d60: 6f 77 2e 5c 6e 5c 6e 22 0a 20 20 20 20 20 20 29  ow.\n\n".      )
8d70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
8d80: 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 22  .  if( strncmp("
8d90: 72 65 6d 6f 76 65 2d 65 78 63 65 70 74 69 6f 6e  remove-exception
8da0: 22 2c 7a 43 6d 64 2c 6e 43 6d 64 29 3d 3d 30 20  ",zCmd,nCmd)==0 
8db0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
8dc0: 20 20 42 6c 6f 62 20 73 71 6c 3b 0a 20 20 20 20    Blob sql;.    
8dd0: 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 28 22  char *zSep = "("
8de0: 3b 0a 20 20 20 20 64 62 5f 62 65 67 69 6e 5f 74  ;.    db_begin_t
8df0: 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20  ransaction();.  
8e00: 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 73 71 6c    blob_init(&sql
8e10: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
8e20: 20 67 2e 61 72 67 63 3d 3d 34 20 26 26 20 66 69   g.argc==4 && fi
8e30: 6e 64 5f 6f 70 74 69 6f 6e 28 22 61 6c 6c 22 2c  nd_option("all",
8e40: 30 2c 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  0,0)!=0 ){.     
8e50: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 5f 73 71 6c   blob_append_sql
8e60: 28 26 73 71 6c 2c 0a 20 20 20 20 20 20 20 20 22  (&sql,.        "
8e70: 44 45 4c 45 54 45 20 46 52 4f 4d 20 67 6c 6f 62  DELETE FROM glob
8e80: 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45 52 45 20  al_config WHERE 
8e90: 6e 61 6d 65 20 47 4c 4f 42 20 27 63 65 72 74 3a  name GLOB 'cert:
8ea0: 2a 27 3b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  *';\n".        "
8eb0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 67 6c 6f 62  DELETE FROM glob
8ec0: 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45 52 45 20  al_config WHERE 
8ed0: 6e 61 6d 65 20 47 4c 4f 42 20 27 74 72 75 73 74  name GLOB 'trust
8ee0: 65 64 3a 2a 27 3b 5c 6e 22 0a 20 20 20 20 20 20  ed:*';\n".      
8ef0: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 63    "DELETE FROM c
8f00: 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65  onfig WHERE name
8f10: 20 47 4c 4f 42 20 27 63 65 72 74 3a 2a 27 3b 5c   GLOB 'cert:*';\
8f20: 6e 22 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  n".        "DELE
8f30: 54 45 20 46 52 4f 4d 20 63 6f 6e 66 69 67 20 57  TE FROM config W
8f40: 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27  HERE name GLOB '
8f50: 74 72 75 73 74 65 64 3a 2a 27 3b 5c 6e 22 0a 20  trusted:*';\n". 
8f60: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73       );.    }els
8f70: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 67 2e 61  e{.      if( g.a
8f80: 72 67 63 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  rgc<4 ){.       
8f90: 20 75 73 61 67 65 28 22 72 65 6d 6f 76 65 2d 65   usage("remove-e
8fa0: 78 63 65 70 74 69 6f 6e 20 44 4f 4d 41 49 4e 2d  xception DOMAIN-
8fb0: 4e 41 4d 45 20 2e 2e 2e 22 29 3b 0a 20 20 20 20  NAME ...");.    
8fc0: 20 20 7d 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61    }.      blob_a
8fd0: 70 70 65 6e 64 5f 73 71 6c 28 26 73 71 6c 2c 22  ppend_sql(&sql,"
8fe0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 67 6c 6f 62  DELETE FROM glob
8ff0: 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45 52 45 20  al_config WHERE 
9000: 6e 61 6d 65 20 49 4e 20 22 29 3b 0a 20 20 20 20  name IN ");.    
9010: 20 20 66 6f 72 28 69 3d 33 3b 20 69 3c 67 2e 61    for(i=3; i<g.a
9020: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rgc; i++){.     
9030: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 5f 73     blob_append_s
9040: 71 6c 28 26 73 71 6c 2c 22 25 73 27 63 65 72 74  ql(&sql,"%s'cert
9050: 3a 25 71 27 2c 27 74 72 75 73 74 3a 25 71 27 22  :%q','trust:%q'"
9060: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 53 65  ,.           zSe
9070: 70 2f 2a 73 61 66 65 2d 66 6f 72 2d 25 73 2a 2f  p/*safe-for-%s*/
9080: 2c 20 67 2e 61 72 67 76 5b 69 5d 2c 20 67 2e 61  , g.argv[i], g.a
9090: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  rgv[i]);.       
90a0: 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20 20   zSep = ",";.   
90b0: 20 20 20 7d 0a 20 20 20 20 20 20 62 6c 6f 62 5f     }.      blob_
90c0: 61 70 70 65 6e 64 5f 73 71 6c 28 26 73 71 6c 2c  append_sql(&sql,
90d0: 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7a  ");\n");.      z
90e0: 53 65 70 20 3d 20 22 28 22 3b 0a 20 20 20 20 20  Sep = "(";.     
90f0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 5f 73 71 6c   blob_append_sql
9100: 28 26 73 71 6c 2c 22 44 45 4c 45 54 45 20 46 52  (&sql,"DELETE FR
9110: 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20  OM config WHERE 
9120: 6e 61 6d 65 20 49 4e 20 22 29 3b 0a 20 20 20 20  name IN ");.    
9130: 20 20 66 6f 72 28 69 3d 33 3b 20 69 3c 67 2e 61    for(i=3; i<g.a
9140: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rgc; i++){.     
9150: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 5f 73     blob_append_s
9160: 71 6c 28 26 73 71 6c 2c 22 25 73 27 63 65 72 74  ql(&sql,"%s'cert
9170: 3a 25 71 27 2c 27 74 72 75 73 74 65 64 3a 25 71  :%q','trusted:%q
9180: 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a  '",.           z
9190: 53 65 70 2f 2a 73 61 66 65 2d 66 6f 72 2d 25 73  Sep/*safe-for-%s
91a0: 2a 2f 2c 20 67 2e 61 72 67 76 5b 69 5d 2c 20 67  */, g.argv[i], g
91b0: 2e 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20  .argv[i]);.     
91c0: 20 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20     zSep = ",";. 
91d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 6c 6f       }.      blo
91e0: 62 5f 61 70 70 65 6e 64 5f 73 71 6c 28 26 73 71  b_append_sql(&sq
91f0: 6c 2c 22 29 3b 22 29 3b 0a 20 20 20 20 7d 0a 20  l,");");.    }. 
9200: 20 20 20 64 62 5f 75 6e 70 72 6f 74 65 63 74 28     db_unprotect(
9210: 50 52 4f 54 45 43 54 5f 43 4f 4e 46 49 47 29 3b  PROTECT_CONFIG);
9220: 0a 20 20 20 20 64 62 5f 65 78 65 63 5f 73 71 6c  .    db_exec_sql
9230: 28 62 6c 6f 62 5f 73 74 72 28 26 73 71 6c 29 29  (blob_str(&sql))
9240: 3b 0a 20 20 20 20 64 62 5f 70 72 6f 74 65 63 74  ;.    db_protect
9250: 5f 70 6f 70 28 29 3b 0a 20 20 20 20 64 62 5f 63  _pop();.    db_c
9260: 6f 6d 6d 69 74 5f 74 72 61 6e 73 61 63 74 69 6f  ommit_transactio
9270: 6e 28 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65  n();.    blob_re
9280: 73 65 74 28 26 73 71 6c 29 3b 0a 20 20 7d 65 6c  set(&sql);.  }el
9290: 73 65 0a 20 20 2f 2a 64 65 66 61 75 6c 74 2a 2f  se.  /*default*/
92a0: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74  {.    fossil_fat
92b0: 61 6c 28 22 75 6e 6b 6e 6f 77 6e 20 73 75 62 2d  al("unknown sub-
92c0: 63 6f 6d 6d 61 6e 64 20 5c 22 25 73 5c 22 2e 5c  command \"%s\".\
92d0: 6e 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f  nshould be one o
92e0: 66 3a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  f:".            
92f0: 20 20 20 20 20 22 20 63 6c 65 61 72 2d 63 65 72       " clear-cer
9300: 74 73 20 6c 6f 61 64 2d 63 65 72 74 73 20 72 65  ts load-certs re
9310: 6d 6f 76 65 2d 65 78 63 65 70 74 69 6f 6e 20 73  move-exception s
9320: 63 72 75 62 20 73 68 6f 77 22 2c 0a 20 20 20 20  crub show",.    
9330: 20 20 20 7a 43 6d 64 29 3b 0a 20 20 7d 0a 7d 0a     zCmd);.  }.}.
9340: 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20  ./*.** WEBPAGE: 
9350: 2e 77 65 6c 6c 2d 6b 6e 6f 77 6e 0a 2a 2a 0a 2a  .well-known.**.*
9360: 2a 20 49 66 20 74 68 65 20 22 2d 2d 61 63 6d 65  * If the "--acme
9370: 22 20 6f 70 74 69 6f 6e 20 77 61 73 20 73 75 70  " option was sup
9380: 70 6c 69 65 64 20 74 6f 20 22 66 6f 73 73 69 6c  plied to "fossil
9390: 20 73 65 72 76 65 72 22 20 6f 72 20 22 66 6f 73   server" or "fos
93a0: 73 69 6c 20 68 74 74 70 22 20 6f 72 0a 2a 2a 20  sil http" or.** 
93b0: 73 69 6d 69 6c 61 72 2c 20 74 68 65 6e 20 74 68  similar, then th
93c0: 69 73 20 70 61 67 65 20 72 65 74 75 72 6e 73 20  is page returns 
93d0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66  the content of f
93e0: 69 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 74 68  iles found in th
93f0: 65 0a 2a 2a 20 22 2e 77 65 6c 6c 2d 6b 6e 6f 77  e.** ".well-know
9400: 6e 22 20 73 75 62 64 69 72 65 63 74 6f 72 79 20  n" subdirectory 
9410: 6f 66 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  of the same dire
9420: 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
9430: 69 6e 73 20 74 68 65 0a 2a 2a 20 72 65 70 6f 73  ins the.** repos
9440: 69 74 6f 72 79 20 66 69 6c 65 2e 20 20 54 68 69  itory file.  Thi
9450: 73 20 66 61 63 69 6c 69 74 61 74 65 73 20 41 75  s facilitates Au
9460: 74 6f 6d 61 74 65 64 20 43 65 72 74 69 66 69 63  tomated Certific
9470: 61 74 65 0a 2a 2a 20 4d 61 6e 61 67 65 6d 65 6e  ate.** Managemen
9480: 74 20 75 73 69 6e 67 20 74 6f 6f 6c 73 20 6c 69  t using tools li
9490: 6b 65 20 22 63 65 72 74 62 6f 74 22 2e 0a 2a 2a  ke "certbot"..**
94a0: 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  .** The content 
94b0: 69 73 20 72 65 74 75 72 6e 65 64 20 64 69 72 65  is returned dire
94c0: 63 74 6c 79 2c 20 77 69 74 68 6f 75 74 20 61 6e  ctly, without an
94d0: 79 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e  y interpretation
94e0: 2c 20 75 73 69 6e 67 0a 2a 2a 20 61 20 67 65 6e  , using.** a gen
94f0: 65 72 69 63 20 6d 69 6d 65 74 79 70 65 2e 0a 2a  eric mimetype..*
9500: 2f 0a 76 6f 69 64 20 77 65 6c 6c 6b 6e 6f 77 6e  /.void wellknown
9510: 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 63  _page(void){.  c
9520: 68 61 72 20 2a 7a 50 61 74 68 20 3d 20 30 3b 0a  har *zPath = 0;.
9530: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
9540: 61 69 6c 20 3d 20 50 28 22 6e 61 6d 65 22 29 3b  ail = P("name");
9550: 0a 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b  .  Blob content;
9560: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
9570: 20 63 3b 0a 20 20 69 66 28 20 21 67 2e 66 41 6c   c;.  if( !g.fAl
9580: 6c 6f 77 41 43 4d 45 20 29 20 67 6f 74 6f 20 77  lowACME ) goto w
9590: 65 6c 6c 6b 6e 6f 77 6e 5f 6e 6f 74 66 6f 75 6e  ellknown_notfoun
95a0: 64 3b 0a 20 20 69 66 28 20 67 2e 7a 52 65 70 6f  d;.  if( g.zRepo
95b0: 73 69 74 6f 72 79 4e 61 6d 65 3d 3d 30 20 29 20  sitoryName==0 ) 
95c0: 67 6f 74 6f 20 77 65 6c 6c 6b 6e 6f 77 6e 5f 6e  goto wellknown_n
95d0: 6f 74 66 6f 75 6e 64 3b 0a 20 20 69 66 28 20 7a  otfound;.  if( z
95e0: 54 61 69 6c 3d 3d 30 20 29 20 67 6f 74 6f 20 77  Tail==0 ) goto w
95f0: 65 6c 6c 6b 6e 6f 77 6e 5f 6e 6f 74 66 6f 75 6e  ellknown_notfoun
9600: 64 3b 0a 20 20 7a 50 61 74 68 20 3d 20 6d 70 72  d;.  zPath = mpr
9610: 69 6e 74 66 28 22 25 7a 2f 2e 77 65 6c 6c 2d 6b  intf("%z/.well-k
9620: 6e 6f 77 6e 2f 25 73 22 2c 20 66 69 6c 65 5f 64  nown/%s", file_d
9630: 69 72 6e 61 6d 65 28 67 2e 7a 52 65 70 6f 73 69  irname(g.zReposi
9640: 74 6f 72 79 4e 61 6d 65 29 2c 20 7a 54 61 69 6c  toryName), zTail
9650: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63  );.  for(i=0; (c
9660: 20 3d 20 7a 54 61 69 6c 5b 69 5d 29 21 3d 30 3b   = zTail[i])!=0;
9670: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 66   i++){.    if( f
9680: 6f 73 73 69 6c 5f 69 73 61 6c 6e 75 6d 28 63 29  ossil_isalnum(c)
9690: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
96a0: 20 69 66 28 20 63 3d 3d 27 2e 27 20 29 7b 0a 20   if( c=='.' ){. 
96b0: 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 7c 7c       if( i==0 ||
96c0: 20 7a 54 61 69 6c 5b 69 2d 31 5d 3d 3d 27 2f 27   zTail[i-1]=='/'
96d0: 20 7c 7c 20 7a 54 61 69 6c 5b 69 2d 31 5d 3d 3d   || zTail[i-1]==
96e0: 27 2e 27 20 29 20 67 6f 74 6f 20 77 65 6c 6c 6b  '.' ) goto wellk
96f0: 6e 6f 77 6e 5f 6e 6f 74 66 6f 75 6e 64 3b 0a 20  nown_notfound;. 
9700: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
9710: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d     }.    if( c==
9720: 27 2c 27 20 7c 7c 20 63 21 3d 27 2d 27 20 7c 7c  ',' || c!='-' ||
9730: 20 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27 3a   c=='/' || c==':
9740: 27 20 7c 7c 20 63 3d 3d 27 5f 27 20 7c 7c 20 63  ' || c=='_' || c
9750: 3d 3d 27 7e 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='~' ) continue
9760: 3b 0a 20 20 20 20 67 6f 74 6f 20 77 65 6c 6c 6b  ;.    goto wellk
9770: 6e 6f 77 6e 5f 6e 6f 74 66 6f 75 6e 64 3b 0a 20  nown_notfound;. 
9780: 20 7d 0a 20 20 69 66 28 20 73 74 72 73 74 72 28   }.  if( strstr(
9790: 22 2f 2e 2e 22 2c 20 7a 50 61 74 68 29 21 3d 30  "/..", zPath)!=0
97a0: 20 29 20 67 6f 74 6f 20 77 65 6c 6c 6b 6e 6f 77   ) goto wellknow
97b0: 6e 5f 6e 6f 74 66 6f 75 6e 64 3b 0a 20 20 69 66  n_notfound;.  if
97c0: 28 20 21 66 69 6c 65 5f 69 73 66 69 6c 65 28 7a  ( !file_isfile(z
97d0: 50 61 74 68 2c 20 45 78 74 46 49 4c 45 29 20 29  Path, ExtFILE) )
97e0: 20 67 6f 74 6f 20 77 65 6c 6c 6b 6e 6f 77 6e 5f   goto wellknown_
97f0: 6e 6f 74 66 6f 75 6e 64 3b 0a 20 20 62 6c 6f 62  notfound;.  blob
9800: 5f 72 65 61 64 5f 66 72 6f 6d 5f 66 69 6c 65 28  _read_from_file(
9810: 26 63 6f 6e 74 65 6e 74 2c 20 7a 50 61 74 68 2c  &content, zPath,
9820: 20 45 78 74 46 49 4c 45 29 3b 0a 20 20 63 67 69   ExtFILE);.  cgi
9830: 5f 73 65 74 5f 63 6f 6e 74 65 6e 74 28 26 63 6f  _set_content(&co
9840: 6e 74 65 6e 74 29 3b 0a 20 20 63 67 69 5f 73 65  ntent);.  cgi_se
9850: 74 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65 28 6d  t_content_type(m
9860: 69 6d 65 74 79 70 65 5f 66 72 6f 6d 5f 6e 61 6d  imetype_from_nam
9870: 65 28 7a 50 61 74 68 29 29 3b 0a 20 20 63 67 69  e(zPath));.  cgi
9880: 5f 72 65 70 6c 79 28 29 3b 0a 20 20 72 65 74 75  _reply();.  retu
9890: 72 6e 3b 0a 0a 77 65 6c 6c 6b 6e 6f 77 6e 5f 6e  rn;..wellknown_n
98a0: 6f 74 66 6f 75 6e 64 3a 0a 20 20 66 6f 73 73 69  otfound:.  fossi
98b0: 6c 5f 66 72 65 65 28 7a 50 61 74 68 29 3b 0a 20  l_free(zPath);. 
98c0: 20 77 65 62 70 61 67 65 5f 6e 6f 74 66 6f 75 6e   webpage_notfoun
98d0: 64 5f 65 72 72 6f 72 28 30 29 3b 0a 20 20 72 65  d_error(0);.  re
98e0: 74 75 72 6e 3b 0a 7d 0a                          turn;.}.