Fossil

Hex Artifact Content
Login

Artifact cffdb9d69b34104edf5316b980272fddc86c708dd234b649589b7caa0f107f6e:


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 0a 22 2d 2d  SelfCert[] =."--
0870: 2d 2d 2d 42 45 47 49 4e 20 43 45 52 54 49 46 49  ---BEGIN CERTIFI
0880: 43 41 54 45 2d 2d 2d 2d 2d 5c 6e 22 0a 22 4d 49  CATE-----\n"."MI
0890: 49 44 4d 54 43 43 41 68 6b 43 46 47 72 44 6d 75  IDMTCCAhkCFGrDmu
08a0: 4a 6b 6b 7a 57 45 52 50 2f 49 54 42 76 7a 77 77  JkkzWERP/ITBvzww
08b0: 49 32 6c 76 30 54 4d 41 30 47 43 53 71 47 53 49  I2lv0TMA0GCSqGSI
08c0: 62 33 44 51 45 42 43 77 55 41 4d 46 51 78 5c 6e  b3DQEBCwUAMFQx\n
08d0: 22 0a 22 43 7a 41 4a 42 67 4e 56 42 41 59 54 41  "."CzAJBgNVBAYTA
08e0: 6c 56 54 4d 51 73 77 43 51 59 44 56 51 51 49 44  lVTMQswCQYDVQQID
08f0: 41 4a 4f 51 7a 45 53 4d 42 41 47 41 31 55 45 42  AJOQzESMBAGA1UEB
0900: 77 77 4a 51 32 68 68 63 6d 78 76 64 48 52 6c 4d  wwJQ2hhcmxvdHRlM
0910: 52 4d 77 5c 6e 22 0a 22 45 51 59 44 56 51 51 4b  RMw\n"."EQYDVQQK
0920: 44 41 70 47 62 33 4e 7a 61 57 77 74 55 30 4e 4e  DApGb3NzaWwtU0NN
0930: 4d 51 38 77 44 51 59 44 56 51 51 44 44 41 5a 47  MQ8wDQYDVQQDDAZG
0940: 62 33 4e 7a 61 57 77 77 49 42 63 4e 4d 6a 45 78  b3NzaWwwIBcNMjEx
0950: 4d 6a 49 33 4d 54 45 7a 5c 6e 22 0a 22 4d 54 55  MjI3MTEz\n"."MTU
0960: 32 57 68 67 50 4d 6a 45 79 4d 54 45 79 4d 6a 63  2WhgPMjEyMTEyMjc
0970: 78 4d 54 4d 78 4e 54 5a 61 4d 46 51 78 43 7a 41  xMTMxNTZaMFQxCzA
0980: 4a 42 67 4e 56 42 41 59 54 41 6c 56 54 4d 51 73  JBgNVBAYTAlVTMQs
0990: 77 43 51 59 44 56 51 51 49 44 41 4a 4f 5c 6e 22  wCQYDVQQIDAJO\n"
09a0: 0a 22 51 7a 45 53 4d 42 41 47 41 31 55 45 42 77  ."QzESMBAGA1UEBw
09b0: 77 4a 51 32 68 68 63 6d 78 76 64 48 52 6c 4d 52  wJQ2hhcmxvdHRlMR
09c0: 4d 77 45 51 59 44 56 51 51 4b 44 41 70 47 62 33  MwEQYDVQQKDApGb3
09d0: 4e 7a 61 57 77 74 55 30 4e 4e 4d 51 38 77 44 51  NzaWwtU0NNMQ8wDQ
09e0: 59 44 5c 6e 22 0a 22 56 51 51 44 44 41 5a 47 62  YD\n"."VQQDDAZGb
09f0: 33 4e 7a 61 57 77 77 67 67 45 69 4d 41 30 47 43  3NzaWwwggEiMA0GC
0a00: 53 71 47 53 49 62 33 44 51 45 42 41 51 55 41 41  SqGSIb3DQEBAQUAA
0a10: 34 49 42 44 77 41 77 67 67 45 4b 41 6f 49 42 41  4IBDwAwggEKAoIBA
0a20: 51 43 43 62 54 55 32 5c 6e 22 0a 22 36 47 52 51  QCCbTU2\n"."6GRQ
0a30: 48 51 71 4c 71 37 76 79 5a 30 4f 78 70 41 78 6d  HQqLq7vyZ0OxpAxm
0a40: 67 66 41 4b 43 78 74 36 65 49 7a 2b 6a 42 69 32  gfAKCxt6eIz+jBi2
0a50: 5a 4d 2f 43 42 35 76 56 58 57 56 68 32 2b 53 6b  ZM/CB5vVXWVh2+Sk
0a60: 53 69 57 45 41 33 55 5a 69 55 71 58 5c 6e 22 0a  SiWEA3UZiUqX\n".
0a70: 22 78 5a 6c 7a 6d 53 2f 43 67 6c 5a 64 69 77 4c  "xZlzmS/CglZdiwL
0a80: 4c 44 4a 4d 4c 38 42 34 4f 69 56 37 32 6f 69 76  LDJML8B4OiV72oiv
0a90: 46 48 2f 76 4a 37 2b 63 62 76 68 31 64 54 78 6e  FH/vJ7+cbvh1dTxn
0aa0: 59 69 48 75 77 77 37 47 66 51 6e 67 50 72 4c 66  YiHuww7GfQngPrLf
0ab0: 65 5c 6e 22 0a 22 66 69 49 59 50 44 6b 31 47 54  e\n"."fiIYPDk1GT
0ac0: 55 4a 48 42 51 37 55 65 34 37 37 46 37 46 38 76  UJHBQ7Ue477F7F8v
0ad0: 4b 75 48 64 56 67 77 6b 74 46 2f 4a 44 4d 36 4d  KuHdVgwktF/JDM6M
0ae0: 36 30 61 53 71 6c 6f 32 44 2f 6f 79 73 69 72 72  60aSqlo2D/oysirr
0af0: 62 2b 64 6c 75 72 5c 6e 22 0a 22 54 6c 76 30 72  b+dlur\n"."Tlv0r
0b00: 6a 73 59 4f 66 71 36 62 4c 41 61 6a 6f 4c 33 71  jsYOfq6bLAajoL3q
0b10: 69 2f 76 65 6b 36 44 4e 73 73 6f 79 77 62 67 65  i/vek6DNssoywbge
0b20: 34 50 66 62 54 67 53 39 67 37 47 63 67 6e 63 62  4PfbTgS9g7Gcgncb
0b30: 63 65 74 35 70 76 61 53 31 32 4a 5c 6e 22 0a 22  cet5pvaS12J\n"."
0b40: 61 76 68 46 63 64 34 4a 55 34 49 74 79 34 39 48  avhFcd4JU4Ity49H
0b50: 6c 39 53 2f 43 32 4d 66 5a 31 74 45 35 33 78 56  l9S/C2MfZ1tE53xV
0b60: 67 67 52 77 4b 7a 34 46 50 6a 36 35 4d 35 75 79  ggRwKz4FPj65M5uy
0b70: 6d 54 64 63 78 74 6a 4b 58 74 43 78 49 45 31 6b  mTdcxtjKXtCxIE1k
0b80: 5c 6e 22 0a 22 4b 78 4a 78 58 51 68 37 72 49 59  \n"."KxJxXQh7rIY
0b90: 6a 6d 2b 52 54 41 67 4d 42 41 41 45 77 44 51 59  jm+RTAgMBAAEwDQY
0ba0: 4a 4b 6f 5a 49 68 76 63 4e 41 51 45 4c 42 51 41  JKoZIhvcNAQELBQA
0bb0: 44 67 67 45 42 41 46 6b 64 74 70 71 63 79 62 41  DggEBAFkdtpqcybA
0bc0: 7a 4a 4e 38 47 5c 6e 22 0a 22 2b 4f 4e 75 55 6d  zJN8G\n"."+ONuUm
0bd0: 35 73 58 4e 62 57 74 61 37 4a 47 76 6d 38 6c 30  5sXNbWta7JGvm8l0
0be0: 42 54 53 42 63 43 55 74 4a 41 33 68 6e 31 36 69  BTSBcCUtJA3hn16i
0bf0: 4a 71 58 41 39 4b 6d 4c 6e 61 46 32 64 65 6e 43  JqXA9KmLnaF2denC
0c00: 34 45 59 6b 2b 4b 6c 56 55 31 5c 6e 22 0a 22 51  4EYk+KlVU1\n"."Q
0c10: 58 78 73 6b 50 4a 34 6a 42 38 41 35 42 30 35 6a  XxskPJ4jB8A5B05j
0c20: 4d 69 6a 59 76 30 6e 7a 43 78 4b 68 76 69 49 38  MijYv0nzCxKhviI8
0c30: 43 52 37 47 4c 45 45 47 4b 7a 65 67 39 70 62 57  CR7GLEEGKzeg9pbW
0c40: 30 2b 4f 33 76 61 56 65 68 6f 5a 74 64 46 58 5c  0+O3vaVehoZtdFX\
0c50: 6e 22 0a 22 7a 33 53 73 43 73 73 72 39 51 6a 43  n"."z3SsCssr9QjC
0c60: 4c 69 41 70 51 78 4d 7a 57 31 49 76 33 6f 64 32  LiApQxMzW1Iv3od2
0c70: 4a 58 65 48 42 77 66 56 4d 46 72 57 41 31 56 43  JXeHBwfVMFrWA1VC
0c80: 45 55 43 52 73 38 4f 53 57 2f 56 4f 71 44 50 4a  EUCRs8OSW/VOqDPJ
0c90: 4c 56 45 69 5c 6e 22 0a 22 47 36 77 78 63 34 6b  LVEi\n"."G6wxc4k
0ca0: 4e 39 64 4c 4b 2b 35 53 32 39 71 33 6e 7a 6c 32  N9dLK+5S29q3nzl2
0cb0: 34 2f 71 7a 58 6f 46 38 50 39 52 65 35 4b 42 43  4/qzXoF8P9Re5KBC
0cc0: 62 72 77 61 48 67 79 2b 4f 45 45 63 65 71 35 6a  brwaHgy+OEEceq5j
0cd0: 6b 6d 66 47 46 78 58 6a 77 5c 6e 22 0a 22 70 76  kmfGFxXjw\n"."pv
0ce0: 56 43 4e 72 79 35 75 41 68 48 35 4e 71 62 58 5a  VCNry5uAhH5NqbXZ
0cf0: 61 6d 70 55 57 71 69 57 74 4d 34 65 54 61 49 50  ampUWqiWtM4eTaIP
0d00: 6f 37 59 32 6d 44 41 31 75 57 68 75 57 74 4f 36  o7Y2mDA1uWhuWtO6
0d10: 46 39 50 73 6e 46 4a 6c 51 48 43 6e 77 79 5c 6e  F9PsnFJlQHCnwy\n
0d20: 22 0a 22 73 2f 54 73 72 58 6b 3d 5c 6e 22 0a 22  "."s/TsrXk=\n"."
0d30: 2d 2d 2d 2d 2d 45 4e 44 20 43 45 52 54 49 46 49  -----END CERTIFI
0d40: 43 41 54 45 2d 2d 2d 2d 2d 5c 6e 22 3b 0a 0a 2f  CATE-----\n";../
0d50: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 70 72  * This is the pr
0d60: 69 76 61 74 65 2d 6b 65 79 20 63 6f 72 72 65 73  ivate-key corres
0d70: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63  ponding to the c
0d80: 65 72 74 20 61 62 6f 76 65 0a 2a 2f 0a 73 74 61  ert above.*/.sta
0d90: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 73  tic const char s
0da0: 73 6c 53 65 6c 66 50 4b 65 79 5b 5d 20 3d 0a 22  slSelfPKey[] =."
0db0: 2d 2d 2d 2d 2d 42 45 47 49 4e 20 50 52 49 56 41  -----BEGIN PRIVA
0dc0: 54 45 20 4b 45 59 2d 2d 2d 2d 2d 5c 6e 22 0a 22  TE KEY-----\n"."
0dd0: 4d 49 49 45 76 41 49 42 41 44 41 4e 42 67 6b 71  MIIEvAIBADANBgkq
0de0: 68 6b 69 47 39 77 30 42 41 51 45 46 41 41 53 43  hkiG9w0BAQEFAASC
0df0: 42 4b 59 77 67 67 53 69 41 67 45 41 41 6f 49 42  BKYwggSiAgEAAoIB
0e00: 41 51 43 43 62 54 55 32 36 47 52 51 48 51 71 4c  AQCCbTU26GRQHQqL
0e10: 5c 6e 22 0a 22 71 37 76 79 5a 30 4f 78 70 41 78  \n"."q7vyZ0OxpAx
0e20: 6d 67 66 41 4b 43 78 74 36 65 49 7a 2b 6a 42 69  mgfAKCxt6eIz+jBi
0e30: 32 5a 4d 2f 43 42 35 76 56 58 57 56 68 32 2b 53  2ZM/CB5vVXWVh2+S
0e40: 6b 53 69 57 45 41 33 55 5a 69 55 71 58 78 5a 6c  kSiWEA3UZiUqXxZl
0e50: 7a 6d 53 2f 43 5c 6e 22 0a 22 67 6c 5a 64 69 77  zmS/C\n"."glZdiw
0e60: 4c 4c 44 4a 4d 4c 38 42 34 4f 69 56 37 32 6f 69  LLDJML8B4OiV72oi
0e70: 76 46 48 2f 76 4a 37 2b 63 62 76 68 31 64 54 78  vFH/vJ7+cbvh1dTx
0e80: 6e 59 69 48 75 77 77 37 47 66 51 6e 67 50 72 4c  nYiHuww7GfQngPrL
0e90: 66 65 66 69 49 59 50 44 6b 31 5c 6e 22 0a 22 47  fefiIYPDk1\n"."G
0ea0: 54 55 4a 48 42 51 37 55 65 34 37 37 46 37 46 38  TUJHBQ7Ue477F7F8
0eb0: 76 4b 75 48 64 56 67 77 6b 74 46 2f 4a 44 4d 36  vKuHdVgwktF/JDM6
0ec0: 4d 36 30 61 53 71 6c 6f 32 44 2f 6f 79 73 69 72  M60aSqlo2D/oysir
0ed0: 72 62 2b 64 6c 75 72 54 6c 76 30 72 6a 73 59 5c  rb+dlurTlv0rjsY\
0ee0: 6e 22 0a 22 4f 66 71 36 62 4c 41 61 6a 6f 4c 33  n"."Ofq6bLAajoL3
0ef0: 71 69 2f 76 65 6b 36 44 4e 73 73 6f 79 77 62 67  qi/vek6DNssoywbg
0f00: 65 34 50 66 62 54 67 53 39 67 37 47 63 67 6e 63  e4PfbTgS9g7Gcgnc
0f10: 62 63 65 74 35 70 76 61 53 31 32 4a 61 76 68 46  bcet5pvaS12JavhF
0f20: 63 64 34 4a 5c 6e 22 0a 22 55 34 49 74 79 34 39  cd4J\n"."U4Ity49
0f30: 48 6c 39 53 2f 43 32 4d 66 5a 31 74 45 35 33 78  Hl9S/C2MfZ1tE53x
0f40: 56 67 67 52 77 4b 7a 34 46 50 6a 36 35 4d 35 75  VggRwKz4FPj65M5u
0f50: 79 6d 54 64 63 78 74 6a 4b 58 74 43 78 49 45 31  ymTdcxtjKXtCxIE1
0f60: 6b 4b 78 4a 78 58 51 68 37 5c 6e 22 0a 22 72 49  kKxJxXQh7\n"."rI
0f70: 59 6a 6d 2b 52 54 41 67 4d 42 41 41 45 43 67 67  Yjm+RTAgMBAAECgg
0f80: 45 41 4e 66 54 48 31 76 63 38 79 49 65 37 48 52  EANfTH1vc8yIe7HR
0f90: 7a 6d 6d 39 6c 73 66 38 6a 46 2b 49 49 34 73 32  zmm9lsf8jF+II4s2
0fa0: 37 30 35 79 32 48 35 71 59 2b 63 76 59 78 5c 6e  705y2H5qY+cvYx\n
0fb0: 22 0a 22 6e 4b 74 5a 4a 47 4f 47 31 58 30 4b 6b  "."nKtZJGOG1X0Kk
0fc0: 59 79 37 43 47 6f 46 76 35 4b 30 63 53 55 6c 33  Yy7CGoFv5K0cSUl3
0fd0: 6c 53 35 46 56 61 6d 4d 2f 79 57 49 7a 6f 49 65  lS5FVamM/yWIzoIe
0fe0: 78 2f 53 7a 32 43 31 45 49 4c 32 61 49 35 61 73  x/Sz2C1EIL2aI5as
0ff0: 36 65 7a 5c 6e 22 0a 22 6a 42 36 53 4e 30 2f 4a  6ez\n"."jB6SN0/J
1000: 2b 58 49 38 2b 56 74 37 31 38 36 2f 72 48 78 66  +XI8+Vt7186/rHxf
1010: 64 49 50 70 78 75 7a 6a 48 62 78 58 33 48 54 70  dIPpxuzjHbxX3HTp
1020: 53 63 45 54 4e 57 63 4c 72 67 68 62 72 50 78 61  ScETNWcLrghbrPxa
1030: 6b 62 54 50 50 78 77 74 5c 6e 22 0a 22 2b 78 37  kbTPPxwt\n"."+x7
1040: 51 6c 50 6d 6d 6b 46 4e 75 4d 66 76 6b 7a 54 6f  QlPmmkFNuMfvkzTo
1050: 46 66 39 4e 64 77 4c 2b 2b 34 34 54 65 42 50 4f  Ff9NdwL++44TeBPO
1060: 70 76 44 2f 4c 72 77 2b 65 79 71 64 74 68 39 52  pvD/Lrw+eyqdth9R
1070: 4a 50 71 39 63 4d 39 36 70 6c 68 39 56 5c 6e 22  JPq9cM96plh9V\n"
1080: 0a 22 48 75 52 71 65 44 38 2b 51 4e 61 66 61 58  ."HuRqeD8+QNafaX
1090: 42 64 53 51 73 33 46 4a 4b 2f 63 44 4b 2f 76 57  BdSQs3FJK/cDK/vW
10a0: 47 4b 5a 57 49 66 46 56 53 44 62 44 68 77 59 6c  GKZWIfFVSDbDhwYl
10b0: 6a 6b 58 47 69 6a 72 65 46 6a 74 58 51 66 6b 6b  jkXGijreFjtXQfkk
10c0: 70 46 5c 6e 22 0a 22 72 6c 31 4a 38 37 2f 48 39  pF\n"."rl1J87/H9
10d0: 45 65 37 7a 38 66 54 44 32 59 58 51 48 6c 2b 30  Ee7z8fTD2YXQHl+0
10e0: 2f 72 67 68 41 56 74 61 63 33 75 35 34 64 70 51  /rghAVtac3u54dpQ
10f0: 51 4b 42 67 51 43 32 58 47 33 4f 45 65 4d 72 4f  QKBgQC2XG3OEeMrO
1100: 70 39 64 4e 6b 55 64 5c 6e 22 0a 22 46 38 56 66  p9dNkUd\n"."F8Vf
1110: 66 55 67 30 65 63 77 47 2b 39 4c 33 4c 43 65 37  fUg0ecwG+9L3LCe7
1120: 55 37 31 4b 30 6b 50 6d 58 6a 56 36 78 4e 6e 75  U71K0kPmXjV6xNnu
1130: 59 63 4e 51 75 38 34 6b 70 74 63 35 76 49 38 77  YcNQu84kptc5vI8w
1140: 44 32 33 70 32 39 4c 61 78 64 4e 63 5c 6e 22 0a  D23p29LaxdNc\n".
1150: 22 39 6d 30 6c 63 77 30 36 2f 59 59 42 4f 50 6b  "9m0lcw06/YYBOPk
1160: 4e 70 68 63 48 6b 49 4e 59 5a 54 76 56 4a 46 31  NphcHkINYZTvVJF1
1170: 30 6d 4c 33 69 73 79 6d 7a 4d 61 54 74 77 44 6b  0mL3isymzMaTtwDk
1180: 5a 55 6b 4f 6a 4c 31 42 2b 4d 54 69 46 54 2f 71  ZUkOjL1B+MTiFT/q
1190: 70 5c 6e 22 0a 22 41 52 4b 72 54 59 47 4a 34 48  p\n"."ARKrTYGJ4H
11a0: 78 59 37 2b 74 55 6b 49 35 70 55 6d 67 34 50 51  xY7+tUkI5pUmg4PQ
11b0: 4b 42 67 51 43 33 47 41 34 64 31 52 7a 33 50 62  KBgQC3GA4d1Rz3Pb
11c0: 2f 52 52 70 63 73 5a 67 57 6b 6e 4b 73 4b 68 6f  /RRpcsZgWknKsKho
11d0: 4e 33 36 6d 53 6e 5c 6e 22 0a 22 78 46 4a 33 77  N36mSn\n"."xFJ3w
11e0: 50 42 76 56 76 32 42 31 6c 74 54 4d 7a 68 2f 2b  PBvVv2B1ltTMzh/+
11f0: 74 68 65 30 74 79 36 63 6c 7a 4d 72 76 6f 4c 45  the0ty6clzMrvoLE
1200: 52 7a 52 63 68 65 44 73 4e 72 63 2f 6a 2f 54 55  RzRcheDsNrc/j/TU
1210: 56 47 38 73 56 64 42 59 4a 77 58 5c 6e 22 0a 22  VG8sVdBYJwX\n"."
1220: 74 4d 5a 79 46 57 34 4e 56 4d 4f 45 72 54 2f 31  tMZyFW4NVMOErT/1
1230: 75 6b 68 36 6a 42 71 49 4d 42 6f 36 4e 4a 4c 33  ukh6jBqIMBo6NJL3
1240: 45 56 2f 41 4b 6a 30 79 6e 69 6b 73 67 4b 4f 72  EV/AKj0yniksgKOr
1250: 30 2f 41 41 64 75 41 63 63 6e 47 53 54 38 4a 64  0/AAduAccnGST8Jd
1260: 5c 6e 22 0a 22 53 48 4f 64 6a 77 76 48 7a 77 4b  \n"."SHOdjwvHzwK
1270: 42 67 47 5a 42 71 2f 7a 71 67 4e 54 44 75 59 73  BgGZBq/zqgNTDuYs
1280: 65 48 47 45 30 37 43 4d 67 63 44 57 6b 75 6d 69  eHGE07CMgcDWkumi
1290: 4d 47 76 38 6f 7a 6c 71 33 6d 53 52 30 68 55 69  MGv8ozlq3mSR0hUi
12a0: 50 4f 54 50 50 5c 6e 22 0a 22 59 46 6a 51 6a 79  POTPP\n"."YFjQjy
12b0: 49 64 50 58 6e 46 36 46 66 69 79 50 50 74 49 76  IdPXnF6FfiyPPtIv
12c0: 67 49 6f 4e 4b 32 4c 56 41 71 69 6f 64 2b 58 55  gIoNK2LVAqiod+XU
12d0: 50 66 31 35 32 6c 34 64 6e 71 63 57 31 33 64 6e  Pf152l4dnqcW13dn
12e0: 39 42 76 4f 78 47 79 50 54 52 5c 6e 22 0a 22 6c  9BvOxGyPTR\n"."l
12f0: 57 43 69 6b 46 61 41 46 76 69 4f 57 6a 59 39 72  WCikFaAFviOWjY9r
1300: 39 6d 34 64 55 31 64 73 6c 44 6d 79 53 71 74 68  9m4dU1dslDmySqth
1310: 46 64 30 54 5a 67 50 76 67 70 73 39 69 76 6b 4a  Fd0TZgPvgps9ivkJ
1320: 30 63 64 77 33 30 4e 41 6f 47 41 4d 43 2f 45 5c  0cdw30NAoGAMC/E\
1330: 6e 22 0a 22 68 31 56 76 4b 69 4b 32 4f 50 32 37  n"."h1VvKiK2OP27
1340: 43 35 52 4f 4a 2b 53 54 6e 31 47 48 69 43 66 49  C5ROJ+STn1GHiCfI
1350: 46 64 38 31 56 51 38 53 4f 44 74 4d 76 4c 38 4e  Fd81VQ8SODtMvL8N
1360: 69 66 67 52 42 70 32 65 46 46 61 71 67 4f 64 59  ifgRBp2eFFaqgOdY
1370: 52 51 5a 49 5c 6e 22 0a 22 43 47 47 59 6c 41 62  RQZI\n"."CGGYlAb
1380: 53 36 58 58 43 4a 43 64 46 35 50 65 68 36 32 64  S6XXCJCdF5Peh62d
1390: 41 37 35 50 64 67 4e 2b 79 32 70 4f 4a 51 7a 6a  A75PdgN+y2pOJQzj
13a0: 72 76 42 39 63 6c 65 39 51 34 2b 2b 37 69 39 77  rvB9cle9Q4++7i9w
13b0: 64 43 76 53 4c 4f 54 72 35 5c 6e 22 0a 22 57 44  dCvSLOTr5\n"."WD
13c0: 6e 46 6f 57 79 2b 71 56 65 78 75 36 63 72 6f 76  nFoWy+qVexu6crov
13d0: 4f 6d 52 39 5a 57 7a 59 72 77 50 46 79 31 45 4f  OmR9ZWzYrwPFy1EO
13e0: 4a 30 31 30 45 43 67 59 42 6c 37 51 2b 6a 6d 6a  J010ECgYBl7Q+jmj
13f0: 4f 53 71 73 56 77 68 46 5a 30 55 37 4c 47 5c 6e  OSqsVwhFZ0U7LG\n
1400: 22 0a 22 64 69 4e 2b 76 58 68 57 66 6e 31 77 66  "."diN+vXhWfn1wf
1410: 4f 57 64 38 75 37 39 6f 61 71 55 2f 4f 79 37 78  OWd8u79oaqU/Oy7x
1420: 79 4b 57 32 70 33 48 35 7a 32 4b 46 72 42 4d 2f  yKW2p3H5z2KFrBM/
1430: 76 69 62 35 33 4c 68 34 45 77 46 5a 6a 63 58 2b  vib53Lh4EwFZjcX+
1440: 6a 56 47 5c 6e 22 0a 22 6b 72 41 6d 62 4c 2b 4d  jVG\n"."krAmbL+M
1450: 2f 68 50 37 7a 33 54 44 32 55 62 45 53 41 7a 52  /hP7z3TD2UbESAzR
1460: 2f 63 36 6c 37 46 55 34 35 78 4e 38 34 4c 73 7a  /c6l7FU45xN84Lsz
1470: 35 6e 70 6b 52 38 48 2f 75 41 48 75 71 4c 67 62  5npkR8H/uAHuqLgb
1480: 39 65 34 33 30 4d 6a 78 5c 6e 22 0a 22 59 4e 4d  9e430Mjx\n"."YNM
1490: 77 64 62 38 72 43 68 48 48 43 68 4e 5a 75 36 7a  wdb8rChHHChNZu6z
14a0: 75 78 77 3d 3d 5c 6e 22 0a 22 2d 2d 2d 2d 2d 45  uxw==\n"."-----E
14b0: 4e 44 20 50 52 49 56 41 54 45 20 4b 45 59 2d 2d  ND PRIVATE KEY--
14c0: 2d 2d 2d 5c 6e 22 3b 0a 0a 2f 2a 0a 2a 2a 20 52  ---\n";../*.** R
14d0: 65 61 64 20 61 20 50 45 4d 20 63 65 72 74 69 66  ead a PEM certif
14e0: 69 63 61 74 65 20 66 72 6f 6d 20 6d 65 6d 6f 72  icate from memor
14f0: 79 20 61 6e 64 20 70 75 73 68 20 69 74 20 69 6e  y and push it in
1500: 74 6f 20 61 6e 20 53 53 4c 5f 43 54 58 2e 0a 2a  to an SSL_CTX..*
1510: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1520: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
1530: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 73 6c  /.static int ssl
1540: 63 74 78 5f 75 73 65 5f 63 65 72 74 5f 66 72 6f  ctx_use_cert_fro
1550: 6d 5f 6d 65 6d 28 0a 20 20 53 53 4c 5f 43 54 58  m_mem(.  SSL_CTX
1560: 20 2a 63 74 78 2c 0a 20 20 63 6f 6e 73 74 20 63   *ctx,.  const c
1570: 68 61 72 20 2a 70 44 61 74 61 2c 0a 20 20 69 6e  har *pData,.  in
1580: 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20 42 49 4f  t nData.){.  BIO
1590: 20 2a 69 6e 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *in;.  int rc =
15a0: 20 31 3b 0a 20 20 58 35 30 39 20 2a 78 20 3d 20   1;.  X509 *x = 
15b0: 30 3b 0a 20 20 58 35 30 39 20 2a 63 65 72 74 20  0;.  X509 *cert 
15c0: 3d 20 30 3b 0a 0a 20 20 69 6e 20 3d 20 42 49 4f  = 0;..  in = BIO
15d0: 5f 6e 65 77 5f 6d 65 6d 5f 62 75 66 28 70 44 61  _new_mem_buf(pDa
15e0: 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 69 66  ta, nData);.  if
15f0: 28 20 69 6e 3d 3d 30 20 29 20 67 6f 74 6f 20 65  ( in==0 ) goto e
1600: 6e 64 5f 6f 66 5f 75 63 66 6d 3b 0a 20 20 2f 2a  nd_of_ucfm;.  /*
1610: 20 78 20 3d 20 58 35 30 39 5f 6e 65 77 5f 65 78   x = X509_new_ex
1620: 28 63 74 78 2d 3e 6c 69 62 63 74 78 2c 20 63 74  (ctx->libctx, ct
1630: 78 2d 3e 70 72 6f 70 71 29 3b 20 2a 2f 0a 20 20  x->propq); */.  
1640: 78 20 3d 20 58 35 30 39 5f 6e 65 77 28 29 3b 0a  x = X509_new();.
1650: 20 20 69 66 28 20 78 3d 3d 30 20 29 20 67 6f 74    if( x==0 ) got
1660: 6f 20 65 6e 64 5f 6f 66 5f 75 63 66 6d 3b 0a 20  o end_of_ucfm;. 
1670: 20 63 65 72 74 20 3d 20 50 45 4d 5f 72 65 61 64   cert = PEM_read
1680: 5f 62 69 6f 5f 58 35 30 39 28 69 6e 2c 20 26 78  _bio_X509(in, &x
1690: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 63  , 0, 0);.  if( c
16a0: 65 72 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e  ert==0 ) goto en
16b0: 64 5f 6f 66 5f 75 63 66 6d 3b 0a 20 20 72 63 20  d_of_ucfm;.  rc 
16c0: 3d 20 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65  = SSL_CTX_use_ce
16d0: 72 74 69 66 69 63 61 74 65 28 63 74 78 2c 20 78  rtificate(ctx, x
16e0: 29 3c 3d 30 3b 0a 65 6e 64 5f 6f 66 5f 75 63 66  )<=0;.end_of_ucf
16f0: 6d 3a 0a 20 20 58 35 30 39 5f 66 72 65 65 28 78  m:.  X509_free(x
1700: 29 3b 0a 20 20 42 49 4f 5f 66 72 65 65 28 69 6e  );.  BIO_free(in
1710: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1720: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
1730: 50 45 4d 20 70 72 69 76 61 74 65 20 6b 65 79 20  PEM private key 
1740: 66 72 6f 6d 20 6d 65 6d 6f 72 79 20 61 6e 64 20  from memory and 
1750: 61 64 64 20 69 74 20 74 6f 20 61 6e 20 53 53 4c  add it to an SSL
1760: 5f 43 54 58 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  _CTX..** Return 
1770: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
1780: 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rors..*/.static 
1790: 69 6e 74 20 73 73 6c 63 74 78 5f 75 73 65 5f 70  int sslctx_use_p
17a0: 6b 65 79 5f 66 72 6f 6d 5f 6d 65 6d 28 0a 20 20  key_from_mem(.  
17b0: 53 53 4c 5f 43 54 58 20 2a 63 74 78 2c 0a 20 20  SSL_CTX *ctx,.  
17c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 44 61 74  const char *pDat
17d0: 61 2c 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a 29  a,.  int nData.)
17e0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 0a  {.  int rc = 1;.
17f0: 20 20 42 49 4f 20 2a 69 6e 3b 0a 20 20 45 56 50    BIO *in;.  EVP
1800: 5f 50 4b 45 59 20 2a 70 6b 65 79 20 3d 20 30 3b  _PKEY *pkey = 0;
1810: 0a 0a 20 20 69 6e 20 3d 20 42 49 4f 5f 6e 65 77  ..  in = BIO_new
1820: 5f 6d 65 6d 5f 62 75 66 28 70 44 61 74 61 2c 20  _mem_buf(pData, 
1830: 6e 44 61 74 61 29 3b 0a 20 20 69 66 28 20 69 6e  nData);.  if( in
1840: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f  ==0 ) goto end_o
1850: 66 5f 75 70 6b 66 6d 3b 0a 20 20 70 6b 65 79 20  f_upkfm;.  pkey 
1860: 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 50  = PEM_read_bio_P
1870: 72 69 76 61 74 65 4b 65 79 28 69 6e 2c 20 30 2c  rivateKey(in, 0,
1880: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 6b   0, 0);.  if( pk
1890: 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64  ey==0 ) goto end
18a0: 5f 6f 66 5f 75 70 6b 66 6d 3b 0a 20 20 72 63 20  _of_upkfm;.  rc 
18b0: 3d 20 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72  = SSL_CTX_use_Pr
18c0: 69 76 61 74 65 4b 65 79 28 63 74 78 2c 20 70 6b  ivateKey(ctx, pk
18d0: 65 79 29 3c 3d 30 3b 0a 20 20 45 56 50 5f 50 4b  ey)<=0;.  EVP_PK
18e0: 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 65  EY_free(pkey);.e
18f0: 6e 64 5f 6f 66 5f 75 70 6b 66 6d 3a 0a 20 20 42  nd_of_upkfm:.  B
1900: 49 4f 5f 66 72 65 65 28 69 6e 29 3b 0a 20 20 72  IO_free(in);.  r
1910: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1920: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 53 53 4c  ** Clear the SSL
1930: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
1940: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 73  /.static void ss
1950: 6c 5f 63 6c 65 61 72 5f 65 72 72 6d 73 67 28 76  l_clear_errmsg(v
1960: 6f 69 64 29 7b 0a 20 20 66 72 65 65 28 73 73 6c  oid){.  free(ssl
1970: 45 72 72 4d 73 67 29 3b 0a 20 20 73 73 6c 45 72  ErrMsg);.  sslEr
1980: 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  rMsg = 0;.}../*.
1990: 2a 2a 20 53 65 74 20 74 68 65 20 53 53 4c 20 65  ** Set the SSL e
19a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
19b0: 0a 76 6f 69 64 20 73 73 6c 5f 73 65 74 5f 65 72  .void ssl_set_er
19c0: 72 6d 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20  rmsg(const char 
19d0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
19e0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
19f0: 73 73 6c 5f 63 6c 65 61 72 5f 65 72 72 6d 73 67  ssl_clear_errmsg
1a00: 28 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ();.  va_start(a
1a10: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 73  p, zFormat);.  s
1a20: 73 6c 45 72 72 4d 73 67 20 3d 20 76 6d 70 72 69  slErrMsg = vmpri
1a30: 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ntf(zFormat, ap)
1a40: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
1a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a60: 74 68 65 20 63 75 72 72 65 6e 74 20 53 53 4c 20  the current SSL 
1a70: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2f  error message.*/
1a80: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 73 6c  .const char *ssl
1a90: 5f 65 72 72 6d 73 67 28 76 6f 69 64 29 7b 0a 20  _errmsg(void){. 
1aa0: 20 72 65 74 75 72 6e 20 73 73 6c 45 72 72 4d 73   return sslErrMs
1ab0: 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  g;.}../*.** When
1ac0: 20 61 20 73 65 72 76 65 72 20 72 65 71 75 65 73   a server reques
1ad0: 74 73 20 61 20 63 6c 69 65 6e 74 20 63 65 72 74  ts a client cert
1ae0: 69 66 69 63 61 74 65 20 74 68 61 74 20 68 61 73  ificate that has
1af0: 6e 27 74 20 62 65 65 6e 20 70 72 6f 76 69 64 65  n't been provide
1b00: 64 2c 0a 2a 2a 20 64 69 73 70 6c 61 79 20 61 20  d,.** display a 
1b10: 77 61 72 6e 69 6e 67 20 6d 65 73 73 61 67 65 20  warning message 
1b20: 65 78 70 6c 61 69 6e 69 6e 67 20 77 68 61 74 20  explaining what 
1b30: 74 6f 20 64 6f 20 6e 65 78 74 2e 0a 2a 2f 0a 73  to do next..*/.s
1b40: 74 61 74 69 63 20 69 6e 74 20 73 73 6c 5f 63 6c  tatic int ssl_cl
1b50: 69 65 6e 74 5f 63 65 72 74 5f 63 61 6c 6c 62 61  ient_cert_callba
1b60: 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 58 35 30  ck(SSL *ssl, X50
1b70: 39 20 2a 2a 78 35 30 39 2c 20 45 56 50 5f 50 4b  9 **x509, EVP_PK
1b80: 45 59 20 2a 2a 70 6b 65 79 29 7b 0a 20 20 66 6f  EY **pkey){.  fo
1b90: 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22 54 68  ssil_warning("Th
1ba0: 65 20 72 65 6d 6f 74 65 20 73 65 72 76 65 72 20  e remote server 
1bb0: 72 65 71 75 65 73 74 65 64 20 61 20 63 6c 69 65  requested a clie
1bc0: 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66  nt certificate f
1bd0: 6f 72 20 22 0a 20 20 20 20 22 61 75 74 68 65 6e  or ".    "authen
1be0: 74 69 63 61 74 69 6f 6e 2e 20 53 70 65 63 69 66  tication. Specif
1bf0: 79 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 74  y the pathname t
1c00: 6f 20 61 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  o a file contain
1c10: 69 6e 67 20 74 68 65 20 50 45 4d 20 22 0a 20 20  ing the PEM ".  
1c20: 20 20 22 65 6e 63 6f 64 65 64 20 63 65 72 74 69    "encoded certi
1c30: 66 69 63 61 74 65 20 61 6e 64 20 70 72 69 76 61  ficate and priva
1c40: 74 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  te key with the 
1c50: 2d 2d 73 73 6c 2d 69 64 65 6e 74 69 74 79 20 6f  --ssl-identity o
1c60: 70 74 69 6f 6e 20 22 0a 20 20 20 20 22 6f 72 20  ption ".    "or 
1c70: 74 68 65 20 73 73 6c 2d 69 64 65 6e 74 69 74 79  the ssl-identity
1c80: 20 73 65 74 74 69 6e 67 2e 22 29 3b 0a 20 20 72   setting.");.  r
1c90: 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63  eturn 0; /* no c
1ca0: 65 72 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  ert available */
1cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
1cc0: 74 20 61 6e 20 4f 70 65 6e 53 53 4c 20 41 53 4e  t an OpenSSL ASN
1cd0: 31 5f 54 49 4d 45 20 74 6f 20 61 6e 20 49 53 4f  1_TIME to an ISO
1ce0: 38 36 30 31 20 74 69 6d 65 73 74 61 6d 70 2e 0a  8601 timestamp..
1cf0: 2a 2a 0a 2a 2a 20 50 65 72 20 52 46 43 20 35 32  **.** Per RFC 52
1d00: 38 30 2c 20 41 53 4e 31 20 74 69 6d 65 73 74 61  80, ASN1 timesta
1d10: 6d 70 73 20 69 6e 20 58 2e 35 30 39 20 63 65 72  mps in X.509 cer
1d20: 74 69 66 69 63 61 74 65 73 20 6d 75 73 74 0a 2a  tificates 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 69 64 65 6e 74 69 74 79 46 69 6c 65  ar *identityFile
2330: 3b 0a 0a 20 20 69 66 28 20 73 73 6c 49 73 49 6e  ;..  if( sslIsIn
2340: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  it==0 ){.    con
2350: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  st char *zFile;.
2360: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2370: 7a 43 61 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20  zCaFile = 0;.   
2380: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61   const char *zCa
2390: 44 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20  Directory = 0;. 
23a0: 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 53     int i;..    S
23b0: 53 4c 5f 6c 69 62 72 61 72 79 5f 69 6e 69 74 28  SL_library_init(
23c0: 29 3b 0a 20 20 20 20 53 53 4c 5f 6c 6f 61 64 5f  );.    SSL_load_
23d0: 65 72 72 6f 72 5f 73 74 72 69 6e 67 73 28 29 3b  error_strings();
23e0: 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64  .    OpenSSL_add
23f0: 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28  _all_algorithms(
2400: 29 3b 0a 20 20 20 20 73 73 6c 43 74 78 20 3d 20  );.    sslCtx = 
2410: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76  SSL_CTX_new(SSLv
2420: 32 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  23_client_method
2430: 28 29 29 3b 0a 20 20 20 20 2f 2a 20 44 69 73 61  ());.    /* Disa
2440: 62 6c 65 20 53 53 4c 76 32 20 61 6e 64 20 53 53  ble SSLv2 and SS
2450: 4c 76 33 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  Lv3 */.    SSL_C
2460: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 73  TX_set_options(s
2470: 73 6c 43 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f  slCtx, SSL_OP_NO
2480: 5f 53 53 4c 76 32 7c 53 53 4c 5f 4f 50 5f 4e 4f  _SSLv2|SSL_OP_NO
2490: 5f 53 53 4c 76 33 29 3b 0a 0a 20 20 20 20 2f 2a  _SSLv3);..    /*
24a0: 20 46 69 6e 64 20 74 68 65 20 74 72 75 73 74 20   Find the trust 
24b0: 73 74 6f 72 65 20 2a 2f 0a 20 20 20 20 7a 46 69  store */.    zFi
24c0: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  le = 0;.    for(
24d0: 69 3d 30 3b 20 7a 46 69 6c 65 3d 3d 30 20 26 26  i=0; zFile==0 &&
24e0: 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<5; i++){.    
24f0: 20 20 73 77 69 74 63 68 28 20 69 20 29 7b 0a 20    switch( i ){. 
2500: 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 2f         case 0: /
2510: 2a 20 46 69 72 73 74 20 70 72 69 6f 72 69 74 79  * First priority
2520: 20 69 73 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 6e   is environmentn
2530: 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20   variables */.  
2540: 20 20 20 20 20 20 20 20 7a 46 69 6c 65 20 3d 20          zFile = 
2550: 66 6f 73 73 69 6c 5f 67 65 74 65 6e 76 28 58 35  fossil_getenv(X5
2560: 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63  09_get_default_c
2570: 65 72 74 5f 66 69 6c 65 5f 65 6e 76 28 29 29 3b  ert_file_env());
2580: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2590: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 31  ;.        case 1
25a0: 3a 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c  :.          zFil
25b0: 65 20 3d 20 66 6f 73 73 69 6c 5f 67 65 74 65 6e  e = fossil_geten
25c0: 76 28 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75  v(X509_get_defau
25d0: 6c 74 5f 63 65 72 74 5f 64 69 72 5f 65 6e 76 28  lt_cert_dir_env(
25e0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ));.          br
25f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
2600: 65 20 32 3a 0a 20 20 20 20 20 20 20 20 20 20 69  e 2:.          i
2610: 66 28 20 21 67 2e 72 65 70 6f 73 69 74 6f 72 79  f( !g.repository
2620: 4f 70 65 6e 20 29 20 64 62 5f 6f 70 65 6e 5f 63  Open ) db_open_c
2630: 6f 6e 66 69 67 28 30 2c 30 29 3b 0a 20 20 20 20  onfig(0,0);.    
2640: 20 20 20 20 20 20 7a 46 69 6c 65 20 3d 20 64 62        zFile = db
2650: 5f 67 65 74 28 22 73 73 6c 2d 63 61 2d 6c 6f 63  _get("ssl-ca-loc
2660: 61 74 69 6f 6e 22 2c 30 29 3b 0a 20 20 20 20 20  ation",0);.     
2670: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2680: 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20      case 3:.    
2690: 20 20 20 20 20 20 7a 46 69 6c 65 20 3d 20 58 35        zFile = X5
26a0: 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63  09_get_default_c
26b0: 65 72 74 5f 66 69 6c 65 28 29 3b 0a 20 20 20 20  ert_file();.    
26c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26d0: 20 20 20 20 20 63 61 73 65 20 34 3a 0a 20 20 20       case 4:.   
26e0: 20 20 20 20 20 20 20 7a 46 69 6c 65 20 3d 20 58         zFile = X
26f0: 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f  509_get_default_
2700: 63 65 72 74 5f 64 69 72 28 29 3b 0a 20 20 20 20  cert_dir();.    
2710: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2720: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
2730: 46 69 6c 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  File==0 ) contin
2740: 75 65 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  ue;.      switch
2750: 28 20 66 69 6c 65 5f 69 73 64 69 72 28 7a 46 69  ( file_isdir(zFi
2760: 6c 65 2c 20 45 78 74 46 49 4c 45 29 20 29 7b 0a  le, ExtFILE) ){.
2770: 20 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20          case 0: 
2780: 7b 20 2f 2a 20 64 6f 65 73 6e 27 74 20 65 78 69  { /* doesn't exi
2790: 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  st */.          
27a0: 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  zFile = 0;.     
27b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
27d0: 73 65 20 31 3a 20 7b 20 2f 2a 20 64 69 72 65 63  se 1: { /* direc
27e0: 74 6f 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  tory */.        
27f0: 20 20 7a 43 61 46 69 6c 65 20 3d 20 30 3b 0a 20    zCaFile = 0;. 
2800: 20 20 20 20 20 20 20 20 20 7a 43 61 44 69 72 65           zCaDire
2810: 63 74 6f 72 79 20 3d 20 7a 46 69 6c 65 3b 0a 20  ctory = zFile;. 
2820: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2830: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2840: 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 66    case 2: { /* f
2850: 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ile */.         
2860: 20 7a 43 61 46 69 6c 65 20 3d 20 7a 46 69 6c 65   zCaFile = zFile
2870: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 61 44  ;.          zCaD
2880: 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20  irectory = 0;.  
2890: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
28a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
28c0: 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
28d0: 20 2f 2a 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c   /* fossil_fatal
28e0: 28 22 43 61 6e 6e 6f 74 20 66 69 6e 64 20 61 20  ("Cannot find a 
28f0: 74 72 75 73 74 20 73 74 6f 72 65 22 29 3b 20 2a  trust store"); *
2900: 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
2910: 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72  SSL_CTX_load_ver
2920: 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 73 73  ify_locations(ss
2930: 6c 43 74 78 2c 20 7a 43 61 46 69 6c 65 2c 20 7a  lCtx, zCaFile, z
2940: 43 61 44 69 72 65 63 74 6f 72 79 29 3d 3d 30 20  CaDirectory)==0 
2950: 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f  ){.      fossil_
2960: 66 61 74 61 6c 28 22 43 61 6e 6e 6f 74 20 6c 6f  fatal("Cannot lo
2970: 61 64 20 43 41 20 72 6f 6f 74 20 63 65 72 74 69  ad CA root certi
2980: 66 69 63 61 74 65 73 20 66 72 6f 6d 20 25 73 22  ficates from %s"
2990: 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  , zFile);.    }.
29a0: 0a 2f 2a 20 45 6e 61 62 6c 65 20 4f 70 65 6e 53  ./* Enable OpenS
29b0: 53 4c 20 74 6f 20 75 73 65 20 74 68 65 20 57 69  SL to use the Wi
29c0: 6e 64 6f 77 73 20 73 79 73 74 65 6d 20 52 4f 4f  ndows system ROO
29d0: 54 20 63 65 72 74 69 66 69 63 61 74 65 20 73 74  T certificate st
29e0: 6f 72 65 20 74 6f 20 73 65 61 72 63 68 20 66 6f  ore to search fo
29f0: 72 0a 2a 2a 20 63 65 72 74 69 66 69 63 61 74 65  r.** certificate
2a00: 73 20 6d 69 73 73 69 6e 67 20 69 6e 20 74 68 65  s missing in the
2a10: 20 66 69 6c 65 20 61 6e 64 20 64 69 72 65 63 74   file and direct
2a20: 6f 72 79 20 74 72 75 73 74 20 73 74 6f 72 65 73  ory trust stores
2a30: 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20   already loaded 
2a40: 62 79 0a 2a 2a 20 60 53 53 4c 5f 43 54 58 5f 6c  by.** `SSL_CTX_l
2a50: 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74  oad_verify_locat
2a60: 69 6f 6e 73 28 29 27 2e 0a 2a 2a 20 54 68 69 73  ions()'..** This
2a70: 20 66 65 61 74 75 72 65 20 77 61 73 20 69 6e 74   feature was int
2a80: 72 6f 64 75 63 65 64 20 77 69 74 68 20 4f 70 65  roduced with Ope
2a90: 6e 53 53 4c 20 33 2e 32 2e 30 2c 20 61 6e 64 20  nSSL 3.2.0, and 
2aa0: 6d 61 79 20 62 65 20 65 6e 61 62 6c 65 64 20 62  may be enabled b
2ab0: 79 20 64 65 66 61 75 6c 74 0a 2a 2a 20 66 6f 72  y default.** for
2ac0: 20 66 75 74 75 72 65 20 76 65 72 73 69 6f 6e 73   future versions
2ad0: 20 6f 66 20 4f 70 65 6e 53 53 4c 2c 20 61 6e 64   of OpenSSL, and
2ae0: 20 65 78 70 6c 69 63 69 74 20 69 6e 69 74 69 61   explicit initia
2af0: 6c 69 7a 61 74 69 6f 6e 20 6d 61 79 20 62 65 20  lization may be 
2b00: 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 20 4e 4f  redundant..** NO
2b10: 54 45 20 54 4f 20 48 41 43 4b 45 52 53 20 54 57  TE TO HACKERS TW
2b20: 45 41 4b 49 4e 47 20 54 48 45 49 52 20 4f 50 45  EAKING THEIR OPE
2b30: 4e 53 53 4c 20 43 4f 4e 46 49 47 55 52 41 54 49  NSSL CONFIGURATI
2b40: 4f 4e 3a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ON:.** The follo
2b50: 77 69 6e 67 20 4f 70 65 6e 53 53 4c 20 63 6f 6e  wing OpenSSL con
2b60: 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f  figuration optio
2b70: 6e 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75  ns must not be u
2b80: 73 65 64 20 66 6f 72 20 74 68 69 73 20 66 65 61  sed for this fea
2b90: 74 75 72 65 0a 2a 2a 20 74 6f 20 62 65 20 61 76  ture.** to be av
2ba0: 61 69 6c 61 62 6c 65 3a 20 60 6e 6f 2d 61 75 74  ailable: `no-aut
2bb0: 6f 61 6c 67 69 6e 69 74 27 2c 20 60 6e 6f 2d 77  oalginit', `no-w
2bc0: 69 6e 73 74 6f 72 65 27 2e 20 54 68 65 20 46 6f  instore'. The Fo
2bd0: 73 73 69 6c 20 6d 61 6b 65 66 69 6c 65 73 20 64  ssil makefiles d
2be0: 6f 20 6e 6f 74 0a 2a 2a 20 63 75 72 72 65 6e 74  o not.** current
2bf0: 6c 79 20 73 65 74 20 74 68 65 73 65 20 6f 70 74  ly set these opt
2c00: 69 6f 6e 73 20 77 68 65 6e 20 62 75 69 6c 64 69  ions when buildi
2c10: 6e 67 20 4f 70 65 6e 53 53 4c 20 66 6f 72 20 57  ng OpenSSL for W
2c20: 69 6e 64 6f 77 73 2e 20 2a 2f 0a 23 69 66 20 64  indows. */.#if d
2c30: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 23  efined(_WIN32).#
2c40: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
2c50: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 30  ON_NUMBER >= 0x0
2c60: 33 30 32 30 30 30 30 30 0a 20 20 20 20 69 66 28  30200000.    if(
2c70: 20 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65   SSL_CTX_load_ve
2c80: 72 69 66 79 5f 73 74 6f 72 65 28 73 73 6c 43 74  rify_store(sslCt
2c90: 78 2c 20 22 6f 72 67 2e 6f 70 65 6e 73 73 6c 2e  x, "org.openssl.
2ca0: 77 69 6e 73 74 6f 72 65 3a 22 29 3d 3d 30 20 29  winstore:")==0 )
2cb0: 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70  {.      fossil_p
2cc0: 72 69 6e 74 28 22 4e 4f 54 49 43 45 3a 20 46 61  rint("NOTICE: Fa
2cd0: 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 74 68 65  iled to load the
2ce0: 20 57 69 6e 64 6f 77 73 20 72 6f 6f 74 20 63 65   Windows root ce
2cf0: 72 74 69 66 69 63 61 74 65 73 2e 5c 6e 22 29 3b  rtificates.\n");
2d00: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
2d10: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
2d20: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 30 33 30  _NUMBER >= 0x030
2d30: 32 30 30 30 30 30 20 2a 2f 0a 23 65 6e 64 69 66  200000 */.#endif
2d40: 20 2f 2a 20 5f 57 49 4e 33 32 20 2a 2f 0a 0a 20   /* _WIN32 */.. 
2d50: 20 20 20 2f 2a 20 4c 6f 61 64 20 63 6c 69 65 6e     /* Load clien
2d60: 74 20 53 53 4c 20 69 64 65 6e 74 69 74 79 2c 20  t SSL identity, 
2d70: 70 72 65 66 65 72 72 69 6e 67 20 74 68 65 20 66  preferring the f
2d80: 69 6c 65 6e 61 6d 65 20 73 70 65 63 69 66 69 65  ilename specifie
2d90: 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  d on the.    ** 
2da0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a  command line */.
2db0: 20 20 20 20 69 66 28 20 67 2e 7a 53 53 4c 49 64      if( g.zSSLId
2dc0: 65 6e 74 69 74 79 21 3d 30 20 29 7b 0a 20 20 20  entity!=0 ){.   
2dd0: 20 20 20 69 64 65 6e 74 69 74 79 46 69 6c 65 20     identityFile 
2de0: 3d 20 67 2e 7a 53 53 4c 49 64 65 6e 74 69 74 79  = g.zSSLIdentity
2df0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e00: 20 20 20 69 64 65 6e 74 69 74 79 46 69 6c 65 20     identityFile 
2e10: 3d 20 64 62 5f 67 65 74 28 22 73 73 6c 2d 69 64  = db_get("ssl-id
2e20: 65 6e 74 69 74 79 22 2c 20 30 29 3b 0a 20 20 20  entity", 0);.   
2e30: 20 7d 0a 20 20 20 20 69 66 28 20 69 64 65 6e 74   }.    if( ident
2e40: 69 74 79 46 69 6c 65 21 3d 30 20 26 26 20 69 64  ityFile!=0 && id
2e50: 65 6e 74 69 74 79 46 69 6c 65 5b 30 5d 21 3d 27  entityFile[0]!='
2e60: 5c 30 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  \0' ){.      if(
2e70: 20 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72   SSL_CTX_use_cer
2e80: 74 69 66 69 63 61 74 65 5f 63 68 61 69 6e 5f 66  tificate_chain_f
2e90: 69 6c 65 28 73 73 6c 43 74 78 2c 69 64 65 6e 74  ile(sslCtx,ident
2ea0: 69 74 79 46 69 6c 65 29 21 3d 31 0a 20 20 20 20  ityFile)!=1.    
2eb0: 20 20 20 7c 7c 20 53 53 4c 5f 43 54 58 5f 75 73     || SSL_CTX_us
2ec0: 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c  e_PrivateKey_fil
2ed0: 65 28 73 73 6c 43 74 78 2c 69 64 65 6e 74 69 74  e(sslCtx,identit
2ee0: 79 46 69 6c 65 2c 53 53 4c 5f 46 49 4c 45 54 59  yFile,SSL_FILETY
2ef0: 50 45 5f 50 45 4d 29 21 3d 31 0a 20 20 20 20 20  PE_PEM)!=1.     
2f00: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 73 73   ){.        foss
2f10: 69 6c 5f 66 61 74 61 6c 28 22 43 6f 75 6c 64 20  il_fatal("Could 
2f20: 6e 6f 74 20 6c 6f 61 64 20 53 53 4c 20 69 64 65  not load SSL ide
2f30: 6e 74 69 74 79 20 66 72 6f 6d 20 25 73 22 2c 20  ntity from %s", 
2f40: 69 64 65 6e 74 69 74 79 46 69 6c 65 29 3b 0a 20  identityFile);. 
2f50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2f60: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 20 63   /* Register a c
2f70: 61 6c 6c 62 61 63 6b 20 74 6f 20 74 65 6c 6c 20  allback to tell 
2f80: 74 68 65 20 75 73 65 72 20 77 68 61 74 20 74 6f  the user what to
2f90: 20 64 6f 20 77 68 65 6e 20 74 68 65 20 73 65 72   do when the ser
2fa0: 76 65 72 20 61 73 6b 73 0a 20 20 20 20 2a 2a 20  ver asks.    ** 
2fb0: 66 6f 72 20 61 20 63 65 72 74 20 2a 2f 0a 20 20  for a cert */.  
2fc0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c    SSL_CTX_set_cl
2fd0: 69 65 6e 74 5f 63 65 72 74 5f 63 62 28 73 73 6c  ient_cert_cb(ssl
2fe0: 43 74 78 2c 20 73 73 6c 5f 63 6c 69 65 6e 74 5f  Ctx, ssl_client_
2ff0: 63 65 72 74 5f 63 61 6c 6c 62 61 63 6b 29 3b 0a  cert_callback);.
3000: 0a 20 20 20 20 73 73 6c 49 73 49 6e 69 74 20 3d  .    sslIsInit =
3010: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
3020: 20 61 73 73 65 72 74 28 20 73 73 6c 49 73 49 6e   assert( sslIsIn
3030: 69 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  it==1 );.  }.}..
3040: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 69 73 20  /*.** Call this 
3050: 72 6f 75 74 69 6e 65 20 74 6f 20 73 68 75 74 64  routine to shutd
3060: 6f 77 6e 20 74 68 65 20 53 53 4c 20 6d 6f 64 75  own the SSL modu
3070: 6c 65 20 70 72 69 6f 72 20 74 6f 20 70 72 6f 67  le prior to prog
3080: 72 61 6d 20 65 78 69 74 2e 0a 2a 2f 0a 76 6f 69  ram exit..*/.voi
3090: 64 20 73 73 6c 5f 67 6c 6f 62 61 6c 5f 73 68 75  d ssl_global_shu
30a0: 74 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 20 20 69  tdown(void){.  i
30b0: 66 28 20 73 73 6c 49 73 49 6e 69 74 20 29 7b 0a  f( sslIsInit ){.
30c0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
30d0: 28 73 73 6c 43 74 78 29 3b 0a 20 20 20 20 73 73  (sslCtx);.    ss
30e0: 6c 5f 63 6c 65 61 72 5f 65 72 72 6d 73 67 28 29  l_clear_errmsg()
30f0: 3b 0a 20 20 20 20 73 73 6c 49 73 49 6e 69 74 20  ;.    sslIsInit 
3100: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
3110: 2a 20 43 6c 6f 73 65 20 74 68 65 20 63 75 72 72  * Close the curr
3120: 65 6e 74 6c 79 20 6f 70 65 6e 20 63 6c 69 65 6e  ently open clien
3130: 74 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  t SSL connection
3140: 2e 20 20 49 66 20 6e 6f 20 63 6f 6e 6e 65 63 74  .  If no connect
3150: 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 0a 2a 2a 20  ion is open,.** 
3160: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
3170: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76 6f 69 64  a no-op..*/.void
3180: 20 73 73 6c 5f 63 6c 6f 73 65 5f 63 6c 69 65 6e   ssl_close_clien
3190: 74 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 69  t(void){.  if( i
31a0: 42 69 6f 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Bio!=NULL ){.   
31b0: 20 28 76 6f 69 64 29 42 49 4f 5f 72 65 73 65 74   (void)BIO_reset
31c0: 28 69 42 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f  (iBio);.    BIO_
31d0: 66 72 65 65 5f 61 6c 6c 28 69 42 69 6f 29 3b 0a  free_all(iBio);.
31e0: 20 20 20 20 69 42 69 6f 20 3d 20 4e 55 4c 4c 3b      iBio = NULL;
31f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 53 65 65 20 52  .  }.}../* See R
3200: 46 43 32 38 31 37 20 66 6f 72 20 64 65 74 61 69  FC2817 for detai
3210: 6c 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ls */.static int
3220: 20 65 73 74 61 62 6c 69 73 68 5f 70 72 6f 78 79   establish_proxy
3230: 5f 74 75 6e 6e 65 6c 28 55 72 6c 44 61 74 61 20  _tunnel(UrlData 
3240: 2a 70 55 72 6c 44 61 74 61 2c 20 42 49 4f 20 2a  *pUrlData, BIO *
3250: 62 69 6f 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  bio){.  int rc, 
3260: 68 74 74 70 56 65 72 4d 69 6e 3b 0a 20 20 63 68  httpVerMin;.  ch
3270: 61 72 20 2a 62 62 75 66 3b 0a 20 20 42 6c 6f 62  ar *bbuf;.  Blob
3280: 20 73 6e 64 2c 20 72 65 70 6c 79 3b 0a 20 20 69   snd, reply;.  i
3290: 6e 74 20 64 6f 6e 65 3d 30 2c 65 6e 64 3d 30 3b  nt done=0,end=0;
32a0: 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 73 6e  .  blob_zero(&sn
32b0: 64 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e  d);.  blob_appen
32c0: 64 66 28 26 73 6e 64 2c 20 22 43 4f 4e 4e 45 43  df(&snd, "CONNEC
32d0: 54 20 25 73 3a 25 64 20 48 54 54 50 2f 31 2e 31  T %s:%d HTTP/1.1
32e0: 5c 72 5c 6e 22 2c 20 70 55 72 6c 44 61 74 61 2d  \r\n", pUrlData-
32f0: 3e 68 6f 73 74 6e 61 6d 65 2c 0a 20 20 20 20 20  >hostname,.     
3300: 20 70 55 72 6c 44 61 74 61 2d 3e 70 72 6f 78 79   pUrlData->proxy
3310: 4f 72 69 67 50 6f 72 74 29 3b 0a 20 20 62 6c 6f  OrigPort);.  blo
3320: 62 5f 61 70 70 65 6e 64 66 28 26 73 6e 64 2c 20  b_appendf(&snd, 
3330: 22 48 6f 73 74 3a 20 25 73 3a 25 64 5c 72 5c 6e  "Host: %s:%d\r\n
3340: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
3350: 20 20 70 55 72 6c 44 61 74 61 2d 3e 68 6f 73 74    pUrlData->host
3360: 6e 61 6d 65 2c 20 70 55 72 6c 44 61 74 61 2d 3e  name, pUrlData->
3370: 70 72 6f 78 79 4f 72 69 67 50 6f 72 74 29 3b 0a  proxyOrigPort);.
3380: 20 20 69 66 28 20 70 55 72 6c 44 61 74 61 2d 3e    if( pUrlData->
3390: 70 72 6f 78 79 41 75 74 68 20 29 7b 0a 20 20 20  proxyAuth ){.   
33a0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73   blob_appendf(&s
33b0: 6e 64 2c 20 22 50 72 6f 78 79 2d 41 75 74 68 6f  nd, "Proxy-Autho
33c0: 72 69 7a 61 74 69 6f 6e 3a 20 25 73 5c 72 5c 6e  rization: %s\r\n
33d0: 22 2c 20 70 55 72 6c 44 61 74 61 2d 3e 70 72 6f  ", pUrlData->pro
33e0: 78 79 41 75 74 68 29 3b 0a 20 20 7d 0a 20 20 62  xyAuth);.  }.  b
33f0: 6c 6f 62 5f 61 70 70 65 6e 64 28 26 73 6e 64 2c  lob_append(&snd,
3400: 20 22 50 72 6f 78 79 2d 43 6f 6e 6e 65 63 74 69   "Proxy-Connecti
3410: 6f 6e 3a 20 6b 65 65 70 2d 61 6c 69 76 65 5c 72  on: keep-alive\r
3420: 5c 6e 22 2c 20 2d 31 29 3b 0a 20 20 62 6c 6f 62  \n", -1);.  blob
3430: 5f 61 70 70 65 6e 64 66 28 26 73 6e 64 2c 20 22  _appendf(&snd, "
3440: 55 73 65 72 2d 41 67 65 6e 74 3a 20 25 73 5c 72  User-Agent: %s\r
3450: 5c 6e 22 2c 20 67 65 74 5f 75 73 65 72 5f 61 67  \n", get_user_ag
3460: 65 6e 74 28 29 29 3b 0a 20 20 62 6c 6f 62 5f 61  ent());.  blob_a
3470: 70 70 65 6e 64 28 26 73 6e 64 2c 20 22 5c 72 5c  ppend(&snd, "\r\
3480: 6e 22 2c 20 32 29 3b 0a 20 20 42 49 4f 5f 77 72  n", 2);.  BIO_wr
3490: 69 74 65 28 62 69 6f 2c 20 62 6c 6f 62 5f 62 75  ite(bio, blob_bu
34a0: 66 66 65 72 28 26 73 6e 64 29 2c 20 62 6c 6f 62  ffer(&snd), blob
34b0: 5f 73 69 7a 65 28 26 73 6e 64 29 29 3b 0a 20 20  _size(&snd));.  
34c0: 62 6c 6f 62 5f 72 65 73 65 74 28 26 73 6e 64 29  blob_reset(&snd)
34d0: 3b 0a 0a 20 20 2f 2a 20 57 61 69 74 20 66 6f 72  ;..  /* Wait for
34e0: 20 65 6e 64 20 6f 66 20 72 65 70 6c 79 20 2a 2f   end of reply */
34f0: 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 72 65  .  blob_zero(&re
3500: 70 6c 79 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ply);.  do{.    
3510: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 68 61  int len;.    cha
3520: 72 20 62 75 66 5b 32 35 36 5d 3b 0a 20 20 20 20  r buf[256];.    
3530: 6c 65 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 62  len = BIO_read(b
3540: 69 6f 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28  io, buf, sizeof(
3550: 62 75 66 29 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  buf));.    blob_
3560: 61 70 70 65 6e 64 28 26 72 65 70 6c 79 2c 20 62  append(&reply, b
3570: 75 66 2c 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 62  uf, len);..    b
3580: 62 75 66 20 3d 20 62 6c 6f 62 5f 62 75 66 66 65  buf = blob_buffe
3590: 72 28 26 72 65 70 6c 79 29 3b 0a 20 20 20 20 6c  r(&reply);.    l
35a0: 65 6e 20 3d 20 62 6c 6f 62 5f 73 69 7a 65 28 26  en = blob_size(&
35b0: 72 65 70 6c 79 29 3b 0a 20 20 20 20 77 68 69 6c  reply);.    whil
35c0: 65 28 65 6e 64 20 3c 20 6c 65 6e 29 20 7b 0a 20  e(end < len) {. 
35d0: 20 20 20 20 20 69 66 28 20 62 62 75 66 5b 65 6e       if( bbuf[en
35e0: 64 5d 3d 3d 27 5c 6e 27 20 29 20 7b 0a 20 20 20  d]=='\n' ) {.   
35f0: 20 20 20 20 20 69 66 28 20 28 65 6e 64 2b 31 3c       if( (end+1<
3600: 6c 65 6e 20 26 26 20 62 62 75 66 5b 65 6e 64 2b  len && bbuf[end+
3610: 31 5d 3d 3d 27 5c 6e 27 29 0a 20 20 20 20 20 20  1]=='\n').      
3620: 20 20 20 7c 7c 20 28 65 6e 64 2b 32 3c 6c 65 6e     || (end+2<len
3630: 20 26 26 20 62 62 75 66 5b 65 6e 64 2b 31 5d 3d   && bbuf[end+1]=
3640: 3d 27 5c 72 27 20 26 26 20 62 62 75 66 5b 65 6e  ='\r' && bbuf[en
3650: 64 2b 32 5d 3d 3d 27 5c 6e 27 29 0a 20 20 20 20  d+2]=='\n').    
3660: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
3670: 20 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20   done = 1;.     
3680: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3690: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
36a0: 20 20 20 20 65 6e 64 2b 2b 3b 0a 20 20 20 20 7d      end++;.    }
36b0: 0a 20 20 7d 77 68 69 6c 65 28 21 64 6f 6e 65 29  .  }while(!done)
36c0: 3b 0a 20 20 73 73 63 61 6e 66 28 62 62 75 66 2c  ;.  sscanf(bbuf,
36d0: 20 22 48 54 54 50 2f 31 2e 25 64 20 25 64 22 2c   "HTTP/1.%d %d",
36e0: 20 26 68 74 74 70 56 65 72 4d 69 6e 2c 20 26 72   &httpVerMin, &r
36f0: 63 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74  c);.  blob_reset
3700: 28 26 72 65 70 6c 79 29 3b 0a 20 20 72 65 74 75  (&reply);.  retu
3710: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3720: 49 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  Invoke this rout
3730: 69 6e 65 20 74 6f 20 64 69 73 61 62 6c 65 20 53  ine to disable S
3740: 53 4c 20 63 65 72 74 20 76 65 72 69 66 69 63 61  SL cert verifica
3750: 74 69 6f 6e 2e 20 20 41 66 74 65 72 0a 2a 2a 20  tion.  After.** 
3760: 74 68 69 73 20 63 61 6c 6c 20 69 73 20 6d 61 64  this call is mad
3770: 65 2c 20 61 6e 79 20 53 53 4c 20 63 65 72 74 20  e, any SSL cert 
3780: 74 68 61 74 20 74 68 65 20 73 65 72 76 65 72 20  that the server 
3790: 70 72 6f 76 69 64 65 73 20 77 69 6c 6c 0a 2a 2a  provides will.**
37a0: 20 62 65 20 61 63 63 65 70 74 65 64 2e 20 20 43   be accepted.  C
37b0: 6f 6d 6d 75 6e 69 63 61 74 69 6f 6e 20 77 69 6c  ommunication wil
37c0: 6c 20 73 74 69 6c 6c 20 62 65 20 65 6e 63 72 79  l still be encry
37d0: 70 74 65 64 2c 20 62 75 74 20 74 68 65 0a 2a 2a  pted, but the.**
37e0: 20 63 6c 69 65 6e 74 20 68 61 73 20 6e 6f 20 77   client has no w
37f0: 61 79 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 77 68  ay of knowing wh
3800: 65 74 68 65 72 20 69 74 20 69 73 20 74 61 6c 6b  ether it is talk
3810: 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 72 65  ing to the.** re
3820: 61 6c 20 73 65 72 76 65 72 20 6f 72 20 61 20 6d  al server or a m
3830: 61 6e 2d 69 6e 2d 74 68 65 2d 6d 69 64 64 6c 65  an-in-the-middle
3840: 20 69 6d 70 6f 73 74 65 72 2e 0a 2a 2f 0a 76 6f   imposter..*/.vo
3850: 69 64 20 73 73 6c 5f 64 69 73 61 62 6c 65 5f 63  id ssl_disable_c
3860: 65 72 74 5f 76 65 72 69 66 69 63 61 74 69 6f 6e  ert_verification
3870: 28 76 6f 69 64 29 7b 0a 20 20 73 73 6c 4e 6f 43  (void){.  sslNoC
3880: 65 72 74 56 65 72 69 66 79 20 3d 20 31 3b 0a 7d  ertVerify = 1;.}
3890: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20  ../*.** Open an 
38a0: 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  SSL connection a
38b0: 73 20 61 20 63 6c 69 65 6e 74 20 74 68 61 74 20  s a client that 
38c0: 69 73 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f  is to connect to
38d0: 20 74 68 65 20 73 65 72 76 65 72 0a 2a 2a 20 69   the server.** i
38e0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 55 72  dentified by pUr
38f0: 6c 44 61 74 61 2e 0a 2a 2a 0a 2a 20 20 54 68 65  lData..**.*  The
3900: 20 69 64 65 6e 74 69 66 79 20 6f 66 20 74 68 65   identify of the
3910: 20 73 65 72 76 65 72 20 69 73 20 64 65 74 65 72   server is deter
3920: 6d 69 6e 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  mined as follows
3930: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 55 72 6c 44  :.**.**    pUrlD
3940: 61 74 61 2d 3e 6e 61 6d 65 20 20 4e 61 6d 65 20  ata->name  Name 
3950: 6f 66 20 74 68 65 20 73 65 72 76 65 72 2e 20 20  of the server.  
3960: 45 78 3a 20 66 6f 73 73 69 6c 2d 73 63 6d 2e 6f  Ex: fossil-scm.o
3970: 72 67 0a 2a 2a 20 20 20 20 67 2e 75 72 6c 2e 6e  rg.**    g.url.n
3980: 61 6d 65 20 20 20 20 20 20 4e 61 6d 65 20 6f 66  ame      Name of
3990: 20 74 68 65 20 70 72 6f 78 79 20 73 65 72 76 65   the proxy serve
39a0: 72 2c 20 69 66 20 70 72 6f 78 79 69 6e 67 2e 0a  r, if proxying..
39b0: 2a 2a 20 20 20 20 70 55 72 6c 44 61 74 61 2d 3e  **    pUrlData->
39c0: 70 6f 72 74 20 20 54 43 50 2f 49 50 20 70 6f 72  port  TCP/IP por
39d0: 74 20 74 6f 20 75 73 65 2e 20 20 45 78 3a 20 38  t to use.  Ex: 8
39e0: 30 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  0.**.** Return t
39f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
3a00: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 73 6c 5f  ors..*/.int ssl_
3a10: 6f 70 65 6e 5f 63 6c 69 65 6e 74 28 55 72 6c 44  open_client(UrlD
3a20: 61 74 61 20 2a 70 55 72 6c 44 61 74 61 29 7b 0a  ata *pUrlData){.
3a30: 20 20 58 35 30 39 20 2a 63 65 72 74 3b 0a 20 20    X509 *cert;.  
3a40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6d  const char *zRem
3a50: 6f 74 65 48 6f 73 74 3b 0a 0a 20 20 73 73 6c 5f  oteHost;..  ssl_
3a60: 67 6c 6f 62 61 6c 5f 69 6e 69 74 5f 63 6c 69 65  global_init_clie
3a70: 6e 74 28 29 3b 0a 20 20 69 66 28 20 70 55 72 6c  nt();.  if( pUrl
3a80: 44 61 74 61 2d 3e 75 73 65 50 72 6f 78 79 20 29  Data->useProxy )
3a90: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
3aa0: 20 20 63 68 61 72 20 2a 63 6f 6e 6e 53 74 72 20    char *connStr 
3ab0: 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 3a 25 64  = mprintf("%s:%d
3ac0: 22 2c 20 67 2e 75 72 6c 2e 6e 61 6d 65 2c 20 70  ", g.url.name, p
3ad0: 55 72 6c 44 61 74 61 2d 3e 70 6f 72 74 29 3b 0a  UrlData->port);.
3ae0: 20 20 20 20 42 49 4f 20 2a 73 42 69 6f 20 3d 20      BIO *sBio = 
3af0: 42 49 4f 5f 6e 65 77 5f 63 6f 6e 6e 65 63 74 28  BIO_new_connect(
3b00: 63 6f 6e 6e 53 74 72 29 3b 0a 20 20 20 20 66 72  connStr);.    fr
3b10: 65 65 28 63 6f 6e 6e 53 74 72 29 3b 0a 20 20 20  ee(connStr);.   
3b20: 20 69 66 28 20 42 49 4f 5f 64 6f 5f 63 6f 6e 6e   if( BIO_do_conn
3b30: 65 63 74 28 73 42 69 6f 29 3c 3d 30 20 29 7b 0a  ect(sBio)<=0 ){.
3b40: 20 20 20 20 20 20 73 73 6c 5f 73 65 74 5f 65 72        ssl_set_er
3b50: 72 6d 73 67 28 22 53 53 4c 3a 20 63 61 6e 6e 6f  rmsg("SSL: canno
3b60: 74 20 63 6f 6e 6e 65 63 74 20 74 6f 20 70 72 6f  t connect to pro
3b70: 78 79 20 25 73 3a 25 64 20 28 25 73 29 22 2c 0a  xy %s:%d (%s)",.
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 70 55 72 6c              pUrl
3b90: 44 61 74 61 2d 3e 6e 61 6d 65 2c 20 70 55 72 6c  Data->name, pUrl
3ba0: 44 61 74 61 2d 3e 70 6f 72 74 2c 0a 20 20 20 20  Data->port,.    
3bb0: 20 20 20 20 20 20 20 20 45 52 52 5f 72 65 61 73          ERR_reas
3bc0: 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  on_error_string(
3bd0: 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29  ERR_get_error())
3be0: 29 3b 0a 20 20 20 20 20 20 73 73 6c 5f 63 6c 6f  );.      ssl_clo
3bf0: 73 65 5f 63 6c 69 65 6e 74 28 29 3b 0a 20 20 20  se_client();.   
3c00: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3c10: 20 7d 0a 20 20 20 20 72 63 20 3d 20 65 73 74 61   }.    rc = esta
3c20: 62 6c 69 73 68 5f 70 72 6f 78 79 5f 74 75 6e 6e  blish_proxy_tunn
3c30: 65 6c 28 70 55 72 6c 44 61 74 61 2c 20 73 42 69  el(pUrlData, sBi
3c40: 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3c 32  o);.    if( rc<2
3c50: 30 30 7c 7c 72 63 3e 32 39 39 20 29 7b 0a 20 20  00||rc>299 ){.  
3c60: 20 20 20 20 73 73 6c 5f 73 65 74 5f 65 72 72 6d      ssl_set_errm
3c70: 73 67 28 22 53 53 4c 3a 20 70 72 6f 78 79 20 63  sg("SSL: proxy c
3c80: 6f 6e 6e 65 63 74 20 66 61 69 6c 65 64 20 77 69  onnect failed wi
3c90: 74 68 20 48 54 54 50 20 73 74 61 74 75 73 20 63  th HTTP status c
3ca0: 6f 64 65 20 25 64 22 2c 20 72 63 29 3b 0a 20 20  ode %d", rc);.  
3cb0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3cc0: 20 20 7d 0a 0a 20 20 20 20 70 55 72 6c 44 61 74    }..    pUrlDat
3cd0: 61 2d 3e 70 61 74 68 20 3d 20 70 55 72 6c 44 61  a->path = pUrlDa
3ce0: 74 61 2d 3e 70 72 6f 78 79 55 72 6c 50 61 74 68  ta->proxyUrlPath
3cf0: 3b 0a 0a 20 20 20 20 69 42 69 6f 20 3d 20 42 49  ;..    iBio = BI
3d00: 4f 5f 6e 65 77 5f 73 73 6c 28 73 73 6c 43 74 78  O_new_ssl(sslCtx
3d10: 2c 20 31 29 3b 0a 20 20 20 20 42 49 4f 5f 70 75  , 1);.    BIO_pu
3d20: 73 68 28 69 42 69 6f 2c 20 73 42 69 6f 29 3b 0a  sh(iBio, sBio);.
3d30: 20 20 20 20 7a 52 65 6d 6f 74 65 48 6f 73 74 20      zRemoteHost 
3d40: 3d 20 70 55 72 6c 44 61 74 61 2d 3e 68 6f 73 74  = pUrlData->host
3d50: 6e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  name;.  }else{. 
3d60: 20 20 20 69 42 69 6f 20 3d 20 42 49 4f 5f 6e 65     iBio = BIO_ne
3d70: 77 5f 73 73 6c 5f 63 6f 6e 6e 65 63 74 28 73 73  w_ssl_connect(ss
3d80: 6c 43 74 78 29 3b 0a 20 20 20 20 7a 52 65 6d 6f  lCtx);.    zRemo
3d90: 74 65 48 6f 73 74 20 3d 20 70 55 72 6c 44 61 74  teHost = pUrlDat
3da0: 61 2d 3e 6e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69  a->name;.  }.  i
3db0: 66 28 20 69 42 69 6f 3d 3d 4e 55 4c 4c 20 29 20  f( iBio==NULL ) 
3dc0: 7b 0a 20 20 20 20 73 73 6c 5f 73 65 74 5f 65 72  {.    ssl_set_er
3dd0: 72 6d 73 67 28 22 53 53 4c 3a 20 63 61 6e 6e 6f  rmsg("SSL: canno
3de0: 74 20 6f 70 65 6e 20 53 53 4c 20 28 25 73 29 22  t open SSL (%s)"
3df0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3e00: 20 20 20 20 20 20 45 52 52 5f 72 65 61 73 6f 6e        ERR_reason
3e10: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52  _error_string(ER
3e20: 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 29 3b  R_get_error()));
3e30: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
3e40: 20 7d 0a 20 20 42 49 4f 5f 67 65 74 5f 73 73 6c   }.  BIO_get_ssl
3e50: 28 69 42 69 6f 2c 20 26 73 73 6c 29 3b 0a 0a 23  (iBio, &ssl);..#
3e60: 69 66 20 28 53 53 4c 45 41 59 5f 56 45 52 53 49  if (SSLEAY_VERSI
3e70: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 30  ON_NUMBER >= 0x0
3e80: 30 39 30 38 30 37 30 29 20 26 26 20 21 64 65 66  0908070) && !def
3e90: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
3ea0: 54 4c 53 45 58 54 29 0a 20 20 69 66 28 20 21 53  TLSEXT).  if( !S
3eb0: 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f  SL_set_tlsext_ho
3ec0: 73 74 5f 6e 61 6d 65 28 73 73 6c 2c 20 7a 52 65  st_name(ssl, zRe
3ed0: 6d 6f 74 65 48 6f 73 74 29 29 7b 0a 20 20 20 20  moteHost)){.    
3ee0: 66 6f 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22  fossil_warning("
3ef0: 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
3f00: 74 6f 20 73 65 74 20 73 65 72 76 65 72 20 6e 61  to set server na
3f10: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53  me indication (S
3f20: 4e 49 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20  NI), ".         
3f30: 20 20 20 20 20 20 20 20 20 22 63 6f 6e 74 69 6e           "contin
3f40: 75 69 6e 67 20 77 69 74 68 6f 75 74 20 69 74 2e  uing without it.
3f50: 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  \n");.  }.#endif
3f60: 0a 0a 20 20 53 53 4c 5f 73 65 74 5f 6d 6f 64 65  ..  SSL_set_mode
3f70: 28 73 73 6c 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41  (ssl, SSL_MODE_A
3f80: 55 54 4f 5f 52 45 54 52 59 29 3b 0a 23 69 66 20  UTO_RETRY);.#if 
3f90: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
3fa0: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 30 31 30 30  NUMBER >= 0x0100
3fb0: 30 32 30 30 30 0a 20 20 69 66 28 20 21 73 73 6c  02000.  if( !ssl
3fc0: 4e 6f 43 65 72 74 56 65 72 69 66 79 20 29 7b 0a  NoCertVerify ){.
3fd0: 20 20 20 20 58 35 30 39 5f 56 45 52 49 46 59 5f      X509_VERIFY_
3fe0: 50 41 52 41 4d 20 2a 70 61 72 61 6d 20 3d 20 30  PARAM *param = 0
3ff0: 3b 0a 20 20 20 20 70 61 72 61 6d 20 3d 20 53 53  ;.    param = SS
4000: 4c 5f 67 65 74 30 5f 70 61 72 61 6d 28 73 73 6c  L_get0_param(ssl
4010: 29 3b 0a 20 20 20 20 69 66 28 20 21 58 35 30 39  );.    if( !X509
4020: 5f 56 45 52 49 46 59 5f 50 41 52 41 4d 5f 73 65  _VERIFY_PARAM_se
4030: 74 31 5f 68 6f 73 74 28 70 61 72 61 6d 2c 20 7a  t1_host(param, z
4040: 52 65 6d 6f 74 65 48 6f 73 74 2c 20 73 74 72 6c  RemoteHost, strl
4050: 65 6e 28 7a 52 65 6d 6f 74 65 48 6f 73 74 29 29  en(zRemoteHost))
4060: 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c   ){.      fossil
4070: 5f 66 61 74 61 6c 28 22 66 61 69 6c 65 64 20 74  _fatal("failed t
4080: 6f 20 73 65 74 20 68 6f 73 74 6e 61 6d 65 2e 22  o set hostname."
4090: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
40a0: 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73  SSL_set_verify(s
40b0: 73 6c 2c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50  sl, SSL_VERIFY_P
40c0: 45 45 52 2c 20 30 29 3b 20 2a 2f 0a 20 20 7d 0a  EER, 0); */.  }.
40d0: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 21 70  #endif..  if( !p
40e0: 55 72 6c 44 61 74 61 2d 3e 75 73 65 50 72 6f 78  UrlData->useProx
40f0: 79 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 63  y ){.    char *c
4100: 6f 6e 6e 53 74 72 20 3d 20 6d 70 72 69 6e 74 66  onnStr = mprintf
4110: 28 22 25 73 3a 25 64 22 2c 20 70 55 72 6c 44 61  ("%s:%d", pUrlDa
4120: 74 61 2d 3e 6e 61 6d 65 2c 20 70 55 72 6c 44 61  ta->name, pUrlDa
4130: 74 61 2d 3e 70 6f 72 74 29 3b 0a 20 20 20 20 42  ta->port);.    B
4140: 49 4f 5f 73 65 74 5f 63 6f 6e 6e 5f 68 6f 73 74  IO_set_conn_host
4150: 6e 61 6d 65 28 69 42 69 6f 2c 20 63 6f 6e 6e 53  name(iBio, connS
4160: 74 72 29 3b 0a 20 20 20 20 66 72 65 65 28 63 6f  tr);.    free(co
4170: 6e 6e 53 74 72 29 3b 0a 20 20 20 20 69 66 28 20  nnStr);.    if( 
4180: 42 49 4f 5f 64 6f 5f 63 6f 6e 6e 65 63 74 28 69  BIO_do_connect(i
4190: 42 69 6f 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20  Bio)<=0 ){.     
41a0: 20 73 73 6c 5f 73 65 74 5f 65 72 72 6d 73 67 28   ssl_set_errmsg(
41b0: 22 53 53 4c 3a 20 63 61 6e 6e 6f 74 20 63 6f 6e  "SSL: cannot con
41c0: 6e 65 63 74 20 74 6f 20 68 6f 73 74 20 25 73 3a  nect to host %s:
41d0: 25 64 20 28 25 73 29 22 2c 0a 20 20 20 20 20 20  %d (%s)",.      
41e0: 20 20 20 70 55 72 6c 44 61 74 61 2d 3e 6e 61 6d     pUrlData->nam
41f0: 65 2c 20 70 55 72 6c 44 61 74 61 2d 3e 70 6f 72  e, pUrlData->por
4200: 74 2c 0a 20 20 20 20 20 20 20 20 20 45 52 52 5f  t,.         ERR_
4210: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72  reason_error_str
4220: 69 6e 67 28 45 52 52 5f 67 65 74 5f 65 72 72 6f  ing(ERR_get_erro
4230: 72 28 29 29 29 3b 0a 20 20 20 20 20 20 73 73 6c  r()));.      ssl
4240: 5f 63 6c 6f 73 65 5f 63 6c 69 65 6e 74 28 29 3b  _close_client();
4250: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
4260: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
4270: 28 20 42 49 4f 5f 64 6f 5f 68 61 6e 64 73 68 61  ( BIO_do_handsha
4280: 6b 65 28 69 42 69 6f 29 3c 3d 30 20 29 20 7b 0a  ke(iBio)<=0 ) {.
4290: 20 20 20 20 73 73 6c 5f 73 65 74 5f 65 72 72 6d      ssl_set_errm
42a0: 73 67 28 22 45 72 72 6f 72 20 65 73 74 61 62 6c  sg("Error establ
42b0: 69 73 68 69 6e 67 20 53 53 4c 20 63 6f 6e 6e 65  ishing SSL conne
42c0: 63 74 69 6f 6e 20 25 73 3a 25 64 20 28 25 73 29  ction %s:%d (%s)
42d0: 22 2c 0a 20 20 20 20 20 20 20 20 70 55 72 6c 44  ",.        pUrlD
42e0: 61 74 61 2d 3e 75 73 65 50 72 6f 78 79 3f 70 55  ata->useProxy?pU
42f0: 72 6c 44 61 74 61 2d 3e 68 6f 73 74 6e 61 6d 65  rlData->hostname
4300: 3a 70 55 72 6c 44 61 74 61 2d 3e 6e 61 6d 65 2c  :pUrlData->name,
4310: 0a 20 20 20 20 20 20 20 20 70 55 72 6c 44 61 74  .        pUrlDat
4320: 61 2d 3e 75 73 65 50 72 6f 78 79 3f 70 55 72 6c  a->useProxy?pUrl
4330: 44 61 74 61 2d 3e 70 72 6f 78 79 4f 72 69 67 50  Data->proxyOrigP
4340: 6f 72 74 3a 70 55 72 6c 44 61 74 61 2d 3e 70 6f  ort:pUrlData->po
4350: 72 74 2c 0a 20 20 20 20 20 20 20 20 45 52 52 5f  rt,.        ERR_
4360: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72  reason_error_str
4370: 69 6e 67 28 45 52 52 5f 67 65 74 5f 65 72 72 6f  ing(ERR_get_erro
4380: 72 28 29 29 29 3b 0a 20 20 20 20 73 73 6c 5f 63  r()));.    ssl_c
4390: 6c 6f 73 65 5f 63 6c 69 65 6e 74 28 29 3b 0a 20  lose_client();. 
43a0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
43b0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 63  .  /* Check if c
43c0: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 76 61  ertificate is va
43d0: 6c 69 64 20 2a 2f 0a 20 20 63 65 72 74 20 3d 20  lid */.  cert = 
43e0: 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72  SSL_get_peer_cer
43f0: 74 69 66 69 63 61 74 65 28 73 73 6c 29 3b 0a 0a  tificate(ssl);..
4400: 20 20 69 66 20 28 20 63 65 72 74 3d 3d 4e 55 4c    if ( cert==NUL
4410: 4c 20 29 7b 0a 20 20 20 20 73 73 6c 5f 73 65 74  L ){.    ssl_set
4420: 5f 65 72 72 6d 73 67 28 22 4e 6f 20 53 53 4c 20  _errmsg("No SSL 
4430: 63 65 72 74 69 66 69 63 61 74 65 20 77 61 73 20  certificate was 
4440: 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 68 65  presented by the
4450: 20 70 65 65 72 22 29 3b 0a 20 20 20 20 73 73 6c   peer");.    ssl
4460: 5f 63 6c 6f 73 65 5f 63 6c 69 65 6e 74 28 29 3b  _close_client();
4470: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
4480: 20 7d 0a 0a 20 20 2f 2a 20 44 65 62 75 67 67 69   }..  /* Debuggi
4490: 6e 67 20 68 69 6e 74 3a 20 20 20 4f 6e 20 75 6e  ng hint:   On un
44a0: 69 78 2d 6c 69 6b 65 20 73 79 73 74 65 6d 2c 20  ix-like system, 
44b0: 72 75 6e 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69  run something li
44c0: 6b 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ke:.  **.  **   
44d0: 20 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 3d 2f    SSL_CERT_DIR=/
44e0: 74 6d 70 20 20 2e 2f 66 6f 73 73 69 6c 20 73 79  tmp  ./fossil sy
44f0: 6e 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 74 6f 20  nc.  **.  ** to 
4500: 63 61 75 73 65 20 63 65 72 74 69 66 69 63 61 74  cause certificat
4510: 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 74 6f 20  e validation to 
4520: 66 61 69 6c 2c 20 61 6e 64 20 74 68 75 73 20 74  fail, and thus t
4530: 65 73 74 20 74 68 65 20 66 61 6c 6c 62 61 63 6b  est the fallback
4540: 0a 20 20 2a 2a 20 6c 6f 67 69 63 2e 0a 20 20 2a  .  ** logic..  *
4550: 2f 0a 20 20 69 66 28 20 21 73 73 6c 4e 6f 43 65  /.  if( !sslNoCe
4560: 72 74 56 65 72 69 66 79 20 26 26 20 53 53 4c 5f  rtVerify && SSL_
4570: 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c  get_verify_resul
4580: 74 28 73 73 6c 29 21 3d 58 35 30 39 5f 56 5f 4f  t(ssl)!=X509_V_O
4590: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 2c 20  K ){.    int x, 
45a0: 64 65 73 63 6c 65 6e 3b 0a 20 20 20 20 63 68 61  desclen;.    cha
45b0: 72 20 2a 64 65 73 63 2c 20 2a 70 72 6f 6d 70 74  r *desc, *prompt
45c0: 3b 0a 20 20 20 20 42 6c 6f 62 20 61 6e 73 3b 0a  ;.    Blob ans;.
45d0: 20 20 20 20 63 68 61 72 20 63 52 65 70 6c 79 3b      char cReply;
45e0: 0a 20 20 20 20 42 49 4f 20 2a 6d 65 6d 3b 0a 20  .    BIO *mem;. 
45f0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
4600: 20 6d 64 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53   md[EVP_MAX_MD_S
4610: 49 5a 45 5d 3b 0a 20 20 20 20 63 68 61 72 20 7a  IZE];.    char z
4620: 48 61 73 68 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f  Hash[EVP_MAX_MD_
4630: 53 49 5a 45 2a 32 2b 31 5d 3b 0a 20 20 20 20 75  SIZE*2+1];.    u
4640: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 64 4c 65  nsigned int mdLe
4650: 6e 67 74 68 20 3d 20 28 69 6e 74 29 73 69 7a 65  ngth = (int)size
4660: 6f 66 28 6d 64 29 3b 0a 0a 20 20 20 20 6d 65 6d  of(md);..    mem
4670: 73 65 74 28 6d 64 2c 20 30 2c 20 73 69 7a 65 6f  set(md, 0, sizeo
4680: 66 28 6d 64 29 29 3b 0a 20 20 20 20 7a 48 61 73  f(md));.    zHas
4690: 68 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  h[0] = 0;.      
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46b0: 20 20 20 20 20 20 2f 2a 20 20 4d 4d 4e 4e 46 46        /*  MMNNFF
46c0: 50 50 53 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53  PPS */.#if OPENS
46d0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
46e0: 52 20 3e 3d 20 30 78 30 31 30 30 30 30 30 30 30  R >= 0x010000000
46f0: 0a 20 20 20 20 78 20 3d 20 58 35 30 39 5f 64 69  .    x = X509_di
4700: 67 65 73 74 28 63 65 72 74 2c 20 45 56 50 5f 73  gest(cert, EVP_s
4710: 68 61 32 35 36 28 29 2c 20 6d 64 2c 20 26 6d 64  ha256(), md, &md
4720: 4c 65 6e 67 74 68 29 3b 0a 23 65 6c 73 65 0a 20  Length);.#else. 
4730: 20 20 20 78 20 3d 20 58 35 30 39 5f 64 69 67 65     x = X509_dige
4740: 73 74 28 63 65 72 74 2c 20 45 56 50 5f 73 68 61  st(cert, EVP_sha
4750: 31 28 29 2c 20 6d 64 2c 20 26 6d 64 4c 65 6e 67  1(), md, &mdLeng
4760: 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  th);.#endif.    
4770: 69 66 28 20 78 20 29 7b 0a 20 20 20 20 20 20 75  if( x ){.      u
4780: 6e 73 69 67 6e 65 64 20 6a 3b 0a 20 20 20 20 20  nsigned j;.     
4790: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6d 64 4c 65   for(j=0; j<mdLe
47a0: 6e 67 74 68 20 26 26 20 6a 2a 32 2b 31 3c 73 69  ngth && j*2+1<si
47b0: 7a 65 6f 66 28 7a 48 61 73 68 29 3b 20 2b 2b 6a  zeof(zHash); ++j
47c0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 48 61 73 68  ){.        zHash
47d0: 5b 6a 2a 32 5d 20 3d 20 22 30 31 32 33 34 35 36  [j*2] = "0123456
47e0: 37 38 39 61 62 63 64 65 66 22 5b 6d 64 5b 6a 5d  789abcdef"[md[j]
47f0: 3e 3e 34 5d 3b 0a 20 20 20 20 20 20 20 20 7a 48  >>4];.        zH
4800: 61 73 68 5b 6a 2a 32 2b 31 5d 20 3d 20 22 30 31  ash[j*2+1] = "01
4810: 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22 5b  23456789abcdef"[
4820: 6d 64 5b 6a 5d 26 30 78 66 5d 3b 0a 20 20 20 20  md[j]&0xf];.    
4830: 20 20 7d 0a 20 20 20 20 20 20 7a 48 61 73 68 5b    }.      zHash[
4840: 6a 2a 32 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  j*2] = 0;.    }.
4850: 0a 20 20 20 20 69 66 28 20 73 73 6c 5f 63 65 72  .    if( ssl_cer
4860: 74 69 66 69 63 61 74 65 5f 65 78 63 65 70 74 69  tificate_excepti
4870: 6f 6e 5f 65 78 69 73 74 73 28 70 55 72 6c 44 61  on_exists(pUrlDa
4880: 74 61 2c 20 7a 48 61 73 68 29 20 29 7b 0a 20 20  ta, zHash) ){.  
4890: 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68      /* Ignore th
48a0: 65 20 66 61 69 6c 75 72 65 20 62 65 63 61 75 73  e failure becaus
48b0: 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 65  e an exception e
48c0: 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 73  xists */.      s
48d0: 73 6c 5f 6f 6e 65 5f 74 69 6d 65 5f 65 78 63 65  sl_one_time_exce
48e0: 70 74 69 6f 6e 28 70 55 72 6c 44 61 74 61 2c 20  ption(pUrlData, 
48f0: 7a 48 61 73 68 29 3b 0a 20 20 20 20 7d 65 6c 73  zHash);.    }els
4900: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 65 6c 6c  e{.      /* Tell
4910: 20 74 68 65 20 75 73 65 72 20 61 62 6f 75 74 20   the user about 
4920: 74 68 65 20 66 61 69 6c 75 72 65 20 61 6e 64 20  the failure and 
4930: 61 73 6b 20 77 68 61 74 20 74 6f 20 64 6f 20 2a  ask what to do *
4940: 2f 0a 20 20 20 20 20 20 6d 65 6d 20 3d 20 42 49  /.      mem = BI
4950: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
4960: 29 29 3b 0a 20 20 20 20 20 20 42 49 4f 5f 70 75  ));.      BIO_pu
4970: 74 73 28 6d 65 6d 2c 20 20 20 20 20 22 20 20 73  ts(mem,     "  s
4980: 75 62 6a 65 63 74 3a 20 20 20 22 29 3b 0a 20 20  ubject:   ");.  
4990: 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 5f 70 72      X509_NAME_pr
49a0: 69 6e 74 5f 65 78 28 6d 65 6d 2c 20 58 35 30 39  int_ex(mem, X509
49b0: 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d  _get_subject_nam
49c0: 65 28 63 65 72 74 29 2c 20 30 2c 20 58 4e 5f 46  e(cert), 0, XN_F
49d0: 4c 41 47 5f 4f 4e 45 4c 49 4e 45 29 3b 0a 20 20  LAG_ONELINE);.  
49e0: 20 20 20 20 42 49 4f 5f 70 75 74 73 28 6d 65 6d      BIO_puts(mem
49f0: 2c 20 20 20 22 5c 6e 20 20 69 73 73 75 65 72 3a  ,   "\n  issuer:
4a00: 20 20 20 20 22 29 3b 0a 20 20 20 20 20 20 58 35      ");.      X5
4a10: 30 39 5f 4e 41 4d 45 5f 70 72 69 6e 74 5f 65 78  09_NAME_print_ex
4a20: 28 6d 65 6d 2c 20 58 35 30 39 5f 67 65 74 5f 69  (mem, X509_get_i
4a30: 73 73 75 65 72 5f 6e 61 6d 65 28 63 65 72 74 29  ssuer_name(cert)
4a40: 2c 20 30 2c 20 58 4e 5f 46 4c 41 47 5f 4f 4e 45  , 0, XN_FLAG_ONE
4a50: 4c 49 4e 45 29 3b 0a 20 20 20 20 20 20 42 49 4f  LINE);.      BIO
4a60: 5f 70 72 69 6e 74 66 28 6d 65 6d 2c 20 22 5c 6e  _printf(mem, "\n
4a70: 20 20 6e 6f 74 42 65 66 6f 72 65 3a 20 25 73 22    notBefore: %s"
4a80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4a90: 20 20 20 73 73 6c 5f 61 73 6e 31 74 69 6d 65 5f     ssl_asn1time_
4aa0: 74 6f 5f 69 73 6f 38 36 30 31 28 58 35 30 39 5f  to_iso8601(X509_
4ab0: 67 65 74 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65  get_notBefore(ce
4ac0: 72 74 29 2c 20 31 29 29 3b 0a 20 20 20 20 20 20  rt), 1));.      
4ad0: 42 49 4f 5f 70 72 69 6e 74 66 28 6d 65 6d 2c 20  BIO_printf(mem, 
4ae0: 22 5c 6e 20 20 6e 6f 74 41 66 74 65 72 3a 20 20  "\n  notAfter:  
4af0: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
4b00: 20 20 20 20 20 20 73 73 6c 5f 61 73 6e 31 74 69        ssl_asn1ti
4b10: 6d 65 5f 74 6f 5f 69 73 6f 38 36 30 31 28 58 35  me_to_iso8601(X5
4b20: 30 39 5f 67 65 74 5f 6e 6f 74 41 66 74 65 72 28  09_get_notAfter(
4b30: 63 65 72 74 29 2c 20 31 29 29 3b 0a 20 20 20 20  cert), 1));.    
4b40: 20 20 42 49 4f 5f 70 72 69 6e 74 66 28 6d 65 6d    BIO_printf(mem
4b50: 2c 20 22 5c 6e 20 20 73 68 61 32 35 36 3a 20 20  , "\n  sha256:  
4b60: 20 20 25 73 22 2c 20 7a 48 61 73 68 29 3b 0a 20    %s", zHash);. 
4b70: 20 20 20 20 20 64 65 73 63 6c 65 6e 20 3d 20 42       desclen = B
4b80: 49 4f 5f 67 65 74 5f 6d 65 6d 5f 64 61 74 61 28  IO_get_mem_data(
4b90: 6d 65 6d 2c 20 26 64 65 73 63 29 3b 0a 0a 20 20  mem, &desc);..  
4ba0: 20 20 20 20 70 72 6f 6d 70 74 20 3d 20 6d 70 72      prompt = mpr
4bb0: 69 6e 74 66 28 22 55 6e 61 62 6c 65 20 74 6f 20  intf("Unable to 
4bc0: 76 65 72 69 66 79 20 53 53 4c 20 63 65 72 74 20  verify SSL cert 
4bd0: 66 72 6f 6d 20 25 73 5c 6e 25 2e 2a 73 5c 6e 22  from %s\n%.*s\n"
4be0: 0a 20 20 20 20 20 20 20 20 20 20 22 61 63 63 65  .          "acce
4bf0: 70 74 20 74 68 69 73 20 63 65 72 74 20 61 6e 64  pt this cert and
4c00: 20 63 6f 6e 74 69 6e 75 65 20 28 79 2f 4e 2f 66   continue (y/N/f
4c10: 69 6e 67 65 72 70 72 69 6e 74 29 3f 20 22 2c 0a  ingerprint)? ",.
4c20: 20 20 20 20 20 20 20 20 20 20 70 55 72 6c 44 61            pUrlDa
4c30: 74 61 2d 3e 6e 61 6d 65 2c 20 64 65 73 63 6c 65  ta->name, descle
4c40: 6e 2c 20 64 65 73 63 29 3b 0a 20 20 20 20 20 20  n, desc);.      
4c50: 42 49 4f 5f 66 72 65 65 28 6d 65 6d 29 3b 0a 0a  BIO_free(mem);..
4c60: 20 20 20 20 20 20 70 72 6f 6d 70 74 5f 75 73 65        prompt_use
4c70: 72 28 70 72 6f 6d 70 74 2c 20 26 61 6e 73 29 3b  r(prompt, &ans);
4c80: 0a 20 20 20 20 20 20 66 72 65 65 28 70 72 6f 6d  .      free(prom
4c90: 70 74 29 3b 0a 20 20 20 20 20 20 63 52 65 70 6c  pt);.      cRepl
4ca0: 79 20 3d 20 62 6c 6f 62 5f 73 74 72 28 26 61 6e  y = blob_str(&an
4cb0: 73 29 5b 30 5d 3b 0a 20 20 20 20 20 20 69 66 28  s)[0];.      if(
4cc0: 20 63 52 65 70 6c 79 21 3d 27 79 27 20 26 26 20   cReply!='y' && 
4cd0: 63 52 65 70 6c 79 21 3d 27 59 27 0a 20 20 20 20  cReply!='Y'.    
4ce0: 20 20 20 26 26 20 66 6f 73 73 69 6c 5f 73 74 72     && fossil_str
4cf0: 69 63 6d 70 28 62 6c 6f 62 5f 73 74 72 28 26 61  icmp(blob_str(&a
4d00: 6e 73 29 2c 7a 48 61 73 68 29 21 3d 30 0a 20 20  ns),zHash)!=0.  
4d10: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 58      ){.        X
4d20: 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a  509_free(cert);.
4d30: 20 20 20 20 20 20 20 20 73 73 6c 5f 73 65 74 5f          ssl_set_
4d40: 65 72 72 6d 73 67 28 22 53 53 4c 20 63 65 72 74  errmsg("SSL cert
4d50: 20 64 65 63 6c 69 6e 65 64 22 29 3b 0a 20 20 20   declined");.   
4d60: 20 20 20 20 20 73 73 6c 5f 63 6c 6f 73 65 5f 63       ssl_close_c
4d70: 6c 69 65 6e 74 28 29 3b 0a 20 20 20 20 20 20 20  lient();.       
4d80: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 61 6e 73   blob_reset(&ans
4d90: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
4da0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
4db0: 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 61     blob_reset(&a
4dc0: 6e 73 29 3b 0a 20 20 20 20 20 20 73 73 6c 5f 6f  ns);.      ssl_o
4dd0: 6e 65 5f 74 69 6d 65 5f 65 78 63 65 70 74 69 6f  ne_time_exceptio
4de0: 6e 28 70 55 72 6c 44 61 74 61 2c 20 7a 48 61 73  n(pUrlData, zHas
4df0: 68 29 3b 0a 20 20 20 20 20 20 70 72 6f 6d 70 74  h);.      prompt
4e00: 5f 75 73 65 72 28 22 72 65 6d 65 6d 62 65 72 20  _user("remember 
4e10: 74 68 69 73 20 65 78 63 65 70 74 69 6f 6e 20 28  this exception (
4e20: 79 2f 4e 29 3f 20 22 2c 20 26 61 6e 73 29 3b 0a  y/N)? ", &ans);.
4e30: 20 20 20 20 20 20 63 52 65 70 6c 79 20 3d 20 62        cReply = b
4e40: 6c 6f 62 5f 73 74 72 28 26 61 6e 73 29 5b 30 5d  lob_str(&ans)[0]
4e50: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 52 65 70  ;.      if( cRep
4e60: 6c 79 3d 3d 27 79 27 20 7c 7c 20 63 52 65 70 6c  ly=='y' || cRepl
4e70: 79 3d 3d 27 59 27 29 20 7b 0a 20 20 20 20 20 20  y=='Y') {.      
4e80: 20 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e 66 69 67    db_open_config
4e90: 28 30 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 73  (0,0);.        s
4ea0: 73 6c 5f 72 65 6d 65 6d 62 65 72 5f 63 65 72 74  sl_remember_cert
4eb0: 69 66 69 63 61 74 65 5f 65 78 63 65 70 74 69 6f  ificate_exceptio
4ec0: 6e 28 70 55 72 6c 44 61 74 61 2c 20 7a 48 61 73  n(pUrlData, zHas
4ed0: 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
4ee0: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 61 6e    blob_reset(&an
4ef0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  s);.    }.  }.. 
4f00: 20 2f 2a 20 53 65 74 20 74 68 65 20 47 6c 6f 62   /* Set the Glob
4f10: 61 6c 2e 7a 49 70 41 64 64 72 20 76 61 72 69 61  al.zIpAddr varia
4f20: 62 6c 65 20 74 6f 20 74 68 65 20 73 65 72 76 65  ble to the serve
4f30: 72 20 77 65 20 61 72 65 20 74 61 6c 6b 69 6e 67  r we are talking
4f40: 20 74 6f 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69   to..  ** This i
4f50: 73 20 75 73 65 64 20 74 6f 20 70 6f 70 75 6c 61  s used to popula
4f60: 74 65 20 74 68 65 20 69 70 61 64 64 72 20 63 6f  te the ipaddr co
4f70: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 63 76 66  lumn of the rcvf
4f80: 72 6f 6d 20 74 61 62 6c 65 2c 0a 20 20 2a 2a 20  rom table,.  ** 
4f90: 69 66 20 61 6e 79 20 66 69 6c 65 73 20 61 72 65  if any files are
4fa0: 20 72 65 63 65 69 76 65 64 20 66 72 6f 6d 20 74   received from t
4fb0: 68 65 20 73 65 72 76 65 72 2e 0a 20 20 2a 2f 0a  he server..  */.
4fc0: 20 20 7b 0a 20 20 2f 2a 20 41 73 20 73 6f 6f 6e    {.  /* As soon
4fd0: 20 61 73 20 6c 69 62 72 65 73 73 6c 20 69 6d 70   as libressl imp
4fe0: 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 42 49 4f  lements.  ** BIO
4ff0: 5f 41 44 44 52 5f 68 6f 73 74 6e 61 6d 65 5f 73  _ADDR_hostname_s
5000: 74 72 69 6e 67 2f 42 49 4f 5f 67 65 74 5f 63 6f  tring/BIO_get_co
5010: 6e 6e 5f 61 64 64 72 65 73 73 2e 0a 20 20 2a 2a  nn_address..  **
5020: 20 63 68 65 63 6b 20 68 65 72 65 20 66 6f 72 20   check here for 
5030: 74 68 65 20 63 6f 72 72 65 63 74 20 4c 49 42 52  the correct LIBR
5040: 45 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  ESSL_VERSION_NUM
5050: 42 45 52 20 74 6f 6f 2e 20 46 6f 72 20 6e 6f 77  BER too. For now
5060: 3a 20 64 69 73 61 62 6c 65 0a 20 20 2a 2f 0a 23  : disable.  */.#
5070: 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
5080: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
5090: 52 29 20 26 26 20 4f 50 45 4e 53 53 4c 5f 56 45  R) && OPENSSL_VE
50a0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20  RSION_NUMBER >= 
50b0: 30 78 31 30 31 30 30 30 30 30 4c 20 5c 0a 20 20  0x10100000L \.  
50c0: 20 20 20 20 26 26 20 21 64 65 66 69 6e 65 64 28      && !defined(
50d0: 4c 49 42 52 45 53 53 4c 5f 56 45 52 53 49 4f 4e  LIBRESSL_VERSION
50e0: 5f 4e 55 4d 42 45 52 29 0a 20 20 20 20 63 68 61  _NUMBER).    cha
50f0: 72 20 2a 69 70 20 3d 20 42 49 4f 5f 41 44 44 52  r *ip = BIO_ADDR
5100: 5f 68 6f 73 74 6e 61 6d 65 5f 73 74 72 69 6e 67  _hostname_string
5110: 28 42 49 4f 5f 67 65 74 5f 63 6f 6e 6e 5f 61 64  (BIO_get_conn_ad
5120: 64 72 65 73 73 28 69 42 69 6f 29 2c 31 29 3b 0a  dress(iBio),1);.
5130: 20 20 20 20 67 2e 7a 49 70 41 64 64 72 20 3d 20      g.zIpAddr = 
5140: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 69 70  mprintf("%s", ip
5150: 29 3b 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 66  );.    OPENSSL_f
5160: 72 65 65 28 69 70 29 3b 0a 23 65 6c 73 65 0a 20  ree(ip);.#else. 
5170: 20 20 20 2f 2a 20 49 50 76 34 20 6f 6e 6c 79 20     /* IPv4 only 
5180: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  code */.    cons
5190: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
51a0: 2a 69 70 3b 0a 20 20 20 20 69 70 20 3d 20 28 63  *ip;.    ip = (c
51b0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
51c0: 61 72 2a 29 42 49 4f 5f 70 74 72 5f 63 74 72 6c  ar*)BIO_ptr_ctrl
51d0: 28 69 42 69 6f 2c 42 49 4f 5f 43 5f 47 45 54 5f  (iBio,BIO_C_GET_
51e0: 43 4f 4e 4e 45 43 54 2c 32 29 3b 0a 20 20 20 20  CONNECT,2);.    
51f0: 67 2e 7a 49 70 41 64 64 72 20 3d 20 6d 70 72 69  g.zIpAddr = mpri
5200: 6e 74 66 28 22 25 64 2e 25 64 2e 25 64 2e 25 64  ntf("%d.%d.%d.%d
5210: 22 2c 20 69 70 5b 30 5d 2c 20 69 70 5b 31 5d 2c  ", ip[0], ip[1],
5220: 20 69 70 5b 32 5d 2c 20 69 70 5b 33 5d 29 3b 0a   ip[2], ip[3]);.
5230: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 58 35  #endif.  }..  X5
5240: 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 20  09_free(cert);. 
5250: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5260: 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61  .** Remember tha
5270: 74 20 74 68 65 20 63 65 72 74 20 77 69 74 68 20  t the cert with 
5280: 74 68 65 20 67 69 76 65 6e 20 68 61 73 68 20 69  the given hash i
5290: 73 20 61 63 63 65 70 74 61 62 6c 65 20 66 6f 72  s acceptable for
52a0: 0a 2a 2a 20 75 73 65 20 77 69 74 68 20 70 55 72  .** use with pUr
52b0: 6c 44 61 74 61 2d 3e 6e 61 6d 65 2e 0a 2a 2f 0a  lData->name..*/.
52c0: 4c 4f 43 41 4c 20 76 6f 69 64 20 73 73 6c 5f 72  LOCAL void ssl_r
52d0: 65 6d 65 6d 62 65 72 5f 63 65 72 74 69 66 69 63  emember_certific
52e0: 61 74 65 5f 65 78 63 65 70 74 69 6f 6e 28 0a 20  ate_exception(. 
52f0: 20 55 72 6c 44 61 74 61 20 2a 70 55 72 6c 44 61   UrlData *pUrlDa
5300: 74 61 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ta,.  const char
5310: 20 2a 7a 48 61 73 68 0a 29 7b 0a 20 20 64 62 5f   *zHash.){.  db_
5320: 73 65 74 5f 6d 70 72 69 6e 74 66 28 7a 48 61 73  set_mprintf(zHas
5330: 68 2c 20 31 2c 20 22 63 65 72 74 3a 25 73 22 2c  h, 1, "cert:%s",
5340: 20 70 55 72 6c 44 61 74 61 2d 3e 6e 61 6d 65 29   pUrlData->name)
5350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5360: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 74 68  n true if the th
5370: 65 72 65 20 65 78 69 73 74 73 20 61 20 63 65 72  ere exists a cer
5380: 74 69 66 69 63 61 74 65 20 65 78 63 65 70 74 69  tificate excepti
5390: 6f 6e 20 66 6f 72 0a 2a 2a 20 70 55 72 6c 44 61  on for.** pUrlDa
53a0: 74 61 2d 3e 6e 61 6d 65 20 74 68 61 74 20 6d 61  ta->name that ma
53b0: 74 63 68 65 73 20 74 68 65 20 68 61 73 68 2e 0a  tches the hash..
53c0: 2a 2f 0a 4c 4f 43 41 4c 20 69 6e 74 20 73 73 6c  */.LOCAL int ssl
53d0: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 65 78 63  _certificate_exc
53e0: 65 70 74 69 6f 6e 5f 65 78 69 73 74 73 28 0a 20  eption_exists(. 
53f0: 20 55 72 6c 44 61 74 61 20 2a 70 55 72 6c 44 61   UrlData *pUrlDa
5400: 74 61 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ta,.  const char
5410: 20 2a 7a 48 61 73 68 0a 29 7b 0a 20 20 63 68 61   *zHash.){.  cha
5420: 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 56 61 6c 75  r *zName, *zValu
5430: 65 3b 0a 20 20 69 66 28 20 66 6f 73 73 69 6c 5f  e;.  if( fossil_
5440: 73 74 72 63 6d 70 28 73 45 78 63 65 70 74 69 6f  strcmp(sExceptio
5450: 6e 2e 7a 48 6f 73 74 2c 70 55 72 6c 44 61 74 61  n.zHost,pUrlData
5460: 2d 3e 6e 61 6d 65 29 3d 3d 30 0a 20 20 20 26 26  ->name)==0.   &&
5470: 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 73   fossil_strcmp(s
5480: 45 78 63 65 70 74 69 6f 6e 2e 7a 48 61 73 68 2c  Exception.zHash,
5490: 7a 48 61 73 68 29 3d 3d 30 0a 20 20 29 7b 0a 20  zHash)==0.  ){. 
54a0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
54b0: 0a 20 20 7a 4e 61 6d 65 20 3d 20 6d 70 72 69 6e  .  zName = mprin
54c0: 74 66 28 22 63 65 72 74 3a 25 73 22 2c 20 70 55  tf("cert:%s", pU
54d0: 72 6c 44 61 74 61 2d 3e 6e 61 6d 65 29 3b 0a 20  rlData->name);. 
54e0: 20 7a 56 61 6c 75 65 20 3d 20 64 62 5f 67 65 74   zValue = db_get
54f0: 28 7a 4e 61 6d 65 2c 30 29 3b 0a 20 20 66 6f 73  (zName,0);.  fos
5500: 73 69 6c 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b  sil_free(zName);
5510: 0a 20 20 72 65 74 75 72 6e 20 7a 56 61 6c 75 65  .  return zValue
5520: 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 48  !=0 && strcmp(zH
5530: 61 73 68 2c 7a 56 61 6c 75 65 29 3d 3d 30 3b 0a  ash,zValue)==0;.
5540: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
5550: 72 20 7a 48 61 73 68 20 61 73 20 61 6e 20 61 63  r zHash as an ac
5560: 63 65 70 74 61 62 6c 65 20 63 65 72 74 69 66 69  ceptable certifi
5570: 63 61 74 65 20 66 6f 72 20 74 68 69 73 20 73 65  cate for this se
5580: 73 73 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a 4c  ssion only..*/.L
5590: 4f 43 41 4c 20 76 6f 69 64 20 73 73 6c 5f 6f 6e  OCAL void ssl_on
55a0: 65 5f 74 69 6d 65 5f 65 78 63 65 70 74 69 6f 6e  e_time_exception
55b0: 28 0a 20 20 55 72 6c 44 61 74 61 20 2a 70 55 72  (.  UrlData *pUr
55c0: 6c 44 61 74 61 2c 0a 20 20 63 6f 6e 73 74 20 63  lData,.  const c
55d0: 68 61 72 20 2a 7a 48 61 73 68 0a 29 7b 0a 20 20  har *zHash.){.  
55e0: 66 6f 73 73 69 6c 5f 66 72 65 65 28 73 45 78 63  fossil_free(sExc
55f0: 65 70 74 69 6f 6e 2e 7a 48 6f 73 74 29 3b 0a 20  eption.zHost);. 
5600: 20 73 45 78 63 65 70 74 69 6f 6e 2e 7a 48 6f 73   sException.zHos
5610: 74 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 64 75  t = fossil_strdu
5620: 70 28 70 55 72 6c 44 61 74 61 2d 3e 6e 61 6d 65  p(pUrlData->name
5630: 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65  );.  fossil_free
5640: 28 73 45 78 63 65 70 74 69 6f 6e 2e 7a 48 61 73  (sException.zHas
5650: 68 29 3b 0a 20 20 73 45 78 63 65 70 74 69 6f 6e  h);.  sException
5660: 2e 7a 48 61 73 68 20 3d 20 66 6f 73 73 69 6c 5f  .zHash = fossil_
5670: 73 74 72 64 75 70 28 7a 48 61 73 68 29 3b 0a 7d  strdup(zHash);.}
5680: 0a 0a 2f 2a 0a 2a 2a 20 53 65 6e 64 20 63 6f 6e  ../*.** Send con
5690: 74 65 6e 74 20 6f 75 74 20 6f 76 65 72 20 74 68  tent out over th
56a0: 65 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  e SSL connection
56b0: 20 66 72 6f 6d 20 74 68 65 20 63 6c 69 65 6e 74   from the client
56c0: 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 72 76 65   to.** the serve
56d0: 72 2e 0a 2a 2f 0a 73 69 7a 65 5f 74 20 73 73 6c  r..*/.size_t ssl
56e0: 5f 73 65 6e 64 28 76 6f 69 64 20 2a 4e 6f 74 55  _send(void *NotU
56f0: 73 65 64 2c 20 76 6f 69 64 20 2a 70 43 6f 6e 74  sed, void *pCont
5700: 65 6e 74 2c 20 73 69 7a 65 5f 74 20 4e 29 7b 0a  ent, size_t N){.
5710: 20 20 73 69 7a 65 5f 74 20 74 6f 74 61 6c 20 3d    size_t total =
5720: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 30   0;.  while( N>0
5730: 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 6e 74   ){.    int sent
5740: 20 3d 20 42 49 4f 5f 77 72 69 74 65 28 69 42 69   = BIO_write(iBi
5750: 6f 2c 20 70 43 6f 6e 74 65 6e 74 2c 20 4e 29 3b  o, pContent, N);
5760: 0a 20 20 20 20 69 66 28 20 73 65 6e 74 3c 3d 30  .    if( sent<=0
5770: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 42 49   ){.      if( BI
5780: 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 69  O_should_retry(i
5790: 42 69 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Bio) ){.        
57a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
57b0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
57c0: 20 20 20 7d 0a 20 20 20 20 74 6f 74 61 6c 20 2b     }.    total +
57d0: 3d 20 73 65 6e 74 3b 0a 20 20 20 20 4e 20 2d 3d  = sent;.    N -=
57e0: 20 73 65 6e 74 3b 0a 20 20 20 20 70 43 6f 6e 74   sent;.    pCont
57f0: 65 6e 74 20 3d 20 28 76 6f 69 64 2a 29 26 28 28  ent = (void*)&((
5800: 63 68 61 72 2a 29 70 43 6f 6e 74 65 6e 74 29 5b  char*)pContent)[
5810: 73 65 6e 74 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  sent];.  }.  ret
5820: 75 72 6e 20 74 6f 74 61 6c 3b 0a 7d 0a 0a 2f 2a  urn total;.}../*
5830: 0a 2a 2a 20 52 65 63 65 69 76 65 20 63 6f 6e 74  .** Receive cont
5840: 65 6e 74 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  ent back from th
5850: 65 20 63 6c 69 65 6e 74 20 53 53 4c 20 63 6f 6e  e client SSL con
5860: 6e 65 63 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68  nection.  In oth
5870: 65 72 0a 2a 2a 20 77 6f 72 64 73 20 72 65 61 64  er.** words read
5880: 20 74 68 65 20 72 65 70 6c 79 20 62 61 63 6b 20   the reply back 
5890: 66 72 6f 6d 20 74 68 65 20 73 65 72 76 65 72 2e  from the server.
58a0: 0a 2a 2f 0a 73 69 7a 65 5f 74 20 73 73 6c 5f 72  .*/.size_t ssl_r
58b0: 65 63 65 69 76 65 28 76 6f 69 64 20 2a 4e 6f 74  eceive(void *Not
58c0: 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 43 6f 6e  Used, void *pCon
58d0: 74 65 6e 74 2c 20 73 69 7a 65 5f 74 20 4e 29 7b  tent, size_t N){
58e0: 0a 20 20 73 69 7a 65 5f 74 20 74 6f 74 61 6c 20  .  size_t total 
58f0: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e  = 0;.  while( N>
5900: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 67 6f 74  0 ){.    int got
5910: 20 3d 20 42 49 4f 5f 72 65 61 64 28 69 42 69 6f   = BIO_read(iBio
5920: 2c 20 70 43 6f 6e 74 65 6e 74 2c 20 4e 29 3b 0a  , pContent, N);.
5930: 20 20 20 20 69 66 28 20 67 6f 74 3c 3d 30 20 29      if( got<=0 )
5940: 7b 0a 20 20 20 20 20 20 69 66 28 20 42 49 4f 5f  {.      if( BIO_
5950: 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 69 42 69  should_retry(iBi
5960: 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  o) ){.        co
5970: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
5980: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5990: 20 7d 0a 20 20 20 20 74 6f 74 61 6c 20 2b 3d 20   }.    total += 
59a0: 67 6f 74 3b 0a 20 20 20 20 4e 20 2d 3d 20 67 6f  got;.    N -= go
59b0: 74 3b 0a 20 20 20 20 70 43 6f 6e 74 65 6e 74 20  t;.    pContent 
59c0: 3d 20 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72  = (void*)&((char
59d0: 2a 29 70 43 6f 6e 74 65 6e 74 29 5b 67 6f 74 5d  *)pContent)[got]
59e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74  ;.  }.  return t
59f0: 6f 74 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  otal;.}../*.** I
5a00: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 53 53  nitialize the SS
5a10: 4c 20 6c 69 62 72 61 72 79 20 73 6f 20 74 68 61  L library so tha
5a20: 74 20 69 74 20 69 73 20 61 62 6c 65 20 74 6f 20  t it is able to 
5a30: 68 61 6e 64 6c 65 0a 2a 2a 20 73 65 72 76 65 72  handle.** server
5a40: 2d 73 69 64 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  -side connection
5a50: 73 2e 20 20 49 6e 76 6f 6b 65 20 66 6f 73 73 69  s.  Invoke fossi
5a60: 6c 5f 66 61 74 61 6c 28 29 20 69 66 20 74 68 65  l_fatal() if the
5a70: 72 65 20 61 72 65 0a 2a 2a 20 61 6e 79 20 70 72  re are.** any pr
5a80: 6f 62 6c 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  oblems..**.** If
5a90: 20 7a 4b 65 79 46 69 6c 65 20 61 6e 64 20 7a 43   zKeyFile and zC
5aa0: 65 72 74 46 69 6c 65 20 61 72 65 20 6e 6f 74 20  ertFile are not 
5ab0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 79 20  NULL, then they 
5ac0: 61 72 65 20 74 68 65 20 6e 61 6d 65 73 0a 2a 2a  are the names.**
5ad0: 20 6f 66 20 64 69 73 6b 20 66 69 6c 65 73 20 74   of disk files t
5ae0: 68 61 74 20 68 6f 6c 64 20 74 68 65 20 63 65 72  hat hold the cer
5af0: 74 69 66 69 63 61 74 65 20 61 6e 64 20 70 72 69  tificate and pri
5b00: 76 61 74 65 2d 6b 65 79 20 66 6f 72 20 74 68 65  vate-key for the
5b10: 0a 2a 2a 20 73 65 72 76 65 72 2e 20 20 49 66 20  .** server.  If 
5b20: 7a 43 65 72 74 46 69 6c 65 20 69 73 20 6e 6f 74  zCertFile is not
5b30: 20 4e 55 4c 4c 20 62 75 74 20 7a 4b 65 79 46 69   NULL but zKeyFi
5b40: 6c 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  le is NULL, then
5b50: 0a 2a 2a 20 7a 43 65 72 74 46 69 6c 65 20 69 73  .** zCertFile is
5b60: 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 61   assumed to be a
5b70: 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f   concatenation o
5b80: 66 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  f the certificat
5b90: 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 72 69  e and.** the pri
5ba0: 76 61 74 65 2d 6b 65 79 20 69 6e 20 74 68 65 20  vate-key in the 
5bb0: 50 45 4d 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  PEM format..**.*
5bc0: 2a 20 49 66 20 7a 43 65 72 74 46 69 6c 65 20 69  * If zCertFile i
5bd0: 73 20 22 75 6e 73 61 66 65 2d 62 75 69 6c 74 69  s "unsafe-builti
5be0: 6e 22 2c 20 74 68 65 6e 20 61 20 62 75 69 6c 74  n", then a built
5bf0: 2d 69 6e 20 73 65 6c 66 2d 73 69 67 6e 65 64 20  -in self-signed 
5c00: 63 65 72 74 0a 2a 2a 20 69 73 20 75 73 65 64 2e  cert.** is used.
5c10: 20 20 54 68 69 73 20 62 75 69 6c 74 2d 69 6e 20    This built-in 
5c20: 63 65 72 74 20 69 73 20 69 6e 73 65 63 75 72 65  cert is insecure
5c30: 20 61 6e 64 20 73 68 6f 75 6c 64 20 6f 6e 6c 79   and should only
5c40: 20 62 65 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   be used for.** 
5c50: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
5c60: 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  gging..*/.void s
5c70: 73 6c 5f 69 6e 69 74 5f 73 65 72 76 65 72 28 63  sl_init_server(c
5c80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 65 72 74  onst char *zCert
5c90: 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  File, const char
5ca0: 20 2a 7a 4b 65 79 46 69 6c 65 29 7b 0a 20 20 69   *zKeyFile){.  i
5cb0: 66 28 20 73 73 6c 49 73 49 6e 69 74 3d 3d 30 20  f( sslIsInit==0 
5cc0: 26 26 20 7a 43 65 72 74 46 69 6c 65 20 29 7b 0a  && zCertFile ){.
5cd0: 20 20 20 20 53 53 4c 5f 6c 69 62 72 61 72 79 5f      SSL_library_
5ce0: 69 6e 69 74 28 29 3b 0a 20 20 20 20 53 53 4c 5f  init();.    SSL_
5cf0: 6c 6f 61 64 5f 65 72 72 6f 72 5f 73 74 72 69 6e  load_error_strin
5d00: 67 73 28 29 3b 0a 20 20 20 20 4f 70 65 6e 53 53  gs();.    OpenSS
5d10: 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69  L_add_all_algori
5d20: 74 68 6d 73 28 29 3b 0a 20 20 20 20 73 73 6c 43  thms();.    sslC
5d30: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77  tx = SSL_CTX_new
5d40: 28 53 53 4c 76 32 33 5f 73 65 72 76 65 72 5f 6d  (SSLv23_server_m
5d50: 65 74 68 6f 64 28 29 29 3b 0a 20 20 20 20 69 66  ethod());.    if
5d60: 28 20 73 73 6c 43 74 78 3d 3d 30 20 29 7b 0a 20  ( sslCtx==0 ){. 
5d70: 20 20 20 20 20 45 52 52 5f 70 72 69 6e 74 5f 65       ERR_print_e
5d80: 72 72 6f 72 73 5f 66 70 28 73 74 64 65 72 72 29  rrors_fp(stderr)
5d90: 3b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66  ;.      fossil_f
5da0: 61 74 61 6c 28 22 45 72 72 6f 72 20 69 6e 69 74  atal("Error init
5db0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 53 53 4c  ializing the SSL
5dc0: 20 73 65 72 76 65 72 22 29 3b 0a 20 20 20 20 7d   server");.    }
5dd0: 0a 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f  .    if( fossil_
5de0: 73 74 72 63 6d 70 28 7a 43 65 72 74 46 69 6c 65  strcmp(zCertFile
5df0: 2c 22 75 6e 73 61 66 65 2d 62 75 69 6c 74 69 6e  ,"unsafe-builtin
5e00: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
5e10: 66 28 20 73 73 6c 63 74 78 5f 75 73 65 5f 63 65  f( sslctx_use_ce
5e20: 72 74 5f 66 72 6f 6d 5f 6d 65 6d 28 73 73 6c 43  rt_from_mem(sslC
5e30: 74 78 2c 20 73 73 6c 53 65 6c 66 43 65 72 74 2c  tx, sslSelfCert,
5e40: 20 2d 31 29 0a 20 20 20 20 20 20 20 7c 7c 20 73   -1).       || s
5e50: 73 6c 63 74 78 5f 75 73 65 5f 70 6b 65 79 5f 66  slctx_use_pkey_f
5e60: 72 6f 6d 5f 6d 65 6d 28 73 73 6c 43 74 78 2c 20  rom_mem(sslCtx, 
5e70: 73 73 6c 53 65 6c 66 50 4b 65 79 2c 20 2d 31 29  sslSelfPKey, -1)
5e80: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
5e90: 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22    fossil_fatal("
5ea0: 45 72 72 6f 72 20 6c 6f 61 64 69 6e 67 20 73 65  Error loading se
5eb0: 6c 66 2d 73 69 67 6e 65 64 20 43 45 52 54 20 61  lf-signed CERT a
5ec0: 6e 64 20 4b 45 59 22 29 3b 0a 20 20 20 20 20 20  nd KEY");.      
5ed0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
5ee0: 20 20 20 69 66 28 20 53 53 4c 5f 43 54 58 5f 75     if( SSL_CTX_u
5ef0: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 63  se_certificate_c
5f00: 68 61 69 6e 5f 66 69 6c 65 28 73 73 6c 43 74 78  hain_file(sslCtx
5f10: 2c 7a 43 65 72 74 46 69 6c 65 29 21 3d 31 20 29  ,zCertFile)!=1 )
5f20: 7b 0a 20 20 20 20 20 20 20 20 45 52 52 5f 70 72  {.        ERR_pr
5f30: 69 6e 74 5f 65 72 72 6f 72 73 5f 66 70 28 73 74  int_errors_fp(st
5f40: 64 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 66  derr);.        f
5f50: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 45 72 72  ossil_fatal("Err
5f60: 6f 72 20 6c 6f 61 64 69 6e 67 20 43 45 52 54 20  or loading CERT 
5f70: 66 69 6c 65 20 5c 22 25 73 5c 22 22 2c 20 7a 43  file \"%s\"", zC
5f80: 65 72 74 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  ertFile);.      
5f90: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4b 65 79  }.      if( zKey
5fa0: 46 69 6c 65 3d 3d 30 20 29 20 7a 4b 65 79 46 69  File==0 ) zKeyFi
5fb0: 6c 65 20 3d 20 7a 43 65 72 74 46 69 6c 65 3b 0a  le = zCertFile;.
5fc0: 20 20 20 20 20 20 69 66 28 20 53 53 4c 5f 43 54        if( SSL_CT
5fd0: 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79  X_use_PrivateKey
5fe0: 5f 66 69 6c 65 28 73 73 6c 43 74 78 2c 20 7a 4b  _file(sslCtx, zK
5ff0: 65 79 46 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45  eyFile, SSL_FILE
6000: 54 59 50 45 5f 50 45 4d 29 3c 3d 30 20 29 7b 0a  TYPE_PEM)<=0 ){.
6010: 20 20 20 20 20 20 20 20 45 52 52 5f 70 72 69 6e          ERR_prin
6020: 74 5f 65 72 72 6f 72 73 5f 66 70 28 73 74 64 65  t_errors_fp(stde
6030: 72 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rr);.        if(
6040: 20 73 74 72 63 6d 70 28 7a 4b 65 79 46 69 6c 65   strcmp(zKeyFile
6050: 2c 7a 43 65 72 74 46 69 6c 65 29 3d 3d 30 20 29  ,zCertFile)==0 )
6060: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 73 73  {.          foss
6070: 69 6c 5f 66 61 74 61 6c 28 22 54 68 65 20 70 72  il_fatal("The pr
6080: 69 76 61 74 65 20 6b 65 79 20 69 73 20 6e 6f 74  ivate key is not
6090: 20 66 6f 75 6e 64 20 69 6e 20 5c 22 25 73 5c 22   found in \"%s\"
60a0: 2e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  . ".            
60b0: 22 45 69 74 68 65 72 20 61 70 70 65 6e 64 20 74  "Either append t
60c0: 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 74  he private key t
60d0: 6f 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  o the certificat
60e0: 69 6f 6e 20 69 6e 20 74 68 61 74 20 22 0a 20 20  ion in that ".  
60f0: 20 20 20 20 20 20 20 20 20 20 22 66 69 6c 65 20            "file 
6100: 6f 72 20 75 73 65 20 61 20 73 65 70 61 72 61 74  or use a separat
6110: 65 20 2d 2d 70 6b 65 79 20 6f 70 74 69 6f 6e 20  e --pkey option 
6120: 74 6f 20 73 70 65 63 69 66 79 20 74 68 65 20 70  to specify the p
6130: 72 69 76 61 74 65 20 6b 65 79 2e 22 2c 0a 20 20  rivate key.",.  
6140: 20 20 20 20 20 20 20 20 20 20 7a 4b 65 79 46 69            zKeyFi
6150: 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  le);.        }el
6160: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  se{.          fo
6170: 73 73 69 6c 5f 66 61 74 61 6c 28 22 45 72 72 6f  ssil_fatal("Erro
6180: 72 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 72  r loading the pr
6190: 69 76 61 74 65 20 6b 65 79 20 66 72 6f 6d 20 66  ivate key from f
61a0: 69 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20  ile \"%s\"",.   
61b0: 20 20 20 20 20 20 20 20 20 20 7a 4b 65 79 46 69            zKeyFi
61c0: 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  le);.        }. 
61d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
61e0: 20 69 66 28 20 21 53 53 4c 5f 43 54 58 5f 63 68   if( !SSL_CTX_ch
61f0: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28  eck_private_key(
6200: 73 73 6c 43 74 78 29 20 29 7b 0a 20 20 20 20 20  sslCtx) ){.     
6210: 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 50   fossil_fatal("P
6220: 52 49 56 41 54 45 20 4b 45 59 20 5c 22 25 73 5c  RIVATE KEY \"%s\
6230: 22 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  " does not match
6240: 20 43 45 52 54 20 5c 22 25 73 5c 22 22 2c 0a 20   CERT \"%s\"",. 
6250: 20 20 20 20 20 20 20 20 20 20 7a 4b 65 79 46 69            zKeyFi
6260: 6c 65 2c 20 7a 43 65 72 74 46 69 6c 65 29 3b 0a  le, zCertFile);.
6270: 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 43 54      }.    SSL_CT
6280: 58 5f 73 65 74 5f 6d 6f 64 65 28 73 73 6c 43 74  X_set_mode(sslCt
6290: 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f  x, SSL_MODE_AUTO
62a0: 5f 52 45 54 52 59 29 3b 0a 20 20 20 20 73 73 6c  _RETRY);.    ssl
62b0: 49 73 49 6e 69 74 20 3d 20 32 3b 0a 20 20 7d 65  IsInit = 2;.  }e
62c0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
62d0: 20 73 73 6c 49 73 49 6e 69 74 3d 3d 32 20 29 3b   sslIsInit==2 );
62e0: 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20  .  }.}..typedef 
62f0: 73 74 72 75 63 74 20 53 73 6c 53 65 72 76 65 72  struct SslServer
6300: 43 6f 6e 6e 20 7b 0a 20 20 53 53 4c 20 2a 73 73  Conn {.  SSL *ss
6310: 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  l;          /* T
6320: 68 65 20 53 53 4c 20 63 6f 64 65 63 20 2a 2f 0a  he SSL codec */.
6330: 20 20 69 6e 74 20 69 53 6f 63 6b 65 74 3b 20 20    int iSocket;  
6340: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6f 63 6b       /* The sock
6350: 65 74 20 2a 2f 0a 20 20 42 49 4f 20 2a 62 69 6f  et */.  BIO *bio
6360: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 49  ;          /* BI
6370: 4f 20 6f 62 6a 65 63 74 2e 20 4e 65 65 64 65 64  O object. Needed
6380: 20 66 6f 72 20 45 4f 46 20 64 65 74 65 63 74 69   for EOF detecti
6390: 6f 6e 2e 20 2a 2f 0a 7d 20 53 73 6c 53 65 72 76  on. */.} SslServ
63a0: 65 72 43 6f 6e 6e 3b 0a 0a 2f 2a 0a 2a 2a 20 43  erConn;../*.** C
63b0: 72 65 61 74 65 20 61 20 6e 65 77 20 73 65 72 76  reate a new serv
63c0: 65 72 2d 73 69 64 65 20 63 6f 64 65 63 2e 20 20  er-side codec.  
63d0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
63e0: 74 68 65 20 73 6f 63 6b 65 74 27 73 20 66 69 6c  the socket's fil
63f0: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20  e.** descriptor 
6400: 66 72 6f 6d 20 77 68 69 63 68 20 74 68 65 20 63  from which the c
6410: 6f 64 65 63 20 72 65 61 64 73 20 61 6e 64 20 77  odec reads and w
6420: 72 69 74 65 73 2e 20 54 68 65 20 72 65 74 75 72  rites. The retur
6430: 6e 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 75  ned.** memory mu
6440: 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65  st eventually be
6450: 20 70 61 73 73 65 64 20 74 6f 20 73 73 6c 5f 63   passed to ssl_c
6460: 6c 6f 73 65 5f 73 65 72 76 65 72 28 29 2e 0a 2a  lose_server()..*
6470: 2f 0a 76 6f 69 64 20 2a 73 73 6c 5f 6e 65 77 5f  /.void *ssl_new_
6480: 73 65 72 76 65 72 28 69 6e 74 20 69 53 6f 63 6b  server(int iSock
6490: 65 74 29 7b 0a 20 20 53 73 6c 53 65 72 76 65 72  et){.  SslServer
64a0: 43 6f 6e 6e 20 2a 70 53 65 72 76 65 72 20 3d 20  Conn *pServer = 
64b0: 66 6f 73 73 69 6c 5f 6d 61 6c 6c 6f 63 5f 7a 65  fossil_malloc_ze
64c0: 72 6f 28 73 69 7a 65 6f 66 28 2a 70 53 65 72 76  ro(sizeof(*pServ
64d0: 65 72 29 29 3b 0a 20 20 42 49 4f 20 2a 62 20 3d  er));.  BIO *b =
64e0: 20 42 49 4f 5f 6e 65 77 5f 73 6f 63 6b 65 74 28   BIO_new_socket(
64f0: 69 53 6f 63 6b 65 74 2c 20 30 29 3b 0a 20 20 70  iSocket, 0);.  p
6500: 53 65 72 76 65 72 2d 3e 73 73 6c 20 3d 20 53 53  Server->ssl = SS
6510: 4c 5f 6e 65 77 28 73 73 6c 43 74 78 29 3b 0a 20  L_new(sslCtx);. 
6520: 20 70 53 65 72 76 65 72 2d 3e 69 53 6f 63 6b 65   pServer->iSocke
6530: 74 20 3d 20 69 53 6f 63 6b 65 74 3b 0a 20 20 70  t = iSocket;.  p
6540: 53 65 72 76 65 72 2d 3e 62 69 6f 20 3d 20 62 3b  Server->bio = b;
6550: 0a 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 70  .  SSL_set_bio(p
6560: 53 65 72 76 65 72 2d 3e 73 73 6c 2c 20 62 2c 20  Server->ssl, b, 
6570: 62 29 3b 0a 20 20 53 53 4c 5f 61 63 63 65 70 74  b);.  SSL_accept
6580: 28 70 53 65 72 76 65 72 2d 3e 73 73 6c 29 3b 0a  (pServer->ssl);.
6590: 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
65a0: 70 53 65 72 76 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  pServer;.}../*.*
65b0: 2a 20 43 6c 6f 73 65 20 61 20 73 65 72 76 65 72  * Close a server
65c0: 2d 73 69 64 65 20 63 6f 64 65 20 70 72 65 76 69  -side code previ
65d0: 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20 66  ously returned f
65e0: 72 6f 6d 20 73 73 6c 5f 6e 65 77 5f 73 65 72 76  rom ssl_new_serv
65f0: 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 73  er()..*/.void ss
6600: 6c 5f 63 6c 6f 73 65 5f 73 65 72 76 65 72 28 76  l_close_server(v
6610: 6f 69 64 20 2a 70 53 65 72 76 65 72 41 72 67 29  oid *pServerArg)
6620: 7b 0a 20 20 53 73 6c 53 65 72 76 65 72 43 6f 6e  {.  SslServerCon
6630: 6e 20 2a 70 53 65 72 76 65 72 20 3d 20 28 53 73  n *pServer = (Ss
6640: 6c 53 65 72 76 65 72 43 6f 6e 6e 2a 29 70 53 65  lServerConn*)pSe
6650: 72 76 65 72 41 72 67 3b 0a 20 20 53 53 4c 5f 66  rverArg;.  SSL_f
6660: 72 65 65 28 70 53 65 72 76 65 72 2d 3e 73 73 6c  ree(pServer->ssl
6670: 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65  );.  fossil_free
6680: 28 70 53 65 72 76 65 72 29 3b 0a 7d 0a 0a 2f 2a  (pServer);.}../*
6690: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
66a0: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
66b0: 6d 6f 72 65 20 62 79 74 65 73 20 61 76 61 69 6c  more bytes avail
66c0: 61 62 6c 65 20 74 6f 20 62 65 20 72 65 61 64 20  able to be read 
66d0: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 63 6c 69 65  from.** the clie
66e0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 73 6c 5f 65  nt..*/.int ssl_e
66f0: 6f 66 28 76 6f 69 64 20 2a 70 53 65 72 76 65 72  of(void *pServer
6700: 41 72 67 29 7b 0a 20 20 53 73 6c 53 65 72 76 65  Arg){.  SslServe
6710: 72 43 6f 6e 6e 20 2a 70 53 65 72 76 65 72 20 3d  rConn *pServer =
6720: 20 28 53 73 6c 53 65 72 76 65 72 43 6f 6e 6e 2a   (SslServerConn*
6730: 29 70 53 65 72 76 65 72 41 72 67 3b 0a 20 20 72  )pServerArg;.  r
6740: 65 74 75 72 6e 20 42 49 4f 5f 65 6f 66 28 70 53  eturn BIO_eof(pS
6750: 65 72 76 65 72 2d 3e 62 69 6f 29 3b 0a 7d 0a 0a  erver->bio);.}..
6760: 2f 2a 0a 2a 2a 20 52 65 61 64 20 63 6c 65 61 72  /*.** Read clear
6770: 74 65 78 74 20 62 79 74 65 73 20 74 68 61 74 20  text bytes that 
6780: 68 61 76 65 20 62 65 65 6e 20 72 65 63 65 69 76  have been receiv
6790: 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6c 69 65  ed from the clie
67a0: 6e 74 20 61 6e 64 0a 2a 2a 20 64 65 63 72 79 70  nt and.** decryp
67b0: 74 65 64 20 62 79 20 74 68 65 20 53 53 4c 20 73  ted by the SSL s
67c0: 65 72 76 65 72 20 63 6f 64 65 63 2e 0a 2a 2a 0a  erver codec..**.
67d0: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 65 63 74  ** If the expect
67e0: 65 64 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  ed payload size 
67f0: 75 6e 6b 6e 6f 77 6e 2c 20 69 2e 65 2e 20 69 66  unknown, i.e. if
6800: 20 74 68 65 20 48 54 54 50 0a 2a 2a 20 43 6f 6e   the HTTP.** Con
6810: 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 68 65 61  tent-Length: hea
6820: 64 65 72 20 66 69 65 6c 64 20 68 61 73 20 6e 6f  der field has no
6830: 74 20 62 65 65 6e 20 70 61 72 73 65 64 2c 20 74  t been parsed, t
6840: 68 65 20 64 6f 4c 6f 6f 70 0a 2a 2a 20 61 72 67  he doLoop.** arg
6850: 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20  ument should be 
6860: 30 2c 20 6f 72 20 53 53 4c 5f 72 65 61 64 28 29  0, or SSL_read()
6870: 20 6d 61 79 20 62 6c 6f 63 6b 20 61 6e 64 20 77   may block and w
6880: 61 69 74 20 66 6f 72 20 6d 6f 72 65 0a 2a 2a 20  ait for more.** 
6890: 64 61 74 61 20 74 68 61 6e 20 69 73 20 65 76 65  data than is eve
68a0: 6e 74 75 61 6c 6c 79 20 67 6f 69 6e 67 20 74 6f  ntually going to
68b0: 20 61 72 72 69 76 65 20 28 6f 6e 20 57 69 6e 64   arrive (on Wind
68c0: 6f 77 73 29 2e 20 4f 6e 0a 2a 2a 20 6e 6f 6e 2d  ows). On.** non-
68d0: 57 69 6e 64 6f 77 73 20 62 75 69 6c 64 73 2c 20  Windows builds, 
68e0: 69 74 20 68 61 73 20 62 65 65 6e 20 6f 75 72 20  it has been our 
68f0: 65 78 70 65 72 69 65 6e 63 65 20 74 68 61 74 20  experience that 
6900: 74 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 61 72 67  the final.** arg
6910: 75 6d 65 6e 74 20 6d 75 73 74 20 61 6c 77 61 79  ument must alway
6920: 73 20 62 65 20 74 72 75 65 2c 20 61 73 20 64 69  s be true, as di
6930: 73 63 75 73 73 65 64 20 61 74 20 6c 65 6e 67 74  scussed at lengt
6940: 68 20 61 74 3a 0a 2a 2a 0a 2a 2a 20 68 74 74 70  h at:.**.** http
6950: 73 3a 2f 2f 66 6f 73 73 69 6c 2d 73 63 6d 2e 6f  s://fossil-scm.o
6960: 72 67 2f 66 6f 72 75 6d 2f 66 6f 72 75 6d 70 6f  rg/forum/forumpo
6970: 73 74 2f 32 66 38 31 38 38 35 30 61 62 62 37 32  st/2f818850abb72
6980: 37 31 39 0a 2a 2f 0a 73 69 7a 65 5f 74 20 73 73  719.*/.size_t ss
6990: 6c 5f 72 65 61 64 5f 73 65 72 76 65 72 28 76 6f  l_read_server(vo
69a0: 69 64 20 2a 70 53 65 72 76 65 72 41 72 67 2c 20  id *pServerArg, 
69b0: 63 68 61 72 20 2a 7a 42 75 66 2c 20 73 69 7a 65  char *zBuf, size
69c0: 5f 74 20 6e 42 75 66 2c 20 69 6e 74 20 64 6f 4c  _t nBuf, int doL
69d0: 6f 6f 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  oop){.  int n;. 
69e0: 20 73 69 7a 65 5f 74 20 72 63 20 3d 20 30 3b 0a   size_t rc = 0;.
69f0: 20 20 53 73 6c 53 65 72 76 65 72 43 6f 6e 6e 20    SslServerConn 
6a00: 2a 70 53 65 72 76 65 72 20 3d 20 28 53 73 6c 53  *pServer = (SslS
6a10: 65 72 76 65 72 43 6f 6e 6e 2a 29 70 53 65 72 76  erverConn*)pServ
6a20: 65 72 41 72 67 3b 0a 20 20 69 66 28 20 6e 42 75  erArg;.  if( nBu
6a30: 66 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 20  f>0x7fffffff ){ 
6a40: 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 53 53  fossil_fatal("SS
6a50: 4c 20 72 65 61 64 20 74 6f 6f 20 62 69 67 22 29  L read too big")
6a60: 3b 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 42 75  ; }.  while( nBu
6a70: 66 21 3d 72 63 20 26 26 20 42 49 4f 5f 65 6f 66  f!=rc && BIO_eof
6a80: 28 70 53 65 72 76 65 72 2d 3e 62 69 6f 29 3d 3d  (pServer->bio)==
6a90: 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 53 53 4c  0 ){.    n = SSL
6aa0: 5f 72 65 61 64 28 70 53 65 72 76 65 72 2d 3e 73  _read(pServer->s
6ab0: 73 6c 2c 20 7a 42 75 66 20 2b 20 72 63 2c 20 28  sl, zBuf + rc, (
6ac0: 69 6e 74 29 28 6e 42 75 66 20 2d 20 72 63 29 29  int)(nBuf - rc))
6ad0: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 29 7b  ;.    if( n>0 ){
6ae0: 0a 20 20 20 20 20 20 72 63 20 2b 3d 20 6e 3b 0a  .      rc += n;.
6af0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f      }.    if( do
6b00: 4c 6f 6f 70 3d 3d 30 20 7c 7c 20 6e 3c 3d 30 20  Loop==0 || n<=0 
6b10: 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
6b20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6b30: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6b40: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 6c 69  Read a single li
6b50: 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d 20  ne of text from 
6b60: 74 68 65 20 63 6c 69 65 6e 74 2c 20 75 70 20 74  the client, up t
6b70: 6f 20 6e 42 75 66 2d 31 20 62 79 74 65 73 2e 20  o nBuf-1 bytes. 
6b80: 4f 6e 0a 2a 2a 20 73 75 63 63 65 73 73 2c 20 77  On.** success, w
6b90: 72 69 74 65 73 20 6e 42 75 66 2d 31 20 62 79 74  rites nBuf-1 byt
6ba0: 65 73 20 74 6f 20 7a 42 75 66 20 61 6e 64 20 4e  es to zBuf and N
6bb0: 55 4c 2d 74 65 72 6d 69 6e 61 74 65 73 20 7a 42  UL-terminates zB
6bc0: 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 73 20 4e  uf..** Returns N
6bd0: 55 4c 4c 20 6f 6e 20 61 6e 20 49 2f 4f 20 65 72  ULL on an I/O er
6be0: 72 6f 72 20 6f 72 20 61 74 20 45 4f 46 2e 0a 2a  ror or at EOF..*
6bf0: 2f 0a 63 68 61 72 20 2a 73 73 6c 5f 67 65 74 73  /.char *ssl_gets
6c00: 28 76 6f 69 64 20 2a 70 53 65 72 76 65 72 41 72  (void *pServerAr
6c10: 67 2c 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69  g, char *zBuf, i
6c20: 6e 74 20 6e 42 75 66 29 7b 0a 20 20 69 6e 74 20  nt nBuf){.  int 
6c30: 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  n = 0;.  int i;.
6c40: 20 20 53 73 6c 53 65 72 76 65 72 43 6f 6e 6e 20    SslServerConn 
6c50: 2a 70 53 65 72 76 65 72 20 3d 20 28 53 73 6c 53  *pServer = (SslS
6c60: 65 72 76 65 72 43 6f 6e 6e 2a 29 70 53 65 72 76  erverConn*)pServ
6c70: 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 42 49  erArg;..  if( BI
6c80: 4f 5f 65 6f 66 28 70 53 65 72 76 65 72 2d 3e 62  O_eof(pServer->b
6c90: 69 6f 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  io) ) return 0;.
6ca0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75    for(i=0; i<nBu
6cb0: 66 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  f-1; i++){.    n
6cc0: 20 3d 20 53 53 4c 5f 72 65 61 64 28 70 53 65 72   = SSL_read(pSer
6cd0: 76 65 72 2d 3e 73 73 6c 2c 20 26 7a 42 75 66 5b  ver->ssl, &zBuf[
6ce0: 69 5d 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  i], 1);.    if( 
6cf0: 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  n<=0 ){.      re
6d00: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
6d10: 20 20 69 66 28 20 7a 42 75 66 5b 69 5d 3d 3d 27    if( zBuf[i]=='
6d20: 5c 6e 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  \n' ) break;.  }
6d30: 0a 20 20 7a 42 75 66 5b 69 2b 31 5d 20 3d 20 30  .  zBuf[i+1] = 0
6d40: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66 3b  ;.  return zBuf;
6d50: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
6d60: 20 63 6c 65 61 72 74 65 78 74 20 62 79 74 65 73   cleartext bytes
6d70: 20 69 6e 74 6f 20 74 68 65 20 53 53 4c 20 73 65   into the SSL se
6d80: 72 76 65 72 20 63 6f 64 65 63 20 73 6f 20 74 68  rver codec so th
6d90: 61 74 20 74 68 65 79 20 63 61 6e 0a 2a 2a 20 62  at they can.** b
6da0: 65 20 65 6e 63 72 79 70 74 65 64 20 61 6e 64 20  e encrypted and 
6db0: 73 65 6e 74 20 62 61 63 6b 20 74 6f 20 74 68 65  sent back to the
6dc0: 20 63 6c 69 65 6e 74 2e 0a 2a 2f 0a 73 69 7a 65   client..*/.size
6dd0: 5f 74 20 73 73 6c 5f 77 72 69 74 65 5f 73 65 72  _t ssl_write_ser
6de0: 76 65 72 28 76 6f 69 64 20 2a 70 53 65 72 76 65  ver(void *pServe
6df0: 72 41 72 67 2c 20 63 68 61 72 20 2a 7a 42 75 66  rArg, char *zBuf
6e00: 2c 20 73 69 7a 65 5f 74 20 6e 42 75 66 29 7b 0a  , size_t nBuf){.
6e10: 20 20 69 6e 74 20 6e 3b 0a 20 20 53 73 6c 53 65    int n;.  SslSe
6e20: 72 76 65 72 43 6f 6e 6e 20 2a 70 53 65 72 76 65  rverConn *pServe
6e30: 72 20 3d 20 28 53 73 6c 53 65 72 76 65 72 43 6f  r = (SslServerCo
6e40: 6e 6e 2a 29 70 53 65 72 76 65 72 41 72 67 3b 0a  nn*)pServerArg;.
6e50: 20 20 69 66 28 20 6e 42 75 66 3c 3d 30 20 29 20    if( nBuf<=0 ) 
6e60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
6e70: 6e 42 75 66 3e 30 78 37 66 66 66 66 66 66 66 20  nBuf>0x7fffffff 
6e80: 29 7b 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28  ){ fossil_fatal(
6e90: 22 53 53 4c 20 77 72 69 74 65 20 74 6f 6f 20 62  "SSL write too b
6ea0: 69 67 22 29 3b 20 7d 0a 20 20 6e 20 3d 20 53 53  ig"); }.  n = SS
6eb0: 4c 5f 77 72 69 74 65 28 70 53 65 72 76 65 72 2d  L_write(pServer-
6ec0: 3e 73 73 6c 2c 20 7a 42 75 66 2c 20 28 69 6e 74  >ssl, zBuf, (int
6ed0: 29 6e 42 75 66 29 3b 0a 20 20 69 66 28 20 6e 3c  )nBuf);.  if( n<
6ee0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6ef0: 20 2d 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28   -SSL_get_error(
6f00: 70 53 65 72 76 65 72 2d 3e 73 73 6c 2c 20 6e 29  pServer->ssl, n)
6f10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
6f20: 65 74 75 72 6e 20 6e 3b 0a 20 20 7d 0a 7d 0a 0a  eturn n;.  }.}..
6f30: 23 65 6e 64 69 66 20 2f 2a 20 46 4f 53 53 49 4c  #endif /* FOSSIL
6f40: 5f 45 4e 41 42 4c 45 5f 53 53 4c 20 2a 2f 0a 0a  _ENABLE_SSL */..
6f50: 23 69 66 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e  #ifdef FOSSIL_EN
6f60: 41 42 4c 45 5f 53 53 4c 0a 2f 2a 0a 2a 2a 20 7a  ABLE_SSL./*.** z
6f70: 50 61 74 68 20 69 73 20 61 20 6e 61 6d 65 20 74  Path is a name t
6f80: 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 66  hat might be a f
6f90: 69 6c 65 20 6f 72 20 64 69 72 65 63 74 6f 72 79  ile or directory
6fa0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74 72   containing a tr
6fb0: 75 73 74 0a 2a 2a 20 73 74 6f 72 65 2e 20 20 2a  ust.** store.  *
6fc0: 70 7a 53 74 6f 72 65 20 69 73 20 74 68 65 20 6e  pzStore is the n
6fd0: 61 6d 65 20 6f 66 20 74 68 65 20 74 72 75 73 74  ame of the trust
6fe0: 20 73 74 6f 72 65 20 74 6f 20 61 63 74 75 61 6c   store to actual
6ff0: 6c 79 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ly use..**.** If
7000: 20 2a 70 7a 53 74 6f 72 65 20 69 73 20 6e 6f 74   *pzStore is not
7010: 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 6e   NULL (meaning n
7020: 6f 20 74 72 75 73 74 20 73 74 6f 72 65 20 68 61  o trust store ha
7030: 73 20 62 65 65 6e 20 66 6f 75 6e 64 20 79 65 74  s been found yet
7040: 29 0a 2a 2a 20 61 6e 64 20 69 66 20 7a 50 61 74  ).** and if zPat
7050: 68 20 65 78 69 73 74 73 2c 20 74 68 65 6e 20 73  h exists, then s
7060: 65 74 20 2a 70 7a 53 74 6f 72 65 20 74 6f 20 70  et *pzStore to p
7070: 6f 69 6e 74 20 74 6f 20 7a 50 61 74 68 2e 0a 2a  oint to zPath..*
7080: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
7090: 75 73 74 5f 6c 6f 63 61 74 69 6f 6e 5f 75 73 61  ust_location_usa
70a0: 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ble(const char *
70b0: 7a 50 61 74 68 2c 20 63 6f 6e 73 74 20 63 68 61  zPath, const cha
70c0: 72 20 2a 2a 70 7a 53 74 6f 72 65 29 7b 0a 20 20  r **pzStore){.  
70d0: 69 66 28 20 2a 70 7a 53 74 6f 72 65 21 3d 30 20  if( *pzStore!=0 
70e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
70f0: 66 69 6c 65 5f 69 73 64 69 72 28 7a 50 61 74 68  file_isdir(zPath
7100: 2c 20 45 78 74 46 49 4c 45 29 3e 30 20 29 20 2a  , ExtFILE)>0 ) *
7110: 70 7a 53 74 6f 72 65 20 3d 20 7a 50 61 74 68 3b  pzStore = zPath;
7120: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 46 4f 53  .}.#endif /* FOS
7130: 53 49 4c 5f 45 4e 41 42 4c 45 5f 53 53 4c 20 2a  SIL_ENABLE_SSL *
7140: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44  /../*.** COMMAND
7150: 3a 20 74 6c 73 2d 63 6f 6e 66 69 67 2a 0a 2a 2a  : tls-config*.**
7160: 20 43 4f 4d 4d 41 4e 44 3a 20 73 73 6c 2d 63 6f   COMMAND: ssl-co
7170: 6e 66 69 67 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  nfig.**.** Usage
7180: 3a 20 25 66 6f 73 73 69 6c 20 73 73 6c 2d 63 6f  : %fossil ssl-co
7190: 6e 66 69 67 20 5b 53 55 42 43 4f 4d 4d 41 4e 44  nfig [SUBCOMMAND
71a0: 5d 20 5b 4f 50 54 49 4f 4e 53 2e 2e 2e 5d 20 5b  ] [OPTIONS...] [
71b0: 41 52 47 53 2e 2e 2e 5d 0a 2a 2a 0a 2a 2a 20 54  ARGS...].**.** T
71c0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  his command is u
71d0: 73 65 64 20 74 6f 20 76 69 65 77 20 6f 72 20 6d  sed to view or m
71e0: 6f 64 69 66 79 20 74 68 65 20 54 4c 53 20 28 54  odify the TLS (T
71f0: 72 61 6e 73 70 6f 72 74 20 4c 61 79 65 72 0a 2a  ransport Layer.*
7200: 2a 20 53 65 63 75 72 69 74 79 29 20 63 6f 6e 66  * Security) conf
7210: 69 67 75 72 61 74 69 6f 6e 20 66 6f 72 20 46 6f  iguration for Fo
7220: 73 73 69 6c 2e 20 20 54 4c 53 20 28 66 6f 72 6d  ssil.  TLS (form
7230: 65 72 6c 79 20 53 53 4c 29 20 69 73 20 74 68 65  erly SSL) is the
7240: 0a 2a 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 74  .** encryption t
7250: 65 63 68 6e 6f 6c 6f 67 79 20 75 73 65 64 20 66  echnology used f
7260: 6f 72 20 73 65 63 75 72 65 20 48 54 54 50 53 20  or secure HTTPS 
7270: 74 72 61 6e 73 70 6f 72 74 2e 0a 2a 2a 0a 2a 2a  transport..**.**
7280: 20 53 75 62 2d 63 6f 6d 6d 61 6e 64 73 3a 0a 2a   Sub-commands:.*
7290: 2a 0a 2a 2a 20 20 20 72 65 6d 6f 76 65 2d 65 78  *.**   remove-ex
72a0: 63 65 70 74 69 6f 6e 20 44 4f 4d 41 49 4e 53 20  ception DOMAINS 
72b0: 20 20 20 52 65 6d 6f 76 65 20 54 4c 53 20 63 65     Remove TLS ce
72c0: 72 74 20 65 78 63 65 70 74 69 6f 6e 73 20 66 6f  rt exceptions fo
72d0: 72 20 74 68 65 20 64 6f 6d 61 69 6e 73 0a 2a 2a  r the domains.**
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
7300: 69 73 74 65 64 2e 20 20 4f 72 20 72 65 6d 6f 76  isted.  Or remov
7310: 65 20 74 68 65 6d 20 61 6c 6c 20 69 66 20 74 68  e them all if th
7320: 65 20 2d 2d 61 6c 6c 0a 2a 2a 20 20 20 20 20 20  e --all.**      
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7340: 20 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 20           option 
7350: 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  is specified..**
7360: 0a 2a 2a 20 20 20 73 63 72 75 62 20 3f 2d 2d 66  .**   scrub ?--f
7370: 6f 72 63 65 3f 20 20 20 20 20 20 20 20 20 20 20  orce?           
7380: 20 20 52 65 6d 6f 76 65 20 61 6c 6c 20 53 53 4c    Remove all SSL
7390: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 64   configuration d
73a0: 61 74 61 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ata from the.** 
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
73d0: 70 6f 73 69 74 6f 72 79 2e 20 55 73 65 20 2d 2d  pository. Use --
73e0: 66 6f 72 63 65 20 74 6f 20 6f 6d 69 74 20 74 68  force to omit th
73f0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7410: 20 20 20 63 6f 6e 66 69 72 6d 61 74 69 6f 6e 2e     confirmation.
7420: 0a 2a 2a 0a 2a 2a 20 20 20 73 68 6f 77 20 3f 2d  .**.**   show ?-
7430: 76 3f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v?              
7440: 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 54 4c       Show the TL
7450: 53 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  S configuration.
7460: 20 41 64 64 20 2d 76 20 74 6f 20 73 65 65 0a 2a   Add -v to see.*
7470: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7490: 61 64 64 69 74 69 6f 6e 61 6c 20 65 78 70 6c 61  additional expla
74a0: 6e 61 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 74  nation.*/.void t
74b0: 65 73 74 5f 74 6c 73 63 6f 6e 66 69 67 5f 69 6e  est_tlsconfig_in
74c0: 66 6f 28 76 6f 69 64 29 7b 0a 20 20 63 6f 6e 73  fo(void){.  cons
74d0: 74 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20  t char *zCmd;.  
74e0: 73 69 7a 65 5f 74 20 6e 43 6d 64 3b 0a 20 20 69  size_t nCmd;.  i
74f0: 6e 74 20 6e 48 69 74 20 3d 20 30 3b 0a 0a 20 20  nt nHit = 0;..  
7500: 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e  db_find_and_open
7510: 5f 72 65 70 6f 73 69 74 6f 72 79 28 4f 50 45 4e  _repository(OPEN
7520: 5f 4f 4b 5f 4e 4f 54 5f 46 4f 55 4e 44 7c 4f 50  _OK_NOT_FOUND|OP
7530: 45 4e 5f 53 55 42 53 54 49 54 55 54 45 2c 30 29  EN_SUBSTITUTE,0)
7540: 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e 66  ;.  db_open_conf
7550: 69 67 28 31 2c 30 29 3b 0a 20 20 69 66 28 20 67  ig(1,0);.  if( g
7560: 2e 61 72 67 63 3d 3d 32 20 7c 7c 20 28 67 2e 61  .argc==2 || (g.a
7570: 72 67 63 3e 3d 33 20 26 26 20 67 2e 61 72 67 76  rgc>=3 && g.argv
7580: 5b 32 5d 5b 30 5d 3d 3d 27 2d 27 29 20 29 7b 0a  [2][0]=='-') ){.
7590: 20 20 20 20 7a 43 6d 64 20 3d 20 22 73 68 6f 77      zCmd = "show
75a0: 22 3b 0a 20 20 20 20 6e 43 6d 64 20 3d 20 34 3b  ";.    nCmd = 4;
75b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 43  .  }else{.    zC
75c0: 6d 64 20 3d 20 67 2e 61 72 67 76 5b 32 5d 3b 0a  md = g.argv[2];.
75d0: 20 20 20 20 6e 43 6d 64 20 3d 20 73 74 72 6c 65      nCmd = strle
75e0: 6e 28 7a 43 6d 64 29 3b 0a 20 20 7d 0a 20 20 69  n(zCmd);.  }.  i
75f0: 66 28 20 73 74 72 6e 63 6d 70 28 22 73 63 72 75  f( strncmp("scru
7600: 62 22 2c 7a 43 6d 64 2c 6e 43 6d 64 29 3d 3d 30  b",zCmd,nCmd)==0
7610: 20 26 26 20 6e 43 6d 64 3e 34 20 29 7b 0a 20 20   && nCmd>4 ){.  
7620: 20 20 69 6e 74 20 62 46 6f 72 63 65 20 3d 20 66    int bForce = f
7630: 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 66 6f 72 63  ind_option("forc
7640: 65 22 2c 22 66 22 2c 30 29 21 3d 30 3b 0a 20 20  e","f",0)!=0;.  
7650: 20 20 76 65 72 69 66 79 5f 61 6c 6c 5f 6f 70 74    verify_all_opt
7660: 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20  ions();.    if( 
7670: 21 62 46 6f 72 63 65 20 29 7b 0a 20 20 20 20 20  !bForce ){.     
7680: 20 42 6c 6f 62 20 61 6e 73 3b 0a 20 20 20 20 20   Blob ans;.     
7690: 20 63 68 61 72 20 63 52 65 70 6c 79 3b 0a 20 20   char cReply;.  
76a0: 20 20 20 20 70 72 6f 6d 70 74 5f 75 73 65 72 28      prompt_user(
76b0: 0a 20 20 20 20 20 20 20 20 22 53 63 72 75 62 62  .        "Scrubb
76c0: 69 6e 67 20 74 68 65 20 53 53 4c 20 63 6f 6e 66  ing the SSL conf
76d0: 69 67 75 72 61 74 69 6f 6e 20 77 69 6c 6c 20 70  iguration will p
76e0: 65 72 6d 61 6e 65 6e 74 6c 79 20 64 65 6c 65 74  ermanently delet
76f0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 5c 6e  e information.\n
7700: 22 0a 20 20 20 20 20 20 20 20 22 43 68 61 6e 67  ".        "Chang
7710: 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 75 6e 64  es cannot be und
7720: 6f 6e 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 28  one.  Continue (
7730: 79 2f 4e 29 3f 20 22 2c 20 26 61 6e 73 29 3b 0a  y/N)? ", &ans);.
7740: 20 20 20 20 20 20 63 52 65 70 6c 79 20 3d 20 62        cReply = b
7750: 6c 6f 62 5f 73 74 72 28 26 61 6e 73 29 5b 30 5d  lob_str(&ans)[0]
7760: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 52 65 70  ;.      if( cRep
7770: 6c 79 21 3d 27 79 27 20 26 26 20 63 52 65 70 6c  ly!='y' && cRepl
7780: 79 21 3d 27 59 27 20 29 7b 0a 20 20 20 20 20 20  y!='Y' ){.      
7790: 20 20 66 6f 73 73 69 6c 5f 65 78 69 74 28 31 29    fossil_exit(1)
77a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
77b0: 20 20 20 20 64 62 5f 75 6e 70 72 6f 74 65 63 74      db_unprotect
77c0: 28 50 52 4f 54 45 43 54 5f 41 4c 4c 29 3b 0a 20  (PROTECT_ALL);. 
77d0: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
77e0: 28 0a 20 20 20 20 20 20 22 50 52 41 47 4d 41 20  (.      "PRAGMA 
77f0: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 3d 4f 4e  secure_delete=ON
7800: 3b 22 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45  ;".      "DELETE
7810: 20 46 52 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45   FROM config WHE
7820: 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27 73 73  RE name GLOB 'ss
7830: 6c 2d 2a 27 3b 22 0a 20 20 20 20 29 3b 0a 20 20  l-*';".    );.  
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 7d 65 6c 73 65 0a 20 20 69 66  ();.  }else.  if
7860: 28 20 73 74 72 6e 63 6d 70 28 22 73 68 6f 77 22  ( strncmp("show"
7870: 2c 7a 43 6d 64 2c 6e 43 6d 64 29 3d 3d 30 20 29  ,zCmd,nCmd)==0 )
7880: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46 4f  {.#if defined(FO
7890: 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 53 53 4c 29  SSIL_ENABLE_SSL)
78a0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
78b0: 2a 7a 4e 61 6d 65 2c 20 2a 7a 56 61 6c 75 65 3b  *zName, *zValue;
78c0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
78d0: 2a 7a 55 73 65 64 20 3d 20 30 3b 20 20 20 20 20  *zUsed = 0;     
78e0: 20 20 2f 2a 20 54 72 75 73 74 20 73 74 6f 72 65    /* Trust store
78f0: 20 6c 6f 63 61 74 69 6f 6e 20 61 63 74 75 61 6c   location actual
7900: 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 73  ly used */.    s
7910: 69 7a 65 5f 74 20 6e 4e 61 6d 65 3b 0a 23 65 6e  ize_t nName;.#en
7920: 64 69 66 0a 20 20 20 20 53 74 6d 74 20 71 3b 0a  dif.    Stmt q;.
7930: 20 20 20 20 69 6e 74 20 76 65 72 62 6f 73 65 20      int verbose 
7940: 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 76  = find_option("v
7950: 65 72 62 6f 73 65 22 2c 22 76 22 2c 30 29 21 3d  erbose","v",0)!=
7960: 30 3b 0a 20 20 20 20 76 65 72 69 66 79 5f 61 6c  0;.    verify_al
7970: 6c 5f 6f 70 74 69 6f 6e 73 28 29 3b 0a 0a 23 69  l_options();..#i
7980: 66 20 21 64 65 66 69 6e 65 64 28 46 4f 53 53 49  f !defined(FOSSI
7990: 4c 5f 45 4e 41 42 4c 45 5f 53 53 4c 29 0a 20 20  L_ENABLE_SSL).  
79a0: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
79b0: 4f 70 65 6e 53 53 4c 2d 76 65 72 73 69 6f 6e 3a  OpenSSL-version:
79c0: 20 20 20 20 20 20 28 6e 6f 6e 65 29 5c 6e 22 29        (none)\n")
79d0: 3b 0a 20 20 20 20 69 66 28 20 76 65 72 62 6f 73  ;.    if( verbos
79e0: 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69  e ){.      fossi
79f0: 6c 5f 70 72 69 6e 74 28 22 5c 6e 22 0a 20 20 20  l_print("\n".   
7a00: 20 20 20 20 20 20 22 20 20 54 68 65 20 4f 70 65        "  The Ope
7a10: 6e 53 53 4c 20 6c 69 62 72 61 72 79 20 69 73 20  nSSL library is 
7a20: 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 69 73  not used by this
7a30: 20 62 75 69 6c 64 20 6f 66 20 46 6f 73 73 69 6c   build of Fossil
7a40: 5c 6e 5c 6e 22 0a 20 20 20 20 20 20 29 3b 0a 20  \n\n".      );. 
7a50: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 66     }.#else.    f
7a60: 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 4f 70 65  ossil_print("Ope
7a70: 6e 53 53 4c 2d 76 65 72 73 69 6f 6e 3a 20 20 20  nSSL-version:   
7a80: 20 20 20 25 73 20 20 28 30 78 25 30 39 78 29 5c     %s  (0x%09x)\
7a90: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 53 53 4c  n",.         SSL
7aa0: 65 61 79 5f 76 65 72 73 69 6f 6e 28 53 53 4c 45  eay_version(SSLE
7ab0: 41 59 5f 56 45 52 53 49 4f 4e 29 2c 20 4f 50 45  AY_VERSION), OPE
7ac0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
7ad0: 42 45 52 29 3b 0a 20 20 20 20 69 66 28 20 76 65  BER);.    if( ve
7ae0: 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 66  rbose ){.      f
7af0: 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 5c 6e 22  ossil_print("\n"
7b00: 0a 20 20 20 20 20 20 20 20 20 22 20 20 54 68 65  .         "  The
7b10: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
7b20: 4f 70 65 6e 53 53 4c 20 6c 69 62 72 61 72 79 20  OpenSSL library 
7b30: 62 65 69 6e 67 20 75 73 65 64 5c 6e 22 0a 20 20  being used\n".  
7b40: 20 20 20 20 20 20 20 22 20 20 62 79 20 74 68 69         "  by thi
7b50: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 46 6f  s instance of Fo
7b60: 73 73 69 6c 2e 20 20 56 65 72 73 69 6f 6e 20 33  ssil.  Version 3
7b70: 2e 30 2e 30 20 6f 72 5c 6e 22 0a 20 20 20 20 20  .0.0 or\n".     
7b80: 20 20 20 20 22 20 20 6c 61 74 65 72 20 69 73 20      "  later is 
7b90: 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 5c 6e 5c 6e  recommended.\n\n
7ba0: 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ".      );.    }
7bb0: 0a 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69  ..    fossil_pri
7bc0: 6e 74 28 22 54 72 75 73 74 20 73 74 6f 72 65 20  nt("Trust store 
7bd0: 6c 6f 63 61 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20  location\n");.  
7be0: 20 20 7a 4e 61 6d 65 20 3d 20 58 35 30 39 5f 67    zName = X509_g
7bf0: 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f  et_default_cert_
7c00: 66 69 6c 65 5f 65 6e 76 28 29 3b 0a 20 20 20 20  file_env();.    
7c10: 7a 56 61 6c 75 65 20 3d 20 66 6f 73 73 69 6c 5f  zValue = fossil_
7c20: 67 65 74 65 6e 76 28 7a 4e 61 6d 65 29 3b 0a 20  getenv(zName);. 
7c30: 20 20 20 69 66 28 20 7a 56 61 6c 75 65 3d 3d 30     if( zValue==0
7c40: 20 29 20 7a 56 61 6c 75 65 20 3d 20 22 22 3b 0a   ) zValue = "";.
7c50: 20 20 20 20 74 72 75 73 74 5f 6c 6f 63 61 74 69      trust_locati
7c60: 6f 6e 5f 75 73 61 62 6c 65 28 7a 56 61 6c 75 65  on_usable(zValue
7c70: 2c 20 26 7a 55 73 65 64 29 3b 0a 20 20 20 20 6e  , &zUsed);.    n
7c80: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
7c90: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c  ame);.    fossil
7ca0: 5f 70 72 69 6e 74 28 22 20 20 25 73 3a 25 2a 73  _print("  %s:%*s
7cb0: 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20 31 39  %s\n", zName, 19
7cc0: 2d 6e 4e 61 6d 65 2c 20 22 22 2c 20 7a 56 61 6c  -nName, "", zVal
7cd0: 75 65 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  ue);.    zName =
7ce0: 20 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c   X509_get_defaul
7cf0: 74 5f 63 65 72 74 5f 64 69 72 5f 65 6e 76 28 29  t_cert_dir_env()
7d00: 3b 0a 20 20 20 20 7a 56 61 6c 75 65 20 3d 20 66  ;.    zValue = f
7d10: 6f 73 73 69 6c 5f 67 65 74 65 6e 76 28 7a 4e 61  ossil_getenv(zNa
7d20: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 56 61  me);.    if( zVa
7d30: 6c 75 65 3d 3d 30 20 29 20 7a 56 61 6c 75 65 20  lue==0 ) zValue 
7d40: 3d 20 22 22 3b 0a 20 20 20 20 74 72 75 73 74 5f  = "";.    trust_
7d50: 6c 6f 63 61 74 69 6f 6e 5f 75 73 61 62 6c 65 28  location_usable(
7d60: 7a 56 61 6c 75 65 2c 20 26 7a 55 73 65 64 29 3b  zValue, &zUsed);
7d70: 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72  .    nName = str
7d80: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  len(zName);.    
7d90: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20 20  fossil_print("  
7da0: 25 73 3a 25 2a 73 25 73 5c 6e 22 2c 20 7a 4e 61  %s:%*s%s\n", zNa
7db0: 6d 65 2c 20 31 39 2d 6e 4e 61 6d 65 2c 20 22 22  me, 19-nName, ""
7dc0: 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 69  , zValue);.    i
7dd0: 66 28 20 76 65 72 62 6f 73 65 20 29 7b 0a 20 20  f( verbose ){.  
7de0: 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74      fossil_print
7df0: 28 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 20  ("\n".        " 
7e00: 20 20 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 76     Environment v
7e10: 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 64 65  ariables that de
7e20: 74 65 72 6d 69 6e 65 20 61 6c 74 65 72 6e 61 74  termine alternat
7e30: 69 76 65 20 6c 6f 63 61 74 69 6f 6e 73 20 66 6f  ive locations fo
7e40: 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 20 20  r\n".        "  
7e50: 20 20 74 68 65 20 72 6f 6f 74 20 63 65 72 74 69    the root certi
7e60: 66 69 63 61 74 65 73 20 75 73 65 64 20 62 79 20  ficates used by 
7e70: 46 6f 73 73 69 6c 20 77 68 65 6e 20 69 74 20 69  Fossil when it i
7e80: 73 20 61 63 74 69 6e 67 20 61 73 20 61 20 53 53  s acting as a SS
7e90: 4c 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 20 20  L\n".        "  
7ea0: 20 20 63 6c 69 65 6e 74 2e 20 49 66 20 73 70 65    client. If spe
7eb0: 63 69 66 69 65 64 2c 20 74 68 65 73 65 20 61 6c  cified, these al
7ec0: 74 65 72 6e 61 74 69 76 65 20 6c 6f 63 61 74 69  ternative locati
7ed0: 6f 6e 73 20 74 61 6b 65 20 74 6f 70 5c 6e 22 0a  ons take top\n".
7ee0: 20 20 20 20 20 20 20 20 22 20 20 20 20 70 72 69          "    pri
7ef0: 6f 72 69 74 79 2e 5c 6e 5c 6e 22 0a 20 20 20 20  ority.\n\n".    
7f00: 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
7f10: 7a 56 61 6c 75 65 20 3d 20 64 62 5f 67 65 74 28  zValue = db_get(
7f20: 22 73 73 6c 2d 63 61 2d 6c 6f 63 61 74 69 6f 6e  "ssl-ca-location
7f30: 22 2c 22 22 29 3b 0a 20 20 20 20 74 72 75 73 74  ","");.    trust
7f40: 5f 6c 6f 63 61 74 69 6f 6e 5f 75 73 61 62 6c 65  _location_usable
7f50: 28 7a 56 61 6c 75 65 2c 20 26 7a 55 73 65 64 29  (zValue, &zUsed)
7f60: 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69  ;.    fossil_pri
7f70: 6e 74 28 22 20 20 73 73 6c 2d 63 61 2d 6c 6f 63  nt("  ssl-ca-loc
7f80: 61 74 69 6f 6e 3a 20 20 20 20 25 73 5c 6e 22 2c  ation:    %s\n",
7f90: 20 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 69 66   zValue);.    if
7fa0: 28 20 76 65 72 62 6f 73 65 20 29 7b 0a 20 20 20  ( verbose ){.   
7fb0: 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28     fossil_print(
7fc0: 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20  "\n".         " 
7fd0: 20 20 20 54 68 69 73 20 73 65 74 74 69 6e 67 20     This setting 
7fe0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
7ff0: 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63 74 6f   file or directo
8000: 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
8010: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20 20  \n".         "  
8020: 20 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73    the complete s
8030: 65 74 20 6f 66 20 72 6f 6f 74 20 63 65 72 74 69  et of root certi
8040: 66 69 63 61 74 65 73 20 75 73 65 64 20 62 79 20  ficates used by 
8050: 46 6f 73 73 69 6c 20 77 68 65 6e 20 69 74 5c 6e  Fossil when it\n
8060: 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 20 20  ".         "    
8070: 69 73 20 61 63 74 69 6e 67 20 61 73 20 61 20 53  is acting as a S
8080: 53 4c 20 63 6c 69 65 6e 74 2e 20 49 66 20 64 65  SL client. If de
8090: 66 69 6e 65 64 2c 20 74 68 69 73 20 73 65 74 74  fined, this sett
80a0: 69 6e 67 20 74 61 6b 65 73 5c 6e 22 0a 20 20 20  ing takes\n".   
80b0: 20 20 20 20 20 20 22 20 20 20 20 70 72 69 6f 72        "    prior
80c0: 69 74 79 20 6f 76 65 72 20 62 75 69 6c 74 2d 69  ity over built-i
80d0: 6e 20 70 61 74 68 73 2e 5c 6e 5c 6e 22 0a 20 20  n paths.\n\n".  
80e0: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 0a 20      );.    }... 
80f0: 20 20 20 7a 56 61 6c 75 65 20 3d 20 58 35 30 39     zValue = X509
8100: 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72  _get_default_cer
8110: 74 5f 66 69 6c 65 28 29 3b 0a 20 20 20 20 74 72  t_file();.    tr
8120: 75 73 74 5f 6c 6f 63 61 74 69 6f 6e 5f 75 73 61  ust_location_usa
8130: 62 6c 65 28 7a 56 61 6c 75 65 2c 20 26 7a 55 73  ble(zValue, &zUs
8140: 65 64 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  ed);.    fossil_
8150: 70 72 69 6e 74 28 22 20 20 4f 70 65 6e 53 53 4c  print("  OpenSSL
8160: 2d 63 65 72 74 2d 66 69 6c 65 3a 20 20 25 73 5c  -cert-file:  %s\
8170: 6e 22 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 20 20  n", zValue);.   
8180: 20 7a 56 61 6c 75 65 20 3d 20 58 35 30 39 5f 67   zValue = X509_g
8190: 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f  et_default_cert_
81a0: 64 69 72 28 29 3b 0a 20 20 20 20 74 72 75 73 74  dir();.    trust
81b0: 5f 6c 6f 63 61 74 69 6f 6e 5f 75 73 61 62 6c 65  _location_usable
81c0: 28 7a 56 61 6c 75 65 2c 20 26 7a 55 73 65 64 29  (zValue, &zUsed)
81d0: 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69  ;.    fossil_pri
81e0: 6e 74 28 22 20 20 4f 70 65 6e 53 53 4c 2d 63 65  nt("  OpenSSL-ce
81f0: 72 74 2d 64 69 72 3a 20 20 20 25 73 5c 6e 22 2c  rt-dir:   %s\n",
8200: 20 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c   X509_get_defaul
8210: 74 5f 63 65 72 74 5f 64 69 72 28 29 29 3b 0a 20  t_cert_dir());. 
8220: 20 20 20 69 66 28 20 76 65 72 62 6f 73 65 20 29     if( verbose )
8230: 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70  {.      fossil_p
8240: 72 69 6e 74 28 22 5c 6e 22 0a 20 20 20 20 20 20  rint("\n".      
8250: 20 20 20 22 20 20 20 20 54 68 65 20 64 65 66 61     "    The defa
8260: 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 73 20 66 6f  ult locations fo
8270: 72 20 74 68 65 20 73 65 74 20 6f 66 20 72 6f 6f  r the set of roo
8280: 74 20 63 65 72 74 69 66 69 63 61 74 65 73 5c 6e  t certificates\n
8290: 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 20 20  ".         "    
82a0: 75 73 65 64 20 62 79 20 74 68 65 20 5c 22 66 6f  used by the \"fo
82b0: 73 73 69 6c 20 73 79 6e 63 5c 22 20 61 6e 64 20  ssil sync\" and 
82c0: 73 69 6d 69 6c 61 72 20 63 6f 6d 6d 61 6e 64 73  similar commands
82d0: 20 74 6f 20 76 65 72 69 66 79 5c 6e 22 0a 20 20   to verify\n".  
82e0: 20 20 20 20 20 20 20 22 20 20 20 20 74 68 65 20         "    the 
82f0: 69 64 65 6e 74 69 74 79 20 6f 66 20 73 65 72 76  identity of serv
8300: 65 72 73 20 66 6f 72 20 5c 22 68 74 74 70 73 3a  ers for \"https:
8310: 5c 22 20 55 52 4c 73 2e 20 54 68 65 73 65 20 76  \" URLs. These v
8320: 61 6c 75 65 73 5c 6e 22 0a 20 20 20 20 20 20 20  alues\n".       
8330: 20 20 22 20 20 20 20 63 6f 6d 65 20 69 6e 74 6f    "    come into
8340: 20 70 6c 61 79 20 77 68 65 6e 20 46 6f 73 73 69   play when Fossi
8350: 6c 20 69 73 20 75 73 65 64 20 61 73 20 61 20 54  l is used as a T
8360: 4c 53 20 63 6c 69 65 6e 74 2e 20 20 54 68 65 73  LS client.  Thes
8370: 65 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20  e\n".         " 
8380: 20 20 20 76 61 6c 75 65 73 20 61 72 65 20 62 75     values are bu
8390: 69 6c 74 20 69 6e 74 6f 20 79 6f 75 72 20 4f 70  ilt into your Op
83a0: 65 6e 53 53 4c 20 6c 69 62 72 61 72 79 2e 5c 6e  enSSL library.\n
83b0: 5c 6e 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  \n".      );.   
83c0: 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
83d0: 5f 57 49 4e 33 32 29 0a 23 69 66 20 4f 50 45 4e  _WIN32).#if OPEN
83e0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
83f0: 45 52 20 3e 3d 20 30 78 30 33 30 32 30 30 30 30  ER >= 0x03020000
8400: 30 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69  0.    fossil_pri
8410: 6e 74 28 22 20 20 4f 70 65 6e 53 53 4c 2d 77 69  nt("  OpenSSL-wi
8420: 6e 73 74 6f 72 65 3a 20 20 20 59 65 73 5c 6e 22  nstore:   Yes\n"
8430: 29 3b 0a 23 65 6c 73 65 20 2f 2a 20 4f 50 45 4e  );.#else /* OPEN
8440: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
8450: 45 52 20 3e 3d 20 30 78 30 33 30 32 30 30 30 30  ER >= 0x03020000
8460: 30 20 2a 2f 0a 20 20 20 20 66 6f 73 73 69 6c 5f  0 */.    fossil_
8470: 70 72 69 6e 74 28 22 20 20 4f 70 65 6e 53 53 4c  print("  OpenSSL
8480: 2d 77 69 6e 73 74 6f 72 65 3a 20 20 20 4e 6f 5c  -winstore:   No\
8490: 6e 22 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  n");.#endif /* O
84a0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
84b0: 55 4d 42 45 52 20 3e 3d 20 30 78 30 33 30 32 30  UMBER >= 0x03020
84c0: 30 30 30 30 20 2a 2f 0a 20 20 20 20 69 66 28 20  0000 */.    if( 
84d0: 76 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  verbose ){.     
84e0: 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 5c   fossil_print("\
84f0: 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 20  n".         "   
8500: 20 4f 70 65 6e 53 53 4c 20 33 2e 32 2e 30 2c 20   OpenSSL 3.2.0, 
8510: 6f 72 20 6e 65 77 65 72 2c 20 75 73 65 20 74 68  or newer, use th
8520: 65 20 72 6f 6f 74 20 63 65 72 74 69 66 69 63 61  e root certifica
8530: 74 65 73 20 6d 61 6e 61 67 65 64 20 62 79 5c 6e  tes managed by\n
8540: 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 20 20  ".         "    
8550: 74 68 65 20 57 69 6e 64 6f 77 73 20 6f 70 65 72  the Windows oper
8560: 61 74 69 6e 67 20 73 79 73 74 65 6d 2e 20 54 68  ating system. Th
8570: 65 20 69 6e 73 74 61 6c 6c 65 64 20 72 6f 6f 74  e installed root
8580: 20 63 65 72 74 69 66 69 63 61 74 65 73 5c 6e 22   certificates\n"
8590: 0a 20 20 20 20 20 20 20 20 20 22 20 20 20 20 61  .         "    a
85a0: 72 65 20 6c 69 73 74 65 64 20 62 79 20 74 68 65  re listed by the
85b0: 20 63 6f 6d 6d 61 6e 64 3a 5c 6e 5c 6e 22 0a 20   command:\n\n". 
85c0: 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20          "       
85d0: 20 63 65 72 74 75 74 69 6c 20 2d 73 74 6f 72 65   certutil -store
85e0: 20 5c 22 52 4f 4f 54 5c 22 5c 6e 5c 6e 22 0a 20   \"ROOT\"\n\n". 
85f0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65       );.    }.#e
8600: 6e 64 69 66 20 2f 2a 20 5f 57 49 4e 33 32 20 2a  ndif /* _WIN32 *
8610: 2f 0a 0a 20 20 20 20 69 66 28 20 7a 55 73 65 64  /..    if( zUsed
8620: 3d 3d 30 20 29 20 7a 55 73 65 64 20 3d 20 22 22  ==0 ) zUsed = ""
8630: 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69  ;.    fossil_pri
8640: 6e 74 28 22 20 20 54 72 75 73 74 20 73 74 6f 72  nt("  Trust stor
8650: 65 20 75 73 65 64 3a 20 20 20 25 73 5c 6e 22 2c  e used:   %s\n",
8660: 20 7a 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28   zUsed);.    if(
8670: 20 76 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20   verbose ){.    
8680: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
8690: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20 20  \n".         "  
86a0: 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74    The location t
86b0: 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  hat is actually 
86c0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f  used for the roo
86d0: 74 20 63 65 72 74 69 66 69 63 61 74 65 73 5c 6e  t certificates\n
86e0: 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 20 20  ".         "    
86f0: 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 74  used to verify t
8700: 68 65 20 69 64 65 6e 74 69 74 79 20 6f 66 20 73  he identity of s
8710: 65 72 76 65 72 73 20 66 6f 72 20 5c 22 68 74 74  ervers for \"htt
8720: 70 73 3a 5c 22 20 55 52 4c 73 2e 5c 6e 22 0a 20  ps:\" URLs.\n". 
8730: 20 20 20 20 20 20 20 20 22 20 20 20 20 54 68 69          "    Thi
8740: 73 20 77 69 6c 6c 20 62 65 20 6f 6e 65 20 6f 66  s will be one of
8750: 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 74 68   the first of th
8760: 65 20 66 69 76 65 20 6c 6f 63 61 74 69 6f 6e 73  e five locations
8770: 20 6c 69 73 74 65 64 5c 6e 22 0a 20 20 20 20 20   listed\n".     
8780: 20 20 20 20 22 20 20 20 20 61 62 6f 76 65 20 74      "    above t
8790: 68 61 74 20 61 63 74 75 61 6c 6c 79 20 65 78 69  hat actually exi
87a0: 73 74 73 2e 5c 6e 5c 6e 22 0a 20 20 20 20 20 20  sts.\n\n".      
87b0: 29 3b 0a 20 20 20 20 7d 0a 0a 0a 23 65 6e 64 69  );.    }...#endi
87c0: 66 20 2f 2a 20 46 4f 53 53 49 4c 5f 45 4e 41 42  f /* FOSSIL_ENAB
87d0: 4c 45 5f 53 53 4c 20 2a 2f 0a 0a 0a 20 20 20 20  LE_SSL */...    
87e0: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 73 73  fossil_print("ss
87f0: 6c 2d 69 64 65 6e 74 69 74 79 3a 20 20 20 20 20  l-identity:     
8800: 20 20 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74     %s\n", db_get
8810: 28 22 73 73 6c 2d 69 64 65 6e 74 69 74 79 22 2c  ("ssl-identity",
8820: 22 22 29 29 3b 0a 20 20 20 20 69 66 28 20 76 65  ""));.    if( ve
8830: 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 66  rbose ){.      f
8840: 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 5c 6e 22  ossil_print("\n"
8850: 0a 20 20 20 20 20 20 20 20 22 20 20 54 68 69 73  .        "  This
8860: 20 73 65 74 74 69 6e 67 20 69 73 20 74 68 65 20   setting is the 
8870: 6e 61 6d 65 20 6f 66 20 61 20 66 69 6c 65 20 74  name of a file t
8880: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
8890: 20 50 45 4d 2d 66 6f 72 6d 61 74 5c 6e 22 0a 20   PEM-format\n". 
88a0: 20 20 20 20 20 20 20 22 20 20 63 65 72 74 69 66         "  certif
88b0: 69 63 61 74 65 20 61 6e 64 20 70 72 69 76 61 74  icate and privat
88c0: 65 2d 6b 65 79 20 75 73 65 64 20 62 79 20 46 6f  e-key used by Fo
88d0: 73 73 69 6c 20 63 6c 69 65 6e 74 73 20 74 6f 20  ssil clients to 
88e0: 61 75 74 68 65 6e 74 69 63 61 74 65 5c 6e 22 0a  authenticate\n".
88f0: 20 20 20 20 20 20 20 20 22 20 20 77 69 74 68 20          "  with 
8900: 73 65 72 76 65 72 73 2e 20 46 65 77 20 73 65 72  servers. Few ser
8910: 76 65 72 73 20 61 63 74 75 61 6c 6c 79 20 72 65  vers actually re
8920: 71 75 69 72 65 20 74 68 69 73 2c 20 73 6f 20 74  quire this, so t
8930: 68 69 73 20 73 65 74 74 69 6e 67 5c 6e 22 0a 20  his setting\n". 
8940: 20 20 20 20 20 20 20 22 20 20 69 73 20 75 73 75         "  is usu
8950: 61 6c 6c 79 20 62 6c 61 6e 6b 2e 5c 6e 5c 6e 22  ally blank.\n\n"
8960: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
8970: 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 28  .    db_prepare(
8980: 26 71 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  &q,.       "SELE
8990: 43 54 20 6e 61 6d 65 2c 20 27 27 2c 20 76 61 6c  CT name, '', val
89a0: 75 65 20 46 52 4f 4d 20 67 6c 6f 62 61 6c 5f 63  ue FROM global_c
89b0: 6f 6e 66 69 67 22 0a 20 20 20 20 20 20 20 22 20  onfig".       " 
89c0: 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20  WHERE name GLOB 
89d0: 27 63 65 72 74 3a 2a 27 22 0a 20 20 20 20 20 20  'cert:*'".      
89e0: 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20   "UNION ALL ".  
89f0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
8a00: 65 2c 20 64 61 74 65 28 6d 74 69 6d 65 2c 27 75  e, date(mtime,'u
8a10: 6e 69 78 65 70 6f 63 68 27 29 2c 20 76 61 6c 75  nixepoch'), valu
8a20: 65 20 46 52 4f 4d 20 63 6f 6e 66 69 67 22 0a 20  e FROM config". 
8a30: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6e 61        " WHERE na
8a40: 6d 65 20 47 4c 4f 42 20 27 63 65 72 74 3a 2a 27  me GLOB 'cert:*'
8a50: 22 0a 20 20 20 20 20 20 20 22 20 4f 52 44 45 52  ".       " ORDER
8a60: 20 42 59 20 6e 61 6d 65 22 0a 20 20 20 20 29 3b   BY name".    );
8a70: 0a 20 20 20 20 6e 48 69 74 20 3d 20 30 3b 0a 20  .    nHit = 0;. 
8a80: 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65     while( db_ste
8a90: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
8aa0: 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  W ){.           
8ab0: 20 20 20 20 20 2f 2a 20 20 31 32 33 34 35 36 37       /*  1234567
8ac0: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
8ad0: 34 35 36 37 38 39 20 2a 2f 0a 20 20 20 20 20 20  456789 */.      
8ae0: 69 66 28 20 76 65 72 62 6f 73 65 20 29 7b 0a 20  if( verbose ){. 
8af0: 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72         fossil_pr
8b00: 69 6e 74 28 22 65 78 63 65 70 74 69 6f 6e 3a 20  int("exception: 
8b10: 20 20 20 20 20 20 20 20 20 20 20 25 2d 34 30 73             %-40s
8b20: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 20 20 20   %s\n".         
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20              "   
8b40: 20 20 68 61 73 68 3a 20 20 20 20 20 20 20 20 20    hash:         
8b50: 20 20 20 25 2e 35 37 73 5c 6e 22 2c 0a 20 20 20     %.57s\n",.   
8b60: 20 20 20 20 20 20 20 20 20 20 64 62 5f 63 6f 6c            db_col
8b70: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 30 29 2b 35  umn_text(&q,0)+5
8b80: 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  , db_column_text
8b90: 28 26 71 2c 31 29 2c 0a 20 20 20 20 20 20 20 20  (&q,1),.        
8ba0: 20 20 20 20 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74       db_column_t
8bb0: 65 78 74 28 26 71 2c 32 29 29 3b 0a 20 20 20 20  ext(&q,2));.    
8bc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8bd0: 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 65   fossil_print("e
8be0: 78 63 65 70 74 69 6f 6e 3a 20 20 20 20 20 20 20  xception:       
8bf0: 20 20 20 20 20 25 2d 34 30 73 20 25 73 5c 6e 22       %-40s %s\n"
8c00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 64  ,.             d
8c10: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
8c20: 2c 30 29 2b 35 2c 20 64 62 5f 63 6f 6c 75 6d 6e  ,0)+5, db_column
8c30: 5f 74 65 78 74 28 26 71 2c 31 29 29 3b 0a 20 20  _text(&q,1));.  
8c40: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 48 69 74      }.      nHit
8c50: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  ++;.    }.    db
8c60: 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20  _finalize(&q);. 
8c70: 20 20 20 69 66 28 20 6e 48 69 74 20 26 26 20 76     if( nHit && v
8c80: 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
8c90: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 5c 6e  fossil_print("\n
8ca0: 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 54 68  ".         "  Th
8cb0: 65 20 65 78 63 65 70 74 69 6f 6e 73 20 61 72 65  e exceptions are
8cc0: 20 73 65 72 76 65 72 20 63 65 72 74 69 66 69 63   server certific
8cd0: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 46 6f  ates that the Fo
8ce0: 73 73 69 6c 20 63 6c 69 65 6e 74 5c 6e 22 0a 20  ssil client\n". 
8cf0: 20 20 20 20 20 20 20 20 22 20 20 69 73 20 75 6e          "  is un
8d00: 61 62 6c 65 20 74 6f 20 76 65 72 69 66 79 20 75  able to verify u
8d10: 73 69 6e 67 20 72 6f 6f 74 20 63 65 72 74 69 66  sing root certif
8d20: 69 63 61 74 65 73 2c 20 62 75 74 20 77 68 69 63  icates, but whic
8d30: 68 20 73 68 6f 75 6c 64 20 62 65 5c 6e 22 0a 20  h should be\n". 
8d40: 20 20 20 20 20 20 20 20 22 20 20 61 63 63 65 70          "  accep
8d50: 74 65 64 20 61 6e 79 68 6f 77 2e 5c 6e 5c 6e 22  ted anyhow.\n\n"
8d60: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
8d70: 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 73  .  }else.  if( s
8d80: 74 72 6e 63 6d 70 28 22 72 65 6d 6f 76 65 2d 65  trncmp("remove-e
8d90: 78 63 65 70 74 69 6f 6e 22 2c 7a 43 6d 64 2c 6e  xception",zCmd,n
8da0: 43 6d 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Cmd)==0 ){.    i
8db0: 6e 74 20 69 3b 0a 20 20 20 20 42 6c 6f 62 20 73  nt i;.    Blob s
8dc0: 71 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  ql;.    char *zS
8dd0: 65 70 20 3d 20 22 28 22 3b 0a 20 20 20 20 64 62  ep = "(";.    db
8de0: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
8df0: 6f 6e 28 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 69  on();.    blob_i
8e00: 6e 69 74 28 26 73 71 6c 2c 20 30 2c 20 30 29 3b  nit(&sql, 0, 0);
8e10: 0a 20 20 20 20 69 66 28 20 67 2e 61 72 67 63 3d  .    if( g.argc=
8e20: 3d 34 20 26 26 20 66 69 6e 64 5f 6f 70 74 69 6f  =4 && find_optio
8e30: 6e 28 22 61 6c 6c 22 2c 30 2c 30 29 21 3d 30 20  n("all",0,0)!=0 
8e40: 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  ){.      blob_ap
8e50: 70 65 6e 64 5f 73 71 6c 28 26 73 71 6c 2c 0a 20  pend_sql(&sql,. 
8e60: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
8e70: 52 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69  ROM global_confi
8e80: 67 20 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f  g WHERE name GLO
8e90: 42 20 27 63 65 72 74 3a 2a 27 3b 5c 6e 22 0a 20  B 'cert:*';\n". 
8ea0: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
8eb0: 52 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69  ROM global_confi
8ec0: 67 20 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f  g WHERE name GLO
8ed0: 42 20 27 74 72 75 73 74 65 64 3a 2a 27 3b 5c 6e  B 'trusted:*';\n
8ee0: 22 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ".        "DELET
8ef0: 45 20 46 52 4f 4d 20 63 6f 6e 66 69 67 20 57 48  E FROM config WH
8f00: 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27 63  ERE name GLOB 'c
8f10: 65 72 74 3a 2a 27 3b 5c 6e 22 0a 20 20 20 20 20  ert:*';\n".     
8f20: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
8f30: 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d  config WHERE nam
8f40: 65 20 47 4c 4f 42 20 27 74 72 75 73 74 65 64 3a  e GLOB 'trusted:
8f50: 2a 27 3b 5c 6e 22 0a 20 20 20 20 20 20 29 3b 0a  *';\n".      );.
8f60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8f70: 20 69 66 28 20 67 2e 61 72 67 63 3c 34 20 29 7b   if( g.argc<4 ){
8f80: 0a 20 20 20 20 20 20 20 20 75 73 61 67 65 28 22  .        usage("
8f90: 72 65 6d 6f 76 65 2d 65 78 63 65 70 74 69 6f 6e  remove-exception
8fa0: 20 44 4f 4d 41 49 4e 2d 4e 41 4d 45 20 2e 2e 2e   DOMAIN-NAME ...
8fb0: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
8fc0: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 5f 73 71    blob_append_sq
8fd0: 6c 28 26 73 71 6c 2c 22 44 45 4c 45 54 45 20 46  l(&sql,"DELETE F
8fe0: 52 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69  ROM global_confi
8ff0: 67 20 57 48 45 52 45 20 6e 61 6d 65 20 49 4e 20  g WHERE name IN 
9000: 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
9010: 33 3b 20 69 3c 67 2e 61 72 67 63 3b 20 69 2b 2b  3; i<g.argc; i++
9020: 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f  ){.        blob_
9030: 61 70 70 65 6e 64 5f 73 71 6c 28 26 73 71 6c 2c  append_sql(&sql,
9040: 22 25 73 27 63 65 72 74 3a 25 71 27 2c 27 74 72  "%s'cert:%q','tr
9050: 75 73 74 3a 25 71 27 22 2c 0a 20 20 20 20 20 20  ust:%q'",.      
9060: 20 20 20 20 20 7a 53 65 70 2f 2a 73 61 66 65 2d       zSep/*safe-
9070: 66 6f 72 2d 25 73 2a 2f 2c 20 67 2e 61 72 67 76  for-%s*/, g.argv
9080: 5b 69 5d 2c 20 67 2e 61 72 67 76 5b 69 5d 29 3b  [i], g.argv[i]);
9090: 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20  .        zSep = 
90a0: 22 2c 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ",";.      }.   
90b0: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 5f 73     blob_append_s
90c0: 71 6c 28 26 73 71 6c 2c 22 29 3b 5c 6e 22 29 3b  ql(&sql,");\n");
90d0: 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 28  .      zSep = "(
90e0: 22 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  ";.      blob_ap
90f0: 70 65 6e 64 5f 73 71 6c 28 26 73 71 6c 2c 22 44  pend_sql(&sql,"D
9100: 45 4c 45 54 45 20 46 52 4f 4d 20 63 6f 6e 66 69  ELETE FROM confi
9110: 67 20 57 48 45 52 45 20 6e 61 6d 65 20 49 4e 20  g WHERE name IN 
9120: 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
9130: 33 3b 20 69 3c 67 2e 61 72 67 63 3b 20 69 2b 2b  3; i<g.argc; i++
9140: 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f  ){.        blob_
9150: 61 70 70 65 6e 64 5f 73 71 6c 28 26 73 71 6c 2c  append_sql(&sql,
9160: 22 25 73 27 63 65 72 74 3a 25 71 27 2c 27 74 72  "%s'cert:%q','tr
9170: 75 73 74 65 64 3a 25 71 27 22 2c 0a 20 20 20 20  usted:%q'",.    
9180: 20 20 20 20 20 20 20 7a 53 65 70 2f 2a 73 61 66         zSep/*saf
9190: 65 2d 66 6f 72 2d 25 73 2a 2f 2c 20 67 2e 61 72  e-for-%s*/, g.ar
91a0: 67 76 5b 69 5d 2c 20 67 2e 61 72 67 76 5b 69 5d  gv[i], g.argv[i]
91b0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20  );.        zSep 
91c0: 3d 20 22 2c 22 3b 0a 20 20 20 20 20 20 7d 0a 20  = ",";.      }. 
91d0: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
91e0: 5f 73 71 6c 28 26 73 71 6c 2c 22 29 3b 22 29 3b  _sql(&sql,");");
91f0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 75 6e  .    }.    db_un
9200: 70 72 6f 74 65 63 74 28 50 52 4f 54 45 43 54 5f  protect(PROTECT_
9210: 43 4f 4e 46 49 47 29 3b 0a 20 20 20 20 64 62 5f  CONFIG);.    db_
9220: 65 78 65 63 5f 73 71 6c 28 62 6c 6f 62 5f 73 74  exec_sql(blob_st
9230: 72 28 26 73 71 6c 29 29 3b 0a 20 20 20 20 64 62  r(&sql));.    db
9240: 5f 70 72 6f 74 65 63 74 5f 70 6f 70 28 29 3b 0a  _protect_pop();.
9250: 20 20 20 20 64 62 5f 63 6f 6d 6d 69 74 5f 74 72      db_commit_tr
9260: 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 20  ansaction();.   
9270: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 73 71 6c   blob_reset(&sql
9280: 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 2f 2a 64  );.  }else.  /*d
9290: 65 66 61 75 6c 74 2a 2f 7b 0a 20 20 20 20 66 6f  efault*/{.    fo
92a0: 73 73 69 6c 5f 66 61 74 61 6c 28 22 75 6e 6b 6e  ssil_fatal("unkn
92b0: 6f 77 6e 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20  own sub-command 
92c0: 5c 22 25 73 5c 22 2e 5c 6e 73 68 6f 75 6c 64 20  \"%s\".\nshould 
92d0: 62 65 20 6f 6e 65 20 6f 66 3a 22 0a 20 20 20 20  be one of:".    
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 72               " r
92f0: 65 6d 6f 76 65 2d 65 78 63 65 70 74 69 6f 6e 20  emove-exception 
9300: 73 63 72 75 62 20 73 68 6f 77 22 2c 0a 20 20 20  scrub show",.   
9310: 20 20 20 20 7a 43 6d 64 29 3b 0a 20 20 7d 0a 7d      zCmd);.  }.}
9320: 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a  ../*.** WEBPAGE:
9330: 20 2e 77 65 6c 6c 2d 6b 6e 6f 77 6e 0a 2a 2a 0a   .well-known.**.
9340: 2a 2a 20 49 66 20 74 68 65 20 22 2d 2d 61 63 6d  ** If the "--acm
9350: 65 22 20 6f 70 74 69 6f 6e 20 77 61 73 20 73 75  e" option was su
9360: 70 70 6c 69 65 64 20 74 6f 20 22 66 6f 73 73 69  pplied to "fossi
9370: 6c 20 73 65 72 76 65 72 22 20 6f 72 20 22 66 6f  l server" or "fo
9380: 73 73 69 6c 20 68 74 74 70 22 20 6f 72 0a 2a 2a  ssil http" or.**
9390: 20 73 69 6d 69 6c 61 72 2c 20 74 68 65 6e 20 74   similar, then t
93a0: 68 69 73 20 70 61 67 65 20 72 65 74 75 72 6e 73  his page returns
93b0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
93c0: 66 69 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 74  files found in t
93d0: 68 65 0a 2a 2a 20 22 2e 77 65 6c 6c 2d 6b 6e 6f  he.** ".well-kno
93e0: 77 6e 22 20 73 75 62 64 69 72 65 63 74 6f 72 79  wn" subdirectory
93f0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 69 72   of the same dir
9400: 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
9410: 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 65 70 6f  ains the.** repo
9420: 73 69 74 6f 72 79 20 66 69 6c 65 2e 20 20 54 68  sitory file.  Th
9430: 69 73 20 66 61 63 69 6c 69 74 61 74 65 73 20 41  is facilitates A
9440: 75 74 6f 6d 61 74 65 64 20 43 65 72 74 69 66 69  utomated Certifi
9450: 63 61 74 65 0a 2a 2a 20 4d 61 6e 61 67 65 6d 65  cate.** Manageme
9460: 6e 74 20 75 73 69 6e 67 20 74 6f 6f 6c 73 20 6c  nt using tools l
9470: 69 6b 65 20 22 63 65 72 74 62 6f 74 22 2e 0a 2a  ike "certbot"..*
9480: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
9490: 20 69 73 20 72 65 74 75 72 6e 65 64 20 64 69 72   is returned dir
94a0: 65 63 74 6c 79 2c 20 77 69 74 68 6f 75 74 20 61  ectly, without a
94b0: 6e 79 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f  ny interpretatio
94c0: 6e 2c 20 75 73 69 6e 67 0a 2a 2a 20 61 20 67 65  n, using.** a ge
94d0: 6e 65 72 69 63 20 6d 69 6d 65 74 79 70 65 2e 0a  neric mimetype..
94e0: 2a 2f 0a 76 6f 69 64 20 77 65 6c 6c 6b 6e 6f 77  */.void wellknow
94f0: 6e 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20  n_page(void){.  
9500: 63 68 61 72 20 2a 7a 50 61 74 68 20 3d 20 30 3b  char *zPath = 0;
9510: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9520: 54 61 69 6c 20 3d 20 50 28 22 6e 61 6d 65 22 29  Tail = P("name")
9530: 3b 0a 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74  ;.  Blob content
9540: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
9550: 72 20 63 3b 0a 20 20 69 66 28 20 21 67 2e 66 41  r c;.  if( !g.fA
9560: 6c 6c 6f 77 41 43 4d 45 20 29 20 67 6f 74 6f 20  llowACME ) goto 
9570: 77 65 6c 6c 6b 6e 6f 77 6e 5f 6e 6f 74 66 6f 75  wellknown_notfou
9580: 6e 64 3b 0a 20 20 69 66 28 20 67 2e 7a 52 65 70  nd;.  if( g.zRep
9590: 6f 73 69 74 6f 72 79 4e 61 6d 65 3d 3d 30 20 29  ositoryName==0 )
95a0: 20 67 6f 74 6f 20 77 65 6c 6c 6b 6e 6f 77 6e 5f   goto wellknown_
95b0: 6e 6f 74 66 6f 75 6e 64 3b 0a 20 20 69 66 28 20  notfound;.  if( 
95c0: 7a 54 61 69 6c 3d 3d 30 20 29 20 67 6f 74 6f 20  zTail==0 ) goto 
95d0: 77 65 6c 6c 6b 6e 6f 77 6e 5f 6e 6f 74 66 6f 75  wellknown_notfou
95e0: 6e 64 3b 0a 20 20 7a 50 61 74 68 20 3d 20 6d 70  nd;.  zPath = mp
95f0: 72 69 6e 74 66 28 22 25 7a 2f 2e 77 65 6c 6c 2d  rintf("%z/.well-
9600: 6b 6e 6f 77 6e 2f 25 73 22 2c 20 66 69 6c 65 5f  known/%s", file_
9610: 64 69 72 6e 61 6d 65 28 67 2e 7a 52 65 70 6f 73  dirname(g.zRepos
9620: 69 74 6f 72 79 4e 61 6d 65 29 2c 20 7a 54 61 69  itoryName), zTai
9630: 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28  l);.  for(i=0; (
9640: 63 20 3d 20 7a 54 61 69 6c 5b 69 5d 29 21 3d 30  c = zTail[i])!=0
9650: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
9660: 66 6f 73 73 69 6c 5f 69 73 61 6c 6e 75 6d 28 63  fossil_isalnum(c
9670: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
9680: 20 20 69 66 28 20 63 3d 3d 27 2e 27 20 29 7b 0a    if( c=='.' ){.
9690: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 7c        if( i==0 |
96a0: 7c 20 7a 54 61 69 6c 5b 69 2d 31 5d 3d 3d 27 2f  | zTail[i-1]=='/
96b0: 27 20 7c 7c 20 7a 54 61 69 6c 5b 69 2d 31 5d 3d  ' || zTail[i-1]=
96c0: 3d 27 2e 27 20 29 20 67 6f 74 6f 20 77 65 6c 6c  ='.' ) goto well
96d0: 6b 6e 6f 77 6e 5f 6e 6f 74 66 6f 75 6e 64 3b 0a  known_notfound;.
96e0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
96f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d      }.    if( c=
9700: 3d 27 2c 27 20 7c 7c 20 63 21 3d 27 2d 27 20 7c  =',' || c!='-' |
9710: 7c 20 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27  | c=='/' || c=='
9720: 3a 27 20 7c 7c 20 63 3d 3d 27 5f 27 20 7c 7c 20  :' || c=='_' || 
9730: 63 3d 3d 27 7e 27 20 29 20 63 6f 6e 74 69 6e 75  c=='~' ) continu
9740: 65 3b 0a 20 20 20 20 67 6f 74 6f 20 77 65 6c 6c  e;.    goto well
9750: 6b 6e 6f 77 6e 5f 6e 6f 74 66 6f 75 6e 64 3b 0a  known_notfound;.
9760: 20 20 7d 0a 20 20 69 66 28 20 73 74 72 73 74 72    }.  if( strstr
9770: 28 22 2f 2e 2e 22 2c 20 7a 50 61 74 68 29 21 3d  ("/..", zPath)!=
9780: 30 20 29 20 67 6f 74 6f 20 77 65 6c 6c 6b 6e 6f  0 ) goto wellkno
9790: 77 6e 5f 6e 6f 74 66 6f 75 6e 64 3b 0a 20 20 69  wn_notfound;.  i
97a0: 66 28 20 21 66 69 6c 65 5f 69 73 66 69 6c 65 28  f( !file_isfile(
97b0: 7a 50 61 74 68 2c 20 45 78 74 46 49 4c 45 29 20  zPath, ExtFILE) 
97c0: 29 20 67 6f 74 6f 20 77 65 6c 6c 6b 6e 6f 77 6e  ) goto wellknown
97d0: 5f 6e 6f 74 66 6f 75 6e 64 3b 0a 20 20 62 6c 6f  _notfound;.  blo
97e0: 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 66 69 6c 65  b_read_from_file
97f0: 28 26 63 6f 6e 74 65 6e 74 2c 20 7a 50 61 74 68  (&content, zPath
9800: 2c 20 45 78 74 46 49 4c 45 29 3b 0a 20 20 63 67  , ExtFILE);.  cg
9810: 69 5f 73 65 74 5f 63 6f 6e 74 65 6e 74 28 26 63  i_set_content(&c
9820: 6f 6e 74 65 6e 74 29 3b 0a 20 20 63 67 69 5f 73  ontent);.  cgi_s
9830: 65 74 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65 28  et_content_type(
9840: 6d 69 6d 65 74 79 70 65 5f 66 72 6f 6d 5f 6e 61  mimetype_from_na
9850: 6d 65 28 7a 50 61 74 68 29 29 3b 0a 20 20 63 67  me(zPath));.  cg
9860: 69 5f 72 65 70 6c 79 28 29 3b 0a 20 20 72 65 74  i_reply();.  ret
9870: 75 72 6e 3b 0a 0a 77 65 6c 6c 6b 6e 6f 77 6e 5f  urn;..wellknown_
9880: 6e 6f 74 66 6f 75 6e 64 3a 0a 20 20 66 6f 73 73  notfound:.  foss
9890: 69 6c 5f 66 72 65 65 28 7a 50 61 74 68 29 3b 0a  il_free(zPath);.
98a0: 20 20 77 65 62 70 61 67 65 5f 6e 6f 74 66 6f 75    webpage_notfou
98b0: 6e 64 5f 65 72 72 6f 72 28 30 20 2f 2a 77 6f 72  nd_error(0 /*wor
98c0: 6b 73 2d 6c 69 6b 65 3a 22 22 2a 2f 29 3b 0a 20  ks-like:""*/);. 
98d0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
98e0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 4f 70 65  * Return the Ope
98f0: 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 6e 75 6d  nSSL version num
9900: 62 65 72 20 62 65 69 6e 67 20 75 73 65 64 2e 20  ber being used. 
9910: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 0a 2a   Space to hold.*
9920: 2a 20 74 68 69 73 20 6e 61 6d 65 20 69 73 20 6f  * this name is o
9930: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 66 6f 73  btained from fos
9940: 73 69 6c 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  sil_malloc() and
9950: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 66 72   should be.** fr
9960: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
9970: 72 2e 0a 2a 2f 0a 63 68 61 72 20 2a 66 6f 73 73  r..*/.char *foss
9980: 69 6c 5f 6f 70 65 6e 73 73 6c 5f 76 65 72 73 69  il_openssl_versi
9990: 6f 6e 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65  on(void){.#if de
99a0: 66 69 6e 65 64 28 46 4f 53 53 49 4c 5f 45 4e 41  fined(FOSSIL_ENA
99b0: 42 4c 45 5f 53 53 4c 29 0a 20 20 72 65 74 75 72  BLE_SSL).  retur
99c0: 6e 20 6d 70 72 69 6e 74 66 28 22 25 73 20 28 30  n mprintf("%s (0
99d0: 78 25 30 39 78 29 5c 6e 22 2c 0a 20 20 20 20 20  x%09x)\n",.     
99e0: 20 20 20 20 53 53 4c 65 61 79 5f 76 65 72 73 69      SSLeay_versi
99f0: 6f 6e 28 53 53 4c 45 41 59 5f 56 45 52 53 49 4f  on(SSLEAY_VERSIO
9a00: 4e 29 2c 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  N), OPENSSL_VERS
9a10: 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 23 65 6c  ION_NUMBER);.#el
9a20: 73 65 0a 20 20 72 65 74 75 72 6e 20 6d 70 72 69  se.  return mpri
9a30: 6e 74 66 28 22 6e 6f 6e 65 22 29 3b 0a 23 65 6e  ntf("none");.#en
9a40: 64 69 66 0a 7d 0a                                dif.}.