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