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