0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61 (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69 some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68 ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32 pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72 ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79 poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53 right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29 *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61 2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 ka SSL) Channel
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68 st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65 based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64 * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61 dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64 .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74 ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 full fileevent
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 Also work done
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68 ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 e impetus to do
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 pts.h".#include
0360: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63 "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e include <stdlib.
0390: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 h>.#include <ope
03a0: 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a 23 69 6e 63 nssl/ssl.h>.#inc
03b0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72 lude <openssl/cr
03c0: 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 ypto.h>.#include
03d0: 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 73 <openssl/openss
03e0: 6c 63 6f 6e 66 2e 68 3e 0a 23 69 6e 63 6c 75 64 lconf.h>.#includ
03f0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 72 73 61 2e 68 e <openssl/rsa.h
0400: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e >.#include <open
0410: 73 73 6c 2f 73 61 66 65 73 74 61 63 6b 2e 68 3e ssl/safestack.h>
0420: 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 65 6e 53 53 4c ../* Min OpenSSL
0430: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 69 66 20 version */.#if
0440: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
0450: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 NUMBER < 0x10101
0460: 30 30 30 4c 0a 23 65 72 72 6f 72 20 22 4f 6e 6c 000L.#error "Onl
0470: 79 20 4f 70 65 6e 53 53 4c 20 76 31 2e 31 2e 31 y OpenSSL v1.1.1
0480: 20 6f 72 20 6c 61 74 65 72 20 69 73 20 73 75 70 or later is sup
0490: 70 6f 72 74 65 64 22 0a 23 65 6e 64 69 66 0a 0a ported".#endif..
04a0: 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20 64 ./*. * Forward d
04b0: 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a eclarations. */.
04c0: 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b 65 79 .#define F2N(key
04d0: 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b 65 79 , dsp) \..(((key
04e0: 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 63 68 ) == NULL) ? (ch
04f0: 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c 0a 09 ar *) NULL : \..
0500: 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 .Tcl_TranslateFi
0510: 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 28 leName(interp, (
0520: 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a 0a 73 key), (dsp)))..s
0530: 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 43 tatic SSL_CTX *C
0540: 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 TX_Init(State *s
0550: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 tatePtr, int isS
0560: 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f erver, int proto
0570: 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09 09 63 , char *key,...c
0580: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 20 75 har *certfile, u
0590: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 nsigned char *ke
05a0: 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e 65 64 y_asn1, unsigned
05b0: 20 63 68 61 72 20 2a 63 65 72 74 5f 61 73 6e 31 char *cert_asn1
05c0: 2c 0a 09 09 54 63 6c 5f 53 69 7a 65 20 6b 65 79 ,...Tcl_Size key
05d0: 5f 61 73 6e 31 5f 6c 65 6e 2c 20 54 63 6c 5f 53 _asn1_len, Tcl_S
05e0: 69 7a 65 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65 ize cert_asn1_le
05f0: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c n, char *CApath,
0600: 20 63 68 61 72 20 2a 43 41 73 74 6f 72 65 2c 0a char *CAstore,.
0610: 09 09 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 ..char *CAfile,
0620: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 char *ciphers, c
0630: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 har *ciphersuite
0640: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 s, int level, ch
0650: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a ar *DHparams);..
0660: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 #define TLS_PROT
0670: 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a 23 64 65 O_SSL2..0x01.#de
0680: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 fine TLS_PROTO_S
0690: 53 4c 33 09 09 30 78 30 32 0a 23 64 65 66 69 6e SL3..0x02.#defin
06a0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
06b0: 09 09 30 78 30 34 0a 23 64 65 66 69 6e 65 20 54 ..0x04.#define T
06c0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 LS_PROTO_TLS1_1.
06d0: 30 78 30 38 0a 23 64 65 66 69 6e 65 20 54 4c 53 0x08.#define TLS
06e0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 09 30 78 _PROTO_TLS1_2.0x
06f0: 31 30 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 10.#define TLS_P
0700: 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 78 32 30 ROTO_TLS1_3.0x20
0710: 0a 23 64 65 66 69 6e 65 20 45 4e 41 42 4c 45 44 .#define ENABLED
0720: 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09 28 28 28 (flag, mask).(((
0730: 66 6c 61 67 29 20 26 20 28 6d 61 73 6b 29 29 20 flag) & (mask))
0740: 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23 64 65 66 == (mask))..#def
0750: 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47 46 49 4c ine SSLKEYLOGFIL
0760: 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47 46 49 4c E.."SSLKEYLOGFIL
0770: 45 22 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a E"..../*********
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 ***********/./*
0790: 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 20 20 Callbacks
07a0: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./***********
07b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 *********/../*.
07c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0800: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20 ----. *. * Eval
0810: 43 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64 Callback Command
0820: 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63 --. *. *.Eval c
0830: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
0840: 61 6e 64 20 63 61 74 63 68 20 61 6e 79 20 65 72 and catch any er
0850: 72 6f 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c rors. *. * Resul
0860: 74 73 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61 ts:. *.0 = Comma
0870: 6e 64 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c nd returned fail
0880: 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 or eval returne
0890: 64 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31 d TCL_ERROR. *.1
08a0: 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 = Command retur
08b0: 6e 65 64 20 73 75 63 63 65 73 73 20 6f 72 20 65 ned success or e
08c0: 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c val returned TCL
08d0: 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 _OK. *. * Side e
08e0: 66 66 65 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75 ffects:. *.Evalu
08f0: 61 74 65 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f ates callback co
0900: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d mmand. *. *-----
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
0950: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 45 76 */.static int.Ev
0960: 61 6c 43 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49 alCallback(Tcl_I
0970: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 53 nterp *interp, S
0980: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 tate *statePtr,
0990: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29 Tcl_Obj *cmdPtr)
09a0: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c {. int code,
09b0: 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 ok = 0;.. dp
09c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
09d0: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 .. Tcl_Preser
09e0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
09f0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c interp);. Tcl
0a00: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
0a10: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
0a20: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
0a30: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 73 75 63 allback with suc
0a40: 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f 72 20 72 cess for ok or r
0a50: 65 74 75 72 6e 20 76 61 6c 75 65 20 31 2c 20 66 eturn value 1, f
0a60: 61 69 6c 20 66 6f 72 20 65 72 72 6f 72 20 6f 72 ail for error or
0a70: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 30 20 return value 0
0a80: 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 */. Tcl_Reset
0a90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
0aa0: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 code = Tcl_E
0ab0: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c valObjEx(interp,
0ac0: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 cmdPtr, TCL_EVA
0ad0: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 64 L_GLOBAL);. d
0ae0: 70 72 69 6e 74 66 28 22 45 76 61 6c 43 61 6c 6c printf("EvalCall
0af0: 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f 64 65 29 back: %d", code)
0b00: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d ;. if (code =
0b10: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 = TCL_OK) {../*
0b20: 43 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72 Check result for
0b30: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f return value */
0b40: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c ..Tcl_Obj *resul
0b50: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 t = Tcl_GetObjRe
0b60: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 sult(interp);..i
0b70: 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c f (result == NUL
0b80: 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 L || Tcl_GetIntF
0b90: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 romObj(interp, r
0ba0: 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54 esult, &ok) != T
0bb0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b CL_OK) {.. ok
0bc0: 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 69 6e 74 = 1;..}..dprint
0bd0: 66 28 22 52 65 73 75 6c 74 3a 20 25 64 22 2c 20 f("Result: %d",
0be0: 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ok);. } else
0bf0: 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20 72 65 {../* Error - re
0c00: 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 66 69 ject the certifi
0c10: 63 61 74 65 20 2a 2f 0a 09 64 70 72 69 6e 74 66 cate */..dprintf
0c20: 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ("Tcl_Background
0c30: 45 72 72 6f 72 22 29 3b 0a 23 69 66 20 28 54 43 Error");.#if (TC
0c40: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MAJOR_VERSION
0c50: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 == 8) && (TCL_MI
0c60: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 NOR_VERSION < 6)
0c70: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
0c80: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 Error(interp);.#
0c90: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 else..Tcl_Backgr
0ca0: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e oundException(in
0cb0: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e terp, code);.#en
0cc0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 dif. }.. T
0cd0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
0ce0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
0cf0: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 );. Tcl_Relea
0d00: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
0d10: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 interp);. ret
0d20: 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 urn ok;.}.../*.
0d30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d70: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 ----. *. * InfoC
0d80: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a allback --. *. *
0d90: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f .Monitors SSL co
0da0: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 nnection process
0db0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
0dc0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
0dd0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
0de0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
0df0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e40: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 ---. */.static v
0e50: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b oid.InfoCallback
0e60: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c (const SSL *ssl,
0e70: 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20 int where, int
0e80: 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65 ret) {. State
0e90: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
0ea0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 ate*)SSL_get_app
0eb0: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c _data((SSL *)ssl
0ec0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 );. Tcl_Inter
0ed0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
0ee0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
0ef0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
0f00: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 r;. const cha
0f10: 72 20 2a 6d 61 6a 6f 72 2c 20 2a 6d 69 6e 6f 72 r *major, *minor
0f20: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
0f30: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
0f40: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
0f50: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
0f60: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 j*)NULL) {..retu
0f70: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 rn;. }.. i
0f80: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0f90: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 B_HANDSHAKE_STAR
0fa0: 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 T) {..major = "h
0fb0: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f andshake";..mino
0fc0: 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 r = "start";.
0fd0: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 } else if (wher
0fe0: 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 e & SSL_CB_HANDS
0ff0: 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 HAKE_DONE) {..ma
1000: 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 jor = "handshake
1010: 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e ";..minor = "don
1020: 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b e";. } else {
1030: 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 ..if (where & SS
1040: 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a L_CB_ALERT)..maj
1050: 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 or = "alert";..e
1060: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 lse if (where &
1070: 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 SSL_ST_CONNECT).
1080: 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 major = "connect
1090: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 ";..else if (whe
10a0: 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 re & SSL_ST_ACCE
10b0: 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 PT)..major = "ac
10c0: 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 cept";..else....
10d0: 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 .major = "unknow
10e0: 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 n";...if (where
10f0: 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 & SSL_CB_READ)..
1100: 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a minor = "read";.
1110: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 .else if (where
1120: 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 & SSL_CB_WRITE).
1130: 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 .minor = "write"
1140: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
1150: 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 e & SSL_CB_LOOP)
1160: 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 ..minor = "loop"
1170: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
1180: 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 e & SSL_CB_EXIT)
1190: 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 ..minor = "exit"
11a0: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f ;..else.....mino
11b0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 r = "unknown";.
11c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
11d0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
11e0: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 val with fn, cha
11f0: 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c n, major, minor,
1200: 20 6d 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79 message, and ty
1210: 70 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 pe args */. c
1220: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
1230: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
1240: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 r->callback);.
1250: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
1260: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1270: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
1280: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 ewStringObj("inf
1290: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 o", -1));. Tc
12a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
12b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
12c0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
12d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
12e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
12f0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
1300: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
1310: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1320: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1330: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
1340: 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 gObj(major, -1))
1350: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1360: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1370: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
1380: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1390: 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 minor, -1));..
13a0: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 if (where & SS
13b0: 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54 L_CB_ALERT) {..T
13c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
13d0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
13e0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
13f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
1400: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 L_alert_desc_str
1410: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d ing_long(ret), -
1420: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
1430: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1440: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
1450: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
1460: 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74 gObj(SSL_alert_t
1470: 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 ype_string_long(
1480: 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ret), -1));.
1490: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 } else {..Tcl_Li
14a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
14b0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
14c0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
14d0: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 tringObj(SSL_sta
14e0: 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 te_string_long(s
14f0: 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f sl), -1));..Tcl_
1500: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1510: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1520: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
1530: 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 ngObj("info", -1
1540: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ));. }.. /
1550: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
1560: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
1570: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
1580: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 cmdPtr);. Eva
1590: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
15a0: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
15b0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 tr);. Tcl_Dec
15c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
15d0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
1620: 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c *. * MessageCal
1630: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d lback --. *. *.M
1640: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74 onitors SSL prot
1650: 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a ocol messages. *
1660: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
1670: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
1680: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
1690: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
16a0: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d efined). *. *---
16b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 . */.#ifndef OPE
1700: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 NSSL_NO_SSL_TRAC
1710: 45 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65 E.static void.Me
1720: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e ssageCallback(in
1730: 74 20 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76 t write_p, int v
1740: 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74 ersion, int cont
1750: 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 ent_type, const
1760: 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f void *buf, size_
1770: 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c t len, SSL *ssl,
1780: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 void *arg) {.
1790: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
17a0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b r = (State*)arg;
17b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
17c0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
17d0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
17e0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
17f0: 0a 20 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20 . char *ver,
1800: 2a 74 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a *type;. BIO *
1810: 62 69 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75 bio;. char bu
1820: 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20 20 ffer[15000];.
1830: 20 62 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a buffer[0] = 0;.
1840: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
1850: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
1860: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
1870: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a ack == (Tcl_Obj*
1880: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
1890: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 ;. }.. swi
18a0: 74 63 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23 tch(version) {.#
18b0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
18c0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
18d0: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 100000L && !defi
18e0: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 ned(NO_SSL2) &&
18f0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
1900: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 _NO_SSL2). ca
1910: 73 65 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a se SSL2_VERSION:
1920: 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b ..ver = "SSLv2";
1930: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
1940: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
1950: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
1960: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
1970: 33 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 3). case SSL3
1980: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d _VERSION:..ver =
1990: 20 22 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b "SSLv3";..break
19a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 ;.#endif. cas
19b0: 65 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a e TLS1_VERSION:.
19c0: 09 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a .ver = "TLSv1";.
19d0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 .break;. case
19e0: 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a TLS1_1_VERSION:
19f0: 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31 ..ver = "TLSv1.1
1a00: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 ";..break;. c
1a10: 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49 ase TLS1_2_VERSI
1a20: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 ON:..ver = "TLSv
1a30: 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 1.2";..break;.
1a40: 20 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45 case TLS1_3_VE
1a50: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 RSION:..ver = "T
1a60: 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b LSv1.3";..break;
1a70: 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65 . case 0:..ve
1a80: 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 r = "none";..bre
1a90: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a ak;. default:
1aa0: 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e ..ver = "unknown
1ab0: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d ";..break;. }
1ac0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 63 6f .. switch (co
1ad0: 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20 ntent_type) {.
1ae0: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 case SSL3_RT_H
1af0: 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22 EADER:..type = "
1b00: 48 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b Header";..break;
1b10: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 . case SSL3_R
1b20: 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f T_INNER_CONTENT_
1b30: 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49 TYPE:..type = "I
1b40: 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70 nner Content Typ
1b50: 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 e";..break;.
1b60: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41 case SSL3_RT_CHA
1b70: 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a NGE_CIPHER_SPEC:
1b80: 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65 ..type = "Change
1b90: 20 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b Cipher";..break
1ba0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f ;. case SSL3_
1bb0: 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 RT_ALERT:..type
1bc0: 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61 = "Alert";..brea
1bd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 k;. case SSL3
1be0: 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 _RT_HANDSHAKE:..
1bf0: 74 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b type = "Handshak
1c00: 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 e";..break;.
1c10: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 case SSL3_RT_APP
1c20: 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 LICATION_DATA:..
1c30: 74 79 70 65 20 3d 20 22 41 70 70 20 44 61 74 61 type = "App Data
1c40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20 4f ";..break;.#if O
1c50: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
1c60: 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
1c70: 30 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54 4c 00L. case DTL
1c80: 53 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54 3a S1_RT_HEARTBEAT:
1c90: 0a 09 74 79 70 65 20 3d 20 22 48 65 61 72 74 62 ..type = "Heartb
1ca0: 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 eat";..break;.#e
1cb0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 ndif. default
1cc0: 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f :..type = "unkno
1cd0: 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 wn";. }..
1ce0: 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65 /* Needs compile
1cf0: 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e time option "en
1d00: 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e able-ssl-trace".
1d10: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f */. if ((bio
1d20: 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 = BIO_new(BIO_s
1d30: 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c _mem())) != NULL
1d40: 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c ) {..int n;..SSL
1d50: 5f 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20 _trace(write_p,
1d60: 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 version, content
1d70: 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c _type, buf, len,
1d80: 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69 ssl, (void *)bi
1d90: 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61 o);..n = BIO_rea
1da0: 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 d(bio, buffer, B
1db0: 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20 IO_pending(bio)
1dc0: 3c 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70 65 < 15000 ? BIO_pe
1dd0: 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34 39 nding(bio) : 149
1de0: 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 99);..n = (n<0)
1df0: 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65 72 ? 0 : n;..buffer
1e00: 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64 29 [n] = 0;..(void)
1e10: 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a BIO_flush(bio);.
1e20: 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a .BIO_free(bio);.
1e30: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
1e40: 66 28 22 4d 65 73 73 61 67 65 20 64 69 72 65 63 f("Message direc
1e50: 74 69 6f 6e 3d 25 64 2c 20 76 65 72 3d 25 73 2c tion=%d, ver=%s,
1e60: 20 74 79 70 65 3d 25 73 2c 20 6d 65 73 73 61 67 type=%s, messag
1e70: 65 3d 25 73 22 2c 20 77 72 69 74 65 5f 70 2c 20 e=%s", write_p,
1e80: 76 65 72 2c 20 74 79 70 65 2c 20 26 62 75 66 66 ver, type, &buff
1e90: 65 72 5b 30 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 er[0]);.. /*
1ea0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
1eb0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
1ec0: 63 68 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e 2c chan, direction,
1ed0: 20 76 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c 20 version, type,
1ee0: 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 73 and message args
1ef0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
1f00: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
1f10: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c j(statePtr->call
1f20: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c back);. Tcl_L
1f30: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1f40: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1f50: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
1f60: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20 gObj("message",
1f70: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
1f80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1f90: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1fa0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
1fb0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
1fc0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
1fd0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
1fe0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
1ff0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2000: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2010: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2020: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74 (write_p ? "Sent
2030: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20 " : "Received",
2040: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
2050: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2060: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2070: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2080: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20 Obj(ver, -1));.
2090: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
20a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
20b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
20c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70 NewStringObj(typ
20d0: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c e, -1));. Tcl
20e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
20f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
2100: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
2110: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d ingObj(buffer, -
2120: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 1));.. /* Eva
2130: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
2140: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
2150: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
2160: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
2170: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
2180: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
2190: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
21a0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a ount(cmdPtr);.}.
21b0: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d #endif.../*. *--
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2200: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 -. *. * VerifyCa
2210: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 llback --. *. *.
2220: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 Monitors SSL cer
2230: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 tificate validat
2240: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65 ion process. Use
2250: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 d to control the
2260: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65 . *.behavior whe
2270: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59 n the SSL_VERIFY
2280: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65 _PEER flag is se
2290: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 t. This is calle
22a0: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20 d. *.whenever a
22b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 certificate is i
22c0: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69 nspected or deci
22d0: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c ded invalid. Cal
22e0: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20 led for. *.each
22f0: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74 certificate in t
2300: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20 he cert chain..
2310: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 *. * Checks:. *.
2320: 54 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 The certificate
2330: 63 68 61 69 6e 20 69 73 20 63 68 65 63 6b 65 64 chain is checked
2340: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 starting with t
2350: 68 65 20 64 65 65 70 65 73 74 20 6e 65 73 74 69 he deepest nesti
2360: 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74 ng level. *. (t
2370: 68 65 20 72 6f 6f 74 20 43 41 20 63 65 72 74 69 he root CA certi
2380: 66 69 63 61 74 65 29 20 61 6e 64 20 77 6f 72 6b ficate) and work
2390: 65 64 20 75 70 77 61 72 64 20 74 6f 20 74 68 65 ed upward to the
23a0: 20 70 65 65 72 27 73 20 63 65 72 74 69 66 69 63 peer's certific
23b0: 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e ate.. *.All sign
23c0: 61 74 75 72 65 73 20 61 72 65 20 76 61 6c 69 64 atures are valid
23d0: 2c 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 69 , current time i
23e0: 73 20 77 69 74 68 69 6e 20 66 69 72 73 74 20 61 s within first a
23f0: 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 69 74 79 nd last validity
2400: 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20 time.. *.Check
2410: 74 68 61 74 20 74 68 65 20 63 65 72 74 69 66 69 that the certifi
2420: 63 61 74 65 20 69 73 20 69 73 73 75 65 64 20 62 cate is issued b
2430: 79 20 74 68 65 20 69 73 73 75 65 72 20 63 65 72 y the issuer cer
2440: 74 69 66 69 63 61 74 65 20 69 73 73 75 65 72 2e tificate issuer.
2450: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 72 65 . *.Check the re
2460: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 20 vocation status
2470: 66 6f 72 20 65 61 63 68 20 63 65 72 74 69 66 69 for each certifi
2480: 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 cate.. *.Check t
2490: 68 65 20 76 61 6c 69 64 69 74 79 20 6f 66 20 74 he validity of t
24a0: 68 65 20 67 69 76 65 6e 20 43 52 4c 20 61 6e 64 he given CRL and
24b0: 20 74 68 65 20 63 65 72 74 20 72 65 76 6f 63 61 the cert revoca
24c0: 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09 tion status.. *.
24d0: 43 68 65 63 6b 20 74 68 65 20 70 6f 6c 69 63 69 Check the polici
24e0: 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 65 es of all the ce
24f0: 72 74 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a rtificates. *. *
2500: 20 41 72 67 73 0a 20 2a 09 70 72 65 76 65 72 69 Args. *.preveri
2510: 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73 20 fy_ok indicates
2520: 77 68 65 74 68 65 72 20 74 68 65 20 63 65 72 74 whether the cert
2530: 69 66 69 63 61 74 65 20 76 65 72 69 66 69 63 61 ificate verifica
2540: 74 69 6f 6e 20 70 61 73 73 65 64 20 28 31 29 20 tion passed (1)
2550: 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a or not (0). *. *
2560: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 Results:. *.A c
2570: 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f allback bound to
2580: 20 74 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 the socket may
2590: 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 return one of:.
25a0: 2a 09 20 20 20 20 30 09 09 09 2d 20 74 68 65 20 *. 0...- the
25b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64 certificate is d
25c0: 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20 73 eemed invalid, s
25d0: 65 6e 64 20 76 65 72 69 66 69 63 61 74 69 6f 6e end verification
25e0: 0a 20 2a 09 09 09 09 20 20 66 61 69 6c 75 72 65 . *.... failure
25f0: 20 61 6c 65 72 74 20 74 6f 20 70 65 65 72 2c 20 alert to peer,
2600: 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 20 68 61 and terminate ha
2610: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 ndshake.. *.
2620: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 1...- the certif
2630: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 icate is deemed
2640: 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20 valid, continue
2650: 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a with handshake..
2660: 20 2a 09 20 20 20 20 65 6d 70 74 79 20 73 74 72 *. empty str
2670: 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20 ing.- no change
2680: 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 20 76 to certificate v
2690: 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 alidation. *. *
26a0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
26b0: 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f .The err field o
26c0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 f the currently
26d0: 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20 operative State
26e0: 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 is set. *. to a
26f0: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 string describi
2700: 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 ng the SSL negot
2710: 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 iation failure r
2720: 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d eason. *. *-----
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2770: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 */.static int.Ve
2780: 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74 rifyCallback(int
2790: 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f ok, X509_STORE_
27a0: 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 20 20 20 CTX *ctx) {.
27b0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
27c0: 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 . SSL *ssl.
27d0: 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 .= (SSL*)X509_ST
27e0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 ORE_CTX_get_ex_d
27f0: 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 ata(ctx, SSL_get
2800: 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 _ex_data_X509_ST
2810: 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a ORE_CTX_idx());.
2820: 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74 09 X509 *cert.
2830: 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 .= X509_STORE_CT
2840: 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 X_get_current_ce
2850: 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61 rt(ctx);. Sta
2860: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 te *statePtr.= (
2870: 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 State*)SSL_get_a
2880: 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 pp_data(ssl);.
2890: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
28a0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
28b0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 >interp;. int
28c0: 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 depth..= X509_S
28d0: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 TORE_CTX_get_err
28e0: 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 or_depth(ctx);.
28f0: 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 int err..= X5
2900: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
2910: 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20 _error(ctx);..
2920: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
2930: 64 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 d");. dprintf
2940: 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b ("VerifyCallback
2950: 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 : %d", ok);..
2960: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
2970: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a cmd == (Tcl_Obj*
2980: 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65 )NULL) {../* Use
2990: 20 6f 6b 20 76 61 6c 75 65 20 69 66 20 76 65 72 ok value if ver
29a0: 69 66 69 63 61 74 69 6f 6e 20 69 73 20 72 65 71 ification is req
29b0: 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 28 73 74 uired */..if (st
29c0: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 atePtr->vflags &
29d0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
29e0: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
29f0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ) {.. return
2a00: 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 ok;..} else {..
2a10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a return 1;..}.
2a20: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
2a30: 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 ert == NULL || s
2a40: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 sl == NULL) {..r
2a50: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a eturn 0;. }..
2a60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 dprintf("Ver
2a70: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61 ifyCallback: eva
2a80: 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 l callback");..
2a90: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
2aa0: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 mand to eval wit
2ab0: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74 h fn, chan, dept
2ac0: 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c 69 73 h, cert info lis
2ad0: 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 20 65 t, status, and e
2ae0: 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20 20 rror args */.
2af0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
2b00: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
2b10: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 Ptr->vcmd);.
2b20: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2b30: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2b40: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
2b50: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 StringObj("verif
2b60: 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 y", -1));. Tc
2b70: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2b80: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
2b90: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 mdPtr,..Tcl_NewS
2ba0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
2bb0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
2bc0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
2bd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2be0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2bf0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2c00: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 Tcl_NewIntObj(de
2c10: 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c pth));. Tcl_L
2c20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2c30: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2c40: 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f tr, Tls_NewX509O
2c50: 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 bj(interp, cert)
2c60: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2c70: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2c80: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2c90: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b Tcl_NewIntObj(ok
2ca0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2cb0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2cc0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2cd0: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f ..Tcl_NewStringO
2ce0: 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76 bj((char*)X509_v
2cf0: 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 erify_cert_error
2d00: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 _string(err), -1
2d10: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 ));.. /* Prev
2d20: 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 ent I/O while ca
2d30: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72 6f llback is in pro
2d40: 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 gress */. /*
2d50: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
2d60: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 |= TLS_TCL_CALLB
2d70: 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 ACK; */.. /*
2d80: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
2d90: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
2da0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
2db0: 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 dPtr);. ok =
2dc0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
2dd0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
2de0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f mdPtr);. Tcl_
2df0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
2e00: 50 74 72 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e Ptr);.. dprin
2e10: 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 tf("VerifyCallba
2e20: 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72 65 73 75 ck: command resu
2e30: 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a lt = %d", ok);..
2e40: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d /* statePtr-
2e50: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f >flags &= ~(TLS_
2e60: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a TCL_CALLBACK); *
2e70: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b /. return ok;
2e80: 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 ./* By default,
2e90: 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 69 leave verificati
2ea0: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f on unchanged. */
2eb0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
2f00: 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d . * Tls_Error --
2f10: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c . *. *.Calls cal
2f20: 6c 62 61 63 6b 20 77 69 74 68 20 65 72 72 6f 72 lback with error
2f30: 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 message.. *. *
2f40: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
2f50: 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f .The err field o
2f60: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 f the currently
2f70: 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20 operative State
2f80: 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 is set. *. to a
2f90: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 string describi
2fa0: 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 ng the SSL negot
2fb0: 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 iation failure r
2fc0: 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d eason. *. *-----
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
3010: 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f */.void.Tls_Erro
3020: 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 r(State *statePt
3030: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d r, const char *m
3040: 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e sg) {. Tcl_In
3050: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
3060: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
3070: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
3080: 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a dPtr, *listPtr;.
3090: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e unsigned lon
30a0: 67 20 65 72 72 3b 0a 20 20 20 20 73 74 61 74 65 g err;. state
30b0: 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a Ptr->err = msg;.
30c0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
30d0: 6c 6c 65 64 20 77 69 74 68 20 6d 65 73 73 61 67 lled with messag
30e0: 65 20 25 73 22 2c 20 6d 73 67 29 3b 0a 0a 20 20 e %s", msg);..
30f0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
3100: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c callback == (Tcl
3110: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 _Obj*)NULL) {..r
3120: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 eturn;. }..
3130: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
3140: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 and to eval with
3150: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d fn, chan, and m
3160: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 essage args */.
3170: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
3180: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
3190: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
31a0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
31b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
31c0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
31d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
31e0: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 "error", -1));.
31f0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3200: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3210: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
3220: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3230: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
3240: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
3250: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
3260: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 if (msg != NULL)
3270: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
3280: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3290: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
32a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 _NewStringObj(ms
32b0: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 g, -1));.. }
32c0: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 else if ((msg =
32d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63 Tcl_GetString(Tc
32e0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
32f0: 6e 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c nterp))) != NULL
3300: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ) {..Tcl_ListObj
3310: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3320: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
3330: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
3340: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d sg, -1));.. }
3350: 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72 else {..listPtr
3360: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
3370: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 j(0, NULL);..whi
3380: 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67 le ((err = ERR_g
3390: 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30 et_error()) != 0
33a0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
33b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
33c0: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 t(interp, listPt
33d0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
33e0: 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65 Obj(ERR_reason_e
33f0: 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 rror_string(err)
3400: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f , -1));..}..Tcl_
3410: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3420: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3430: 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 Ptr, listPtr);.
3440: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 }.. /* Eva
3450: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
3460: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
3470: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
3480: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
3490: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
34a0: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
34b0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
34c0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a ount(cmdPtr);.}.
34d0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
3520: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 KeyLogCallback
3530: 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 --. *. *.Write r
3540: 65 63 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 eceived key data
3550: 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a to log file.. *
3560: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
3570: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d :. *.none. *. *-
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35c0: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c --. */.void KeyL
35d0: 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 ogCallback(const
35e0: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 SSL *ssl, const
35f0: 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 char *line) {.
3600: 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67 char *str = g
3610: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 etenv(SSLKEYLOGF
3620: 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a ILE);. FILE *
3630: 66 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 fd;.. dprintf
3640: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
3650: 20 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 if (str) {..fd
3660: 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 = fopen(str, "a"
3670: 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 );..fprintf(fd,
3680: 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 "%s\n",line);..f
3690: 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d close(fd);. }
36a0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
36f0: 0a 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c . * Password Cal
3700: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 lback --. *. *.C
3710: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 alled when a pas
3720: 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 sword is needed
3730: 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65 for a private ke
3740: 79 20 77 68 65 6e 20 6c 6f 61 64 69 6e 67 0a 20 y when loading.
3750: 2a 09 6f 72 20 73 74 6f 72 69 6e 67 20 61 20 50 *.or storing a P
3760: 45 4d 20 63 65 72 74 69 66 69 63 61 74 65 20 77 EM certificate w
3770: 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20 ith encryption.
3780: 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 0a 20 Evals callback.
3790: 2a 09 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 *.script and ret
37a0: 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 urns the result
37b0: 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 64 20 as the password
37c0: 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a 20 string in buf..
37d0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
37e0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
37f0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
3800: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
3810: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 defined). *. * R
3820: 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73 77 eturns:. *.Passw
3830: 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 ord size in byte
3840: 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 65 s or -1 for an e
3850: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d rror.. *. *-----
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
38a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61 */.static int.Pa
38b0: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 sswordCallback(c
38c0: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 har *buf, int si
38d0: 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c 20 ze, int rwflag,
38e0: 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a 20 void *udata) {.
38f0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
3900: 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75 tr.= (State *) u
3910: 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e data;. Tcl_In
3920: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
3930: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
3940: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
3950: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f dPtr;. int co
3960: 64 65 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 de;. Tcl_Size
3970: 20 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e len;.. dprin
3980: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
3990: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c /* If no call
39a0: 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c back, use defaul
39b0: 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 t callback */.
39c0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
39d0: 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c password == NULL
39e0: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 ) {..if (Tcl_Eva
39f0: 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 lEx(interp, "tls
3a00: 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c ::password", -1,
3a10: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
3a20: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) == TCL_OK) {..
3a30: 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 char *ret =
3a40: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
3a50: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 StringFromObj(Tc
3a60: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
3a70: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 nterp), &len);..
3a80: 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 28 54 if (len > (T
3a90: 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 29 cl_Size) size-1)
3aa0: 20 7b 0a 09 09 6c 65 6e 20 3d 20 28 54 63 6c 5f {...len = (Tcl_
3ab0: 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 20 Size) size-1;..
3ac0: 20 20 20 7d 0a 09 20 20 20 20 73 74 72 6e 63 70 }.. strncp
3ad0: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a y(buf, ret, (siz
3ae0: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 e_t) len);..
3af0: 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b buf[len] = '\0';
3b00: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e .. return (in
3b10: 74 29 20 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65 20 t) len;..} else
3b20: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 {.. return -1
3b30: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
3b40: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
3b50: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 d to eval with f
3b60: 6e 2c 20 72 77 66 6c 61 67 2c 20 61 6e 64 20 73 n, rwflag, and s
3b70: 69 7a 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 ize args */.
3b80: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
3b90: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
3ba0: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20 tr->password);.
3bb0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3bc0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3bd0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
3be0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61 NewStringObj("pa
3bf0: 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20 ssword", -1));.
3c00: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3c10: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3c20: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
3c30: 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67 NewIntObj(rwflag
3c40: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
3c50: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3c60: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3c70: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 Tcl_NewIntObj(s
3c80: 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ize));.. Tcl_
3c90: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
3ca0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
3cb0: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
3cc0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
3cd0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 tePtr);.. /*
3ce0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
3cf0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
3d00: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
3d10: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 dPtr);. code
3d20: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 = Tcl_EvalObjEx(
3d30: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3d40: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
3d50: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 ;. if (code !
3d60: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 = TCL_OK) {.#if
3d70: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 (TCL_MAJOR_VERSI
3d80: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c ON == 8) && (TCL
3d90: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MINOR_VERSION <
3da0: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 6)..Tcl_Backgro
3db0: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 undError(interp)
3dc0: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 ;.#else..Tcl_Bac
3dd0: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e kgroundException
3de0: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a (interp, code);.
3df0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 #endif. }.
3e00: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
3e10: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 t(cmdPtr);..
3e20: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
3e30: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
3e40: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 r);.. /* If s
3e50: 75 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 uccessful, pass
3e60: 62 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 back password st
3e70: 72 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 ring and truncat
3e80: 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f e if too long */
3e90: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d . if (code ==
3ea0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 TCL_OK) {..char
3eb0: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 *ret = (char *)
3ec0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
3ed0: 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a omObj(Tcl_GetObj
3ee0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 Result(interp),
3ef0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 &len);..if (len
3f00: 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a > (Tcl_Size) siz
3f10: 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 e-1) {.. len
3f20: 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a = (Tcl_Size) siz
3f30: 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 e-1;..}..strncpy
3f40: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 (buf, ret, (size
3f50: 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c _t) len);..buf[l
3f60: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c en] = '\0';..Tcl
3f70: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
3f80: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 Data) interp);..
3f90: 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e return (int) len
3fa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
3fb0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
3fc0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
3fd0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c return -1;.}..
3fe0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
4030: 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b Session Callback
4040: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a for Clients --.
4050: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 *. *.Called whe
4060: 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 n a new session
4070: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 is added to the
4080: 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e cache. In TLS 1.
4090: 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 3. *.this may be
40a0: 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 received multip
40b0: 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 le times after t
40c0: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f he handshake. Fo
40d0: 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 r. *.earlier ver
40e0: 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c sions, this will
40f0: 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72 be received dur
4100: 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b ing the handshak
4110: 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 e.. *.This is th
4120: 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20 e preferred way
4130: 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 to obtain a resu
4140: 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 mable session..
4150: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
4160: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
4170: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
4180: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
4190: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 defined). *. * R
41a0: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 eturn codes:. *.
41b0: 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 0 = error where
41c0: 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 session will be
41d0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f immediately remo
41e0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 ved from the int
41f0: 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 ernal cache.. *.
4200: 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 1 = success wher
4210: 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 e app retains se
4220: 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e ssion in session
4230: 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 cache, and must
4240: 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f call SSL_SESSIO
4250: 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f N_free() when do
4260: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
42b0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 .static int.Sess
42c0: 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 ionCallback(SSL
42d0: 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f *ssl, SSL_SESSIO
42e0: 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 N *session) {.
42f0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
4300: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f r = (State*)SSL_
4310: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 get_app_data((SS
4320: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 L *)ssl);. Tc
4330: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
4340: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
4350: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
4360: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f *cmdPtr;. co
4370: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
4380: 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 r *ticket;. c
4390: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
43a0: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a ar *session_id;.
43b0: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b size_t len2;
43c0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e . unsigned in
43d0: 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 t ulen;.. dpr
43e0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
43f0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
4400: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 r->callback == (
4410: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b Tcl_Obj*)NULL) {
4420: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
4430: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
4440: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d } else if (ssl =
4450: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
4460: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
4470: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
4480: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
4490: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 mand to eval wit
44a0: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73 73 h fn, chan, sess
44b0: 69 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e 20 ion id, session
44c0: 74 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66 65 ticket, and life
44d0: 74 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 time args */.
44e0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
44f0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
4500: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
4510: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4520: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4530: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
4540: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
4550: 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 ession", -1));.
4560: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
4570: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4580: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
4590: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
45a0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
45b0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
45c0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 elf), -1));..
45d0: 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a /* Session id *
45e0: 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64 /. session_id
45f0: 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
4600: 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 et_id(session, &
4610: 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c ulen);. Tcl_L
4620: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4630: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
4640: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 tr, Tcl_NewByteA
4650: 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f rrayObj(session_
4660: 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 id, (Tcl_Size) u
4670: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 len));.. /* S
4680: 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f ession ticket */
4690: 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e . SSL_SESSION
46a0: 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 _get0_ticket(ses
46b0: 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 sion, &ticket, &
46c0: 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c len2);. Tcl_L
46d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
46e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
46f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 tr, Tcl_NewByteA
4700: 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 rrayObj(ticket,
4710: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 (Tcl_Size) len2)
4720: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 );.. /* Lifet
4730: 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 ime - number of
4740: 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 seconds */. T
4750: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
4760: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
4770: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 cmdPtr,..Tcl_New
4780: 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 LongObj((long) S
4790: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 SL_SESSION_get_t
47a0: 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 icket_lifetime_h
47b0: 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a int(session)));.
47c0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
47d0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
47e0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
47f0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
4800: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 EvalCallback(
4810: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
4820: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 , cmdPtr);. T
4830: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
4840: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a cmdPtr);.. /*
4850: 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 6e 6f Return 0 for no
4860: 77 20 75 6e 74 69 6c 20 73 65 73 73 69 6f 6e 20 w until session
4870: 68 61 6e 64 6c 69 6e 67 20 69 73 20 63 6f 6d 70 handling is comp
4880: 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 lete */. retu
4890: 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d rn 0;.}.../*. *-
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48e0: 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 --. *. * ALPN Ca
48f0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 llback for Serve
4900: 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 rs and NPN Callb
4910: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 ack for Clients
4920: 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d --. *. *.Perform
4930: 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f protocol (http/
4940: 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 63 1.1, h2, h3, etc
4950: 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 .) selection for
4960: 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 the. *.incoming
4970: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c connection. Cal
4980: 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f 20 led after Hello
4990: 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c 62 and server callb
49a0: 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 27 acks.. *.Where '
49b0: 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 65 64 out' is selected
49c0: 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69 protocol and 'i
49d0: 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 20 61 n' is the peer a
49e0: 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e 0a dvertised list..
49f0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
4a00: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
4a10: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
4a20: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
4a30: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
4a40: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a Return codes:. *
4a50: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
4a60: 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f OK: ALPN protoco
4a70: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 l selected. The
4a80: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
4a90: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
4aa0: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 EXT_ERR_ALERT_FA
4ab0: 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 6e TAL: There was n
4ac0: 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 o overlap betwee
4ad0: 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 n the client's.
4ae0: 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 6c *. supplied l
4af0: 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 76 ist and the serv
4b00: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e er configuration
4b10: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
4b20: 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 will be aborted
4b30: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
4b40: 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 ERR_NOACK: ALPN
4b50: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c protocol not sel
4b60: 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 ected, e.g., bec
4b70: 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 ause no ALPN. *.
4b80: 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 protocols ar
4b90: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 e configured for
4ba0: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e this connection
4bb0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
4bc0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 continues.. *.
4bd0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
4be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c10: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
4c20: 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b int.ALPNCallback
4c30: 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 (SSL *ssl, const
4c40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
4c50: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 *out, unsigned c
4c60: 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f har *outlen,..co
4c70: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
4c80: 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 r *in, unsigned
4c90: 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 int inlen, void
4ca0: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 *arg) {. Stat
4cb0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
4cc0: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 tate*)arg;. T
4cd0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
4ce0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
4cf0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
4d00: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
4d10: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 nt code, res;..
4d20: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
4d30: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
4d40: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 sl == NULL || ar
4d50: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 g == NULL) {..re
4d60: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
4d70: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
4d80: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 .. /* Select
4d90: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 protocol */.
4da0: 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e if (SSL_select_n
4db0: 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69 67 ext_proto((unsig
4dc0: 6e 65 64 20 63 68 61 72 20 2a 2a 29 20 6f 75 74 ned char **) out
4dd0: 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 , outlen, stateP
4de0: 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 tr->protos, stat
4df0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e ePtr->protos_len
4e00: 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d ,..in, inlen) ==
4e10: 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 OPENSSL_NPN_NEG
4e20: 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d OTIATED) {../* M
4e30: 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 atch found */..r
4e40: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
4e50: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c ERR_OK;. } el
4e60: 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c se {../* OPENSSL
4e70: 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 _NPN_NO_OVERLAP
4e80: 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f = No overlap, so
4e90: 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 use first item
4ea0: 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 from client prot
4eb0: 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 ocol list */..re
4ec0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
4ed0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
4ee0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
4ef0: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f r->vcmd == (Tcl_
4f00: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 Obj*)NULL) {..re
4f10: 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a turn res;. }.
4f20: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
4f30: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 ommand to eval w
4f40: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 ith fn, chan, de
4f50: 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c pth, cert info l
4f60: 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 ist, status, and
4f70: 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 error args */.
4f80: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
4f90: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
4fa0: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 tePtr->vcmd);.
4fb0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
4fc0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
4fd0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
4fe0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 ewStringObj("alp
4ff0: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 n", -1));. Tc
5000: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
5010: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
5020: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
5030: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
5040: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
5050: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
5060: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
5070: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5080: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
5090: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
50a0: 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 72 gObj((const char
50b0: 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a *) *out, -1));.
50c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
50d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
50e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
50f0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 _NewBooleanObj(r
5100: 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54 es == SSL_TLSEXT
5110: 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20 _ERR_OK));..
5120: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
5130: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
5140: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
5150: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 (cmdPtr);. if
5160: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 ((code = EvalCa
5170: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 llback(interp, s
5180: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 tatePtr, cmdPtr)
5190: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 ) > 1) {..res =
51a0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
51b0: 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 OACK;. } else
51c0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 if (code == 1)
51d0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
51e0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
51f0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
5200: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
5210: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20 LERT_FATAL;.
5220: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 }. Tcl_DecrRe
5230: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
5240: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a return res;.
5250: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
5260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
52a0: 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f * Advertise Pro
52b0: 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20 tocols Callback
52c0: 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f for Next Protoco
52d0: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e l Negotiation (N
52e0: 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c PN) in ServerHel
52f0: 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c lo --. *. *.call
5300: 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65 ed when a TLS se
5310: 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73 rver needs a lis
5320: 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70 t of supported p
5330: 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78 rotocols for Nex
5340: 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65 t. *.Protocol Ne
5350: 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a gotiation.. *. *
5360: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
5370: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
5380: 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75 ects:. *. * Retu
5390: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c rn codes:. *.SSL
53a0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 _TLSEXT_ERR_OK:
53b0: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c NPN protocol sel
53c0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 ected. The conne
53d0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
53e0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
53f0: 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72 RR_NOACK: NPN pr
5400: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 otocol not selec
5410: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
5420: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
5430: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 -------. */.#ifd
5480: 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69 ef USE_NPN.stati
5490: 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63 c int.NPNCallbac
54a0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
54b0: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 , const unsigned
54c0: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 char **out, uns
54d0: 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65 igned int *outle
54e0: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a n, void *arg) {.
54f0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
5500: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
5510: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 g;.. dprintf(
5520: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
5530: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 if (ssl == NULL
5540: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 || arg == NULL)
5550: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
5560: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
5570: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
5580: 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 t protocols list
5590: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
55a0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
55b0: 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20 NULL) {..*out =
55c0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
55d0: 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61 ;..*outlen = sta
55e0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 tePtr->protos_le
55f0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a n;. } else {.
5600: 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a .*out = NULL;..*
5610: 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74 outlen = 0;..ret
5620: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
5630: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
5640: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 return SSL_T
5650: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a LSEXT_ERR_OK;.}.
5660: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d #endif.../*. *--
5670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56b0: 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c -. *. * SNI Call
56c0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 back for Servers
56d0: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 --. *. *.Perfor
56e0: 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e m server-side SN
56f0: 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63 I hostname selec
5700: 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69 tion after recei
5710: 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69 ving SNI extensi
5720: 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20 on. *.in Client
5730: 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66 Hello. Called af
5740: 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 ter hello callba
5750: 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c ck but before AL
5760: 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a PN callback.. *.
5770: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
5780: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
5790: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
57a0: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
57b0: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
57c0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
57d0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a L_TLSEXT_ERR_OK:
57e0: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 SNI hostname is
57f0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 accepted. The c
5800: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
5810: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 ues.. *.SSL_TLSE
5820: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 XT_ERR_ALERT_FAT
5830: 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 AL: SNI hostname
5840: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 is not accepted
5850: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
5860: 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 . *. is abort
5870: 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 ed. Default for
5880: 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f alert is SSL_AD_
5890: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d UNRECOGNIZED_NAM
58a0: 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 E.. *.SSL_TLSEXT
58b0: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 _ERR_ALERT_WARNI
58c0: 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 NG: SNI hostname
58d0: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 is not accepted
58e0: 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a , warning alert.
58f0: 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 *. sent (not
5900: 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c supported in TL
5910: 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e Sv1.3). The conn
5920: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
5930: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
5940: 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 ERR_NOACK: SNI h
5950: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 ostname is not a
5960: 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 ccepted and not
5970: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a acknowledged,. *
5980: 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 . e.g. if SNI
5990: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f has not been co
59a0: 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f nfigured. The co
59b0: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
59c0: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d es.. *. *-------
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
5a10: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 .static int.SNIC
5a20: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
5a30: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
5a40: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
5a50: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
5a60: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
5a70: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
5a80: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
5a90: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
5aa0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
5ab0: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
5ac0: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 , res;. const
5ad0: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
5ae0: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 e = NULL;.. d
5af0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
5b00: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d ;.. if (ssl =
5b10: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d = NULL || arg ==
5b20: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
5b30: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5b40: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 NOACK;. }..
5b50: 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 /* Only works
5b60: 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20 for TLS 1.2 and
5b70: 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73 earlier */. s
5b80: 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f ervername = SSL_
5b90: 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 get_servername(s
5ba0: 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 sl, TLSEXT_NAMET
5bb0: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a YPE_host_name);.
5bc0: 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e if (!servern
5bd0: 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d ame || servernam
5be0: 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a e[0] == '\0') {.
5bf0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
5c00: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
5c10: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 }.. if (sta
5c20: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 tePtr->vcmd == (
5c30: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b Tcl_Obj*)NULL) {
5c40: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
5c50: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
5c60: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 }.. /* Create
5c70: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c command to eval
5c80: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 with fn, chan,
5c90: 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 and server name
5ca0: 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 args */. cmdP
5cb0: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
5cc0: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
5cd0: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
5ce0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5cf0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
5d00: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
5d10: 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 gObj("sni", -1))
5d20: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
5d30: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5d40: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
5d50: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
5d60: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
5d70: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
5d80: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 ->self), -1));.
5d90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
5da0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5db0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
5dc0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 NewStringObj(ser
5dd0: 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a vername , -1));.
5de0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
5df0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
5e00: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
5e10: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
5e20: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 if ((code = E
5e30: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
5e40: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
5e50: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 dPtr)) > 1) {..r
5e60: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
5e70: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e ERR_ALERT_WARNIN
5e80: 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c G;..*alert = SSL
5e90: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 _AD_UNRECOGNIZED
5ea0: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 _NAME; /* Not su
5eb0: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 pported by TLS 1
5ec0: 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 .3 */. } else
5ed0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 if (code == 1)
5ee0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
5ef0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
5f00: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
5f10: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
5f20: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c LERT_FATAL;..*al
5f30: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 ert = SSL_AD_UNR
5f40: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 ECOGNIZED_NAME;
5f50: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 /* Not supported
5f60: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 by TLS 1.3 */.
5f70: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
5f80: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
5f90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 );. return re
5fa0: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d s;.}.../*. *----
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
5ff0: 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c *. * ClientHell
6000: 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c o Handshake Call
6010: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 back for Servers
6020: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 --. *. *.Used b
6030: 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d y server to exam
6040: 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e ine the server n
6050: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 ame indication (
6060: 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 SNI) extension.
6070: 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 *.provided by th
6080: 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 e client in orde
6090: 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 r to select an a
60a0: 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 ppropriate certi
60b0: 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 ficate to. *.pre
60c0: 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f sent, and make o
60d0: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 ther configurati
60e0: 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 on adjustments r
60f0: 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 elevant to that
6100: 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 server. *.name a
6110: 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 nd its configura
6120: 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 tion. This inclu
6130: 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 des swapping out
6140: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a the associated.
6150: 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 *.SSL_CTX point
6160: 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 er, modifying th
6170: 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 e server's list
6180: 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 of permitted TLS
6190: 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 versions,. *.ch
61a0: 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 anging the serve
61b0: 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 r's cipher list
61c0: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 in response to t
61d0: 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 he client's ciph
61e0: 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a er list, etc.. *
61f0: 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 .Called before S
6200: 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c NI and ALPN call
6210: 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 backs.. *. * Res
6220: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
6230: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
6240: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
6250: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
6260: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
6270: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 des:. *.SSL_CLIE
6280: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 NT_HELLO_RETRY:
6290: 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 suspend the hand
62a0: 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 shake, and the h
62b0: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f andshake functio
62c0: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d n will return im
62d0: 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c mediately. *.SSL
62e0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
62f0: 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 ROR: failure, te
6300: 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 rminate connecti
6310: 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f on. Set alert to
6320: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 error code.. *.
6330: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
6340: 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 _SUCCESS: succes
6350: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d s. *. *---------
6360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
63a0: 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 tatic int.HelloC
63b0: 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c allback(SSL *ssl
63c0: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f , int *alert, vo
63d0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
63e0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
63f0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 (State*)arg;.
6400: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
6410: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
6420: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
6430: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
6440: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b int code, res;
6450: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
6460: 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 *servername;.
6470: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
6480: 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a char *p;. siz
6490: 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 e_t len, remaini
64a0: 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 ng;.. dprintf
64b0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
64c0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
64d0: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a cmd == (Tcl_Obj*
64e0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
64f0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6500: 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d O_SUCCESS;. }
6510: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d else if (ssl ==
6520: 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 (const SSL *)NU
6530: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f LL || arg == (vo
6540: 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 id *)NULL) {..re
6550: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
6560: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
6570: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e }.. /* Get n
6580: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 ames */. if (
6590: 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c !SSL_client_hell
65a0: 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 o_get0_ext(ssl,
65b0: 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 TLSEXT_TYPE_serv
65c0: 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 er_name, &p, &re
65d0: 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 maining) || rema
65e0: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a ining <= 2) {..*
65f0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 alert = SSL_R_SS
6600: 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 LV3_ALERT_ILLEGA
6610: 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 L_PARAMETER;..re
6620: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
6630: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
6640: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 }.. /* Extra
6650: 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 ct the length of
6660: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 the supplied li
6670: 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a st of names. */.
6680: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b len = (*(p++
6690: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e ) << 8);. len
66a0: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 += *(p++);.
66b0: 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 if (len + 2 != r
66c0: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c emaining) {..*al
66d0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 ert = SSL_R_SSLV
66e0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 3_ALERT_ILLEGAL_
66f0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 PARAMETER;..retu
6700: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
6710: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
6720: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d . remaining =
6730: 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 len;.. /* Th
6740: 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 e list in practi
6750: 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 ce only has a si
6760: 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f ngle element, so
6770: 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 we only conside
6780: 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e r the first one.
6790: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 */. if (rema
67a0: 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 ining == 0 || *p
67b0: 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d ++ != TLSEXT_NAM
67c0: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 ETYPE_host_name)
67d0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
67e0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
67f0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 NTERNAL_ERROR;..
6800: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6810: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
6820: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
6830: 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f ng--;.. /* No
6840: 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 w we can finally
6850: 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 pull out the by
6860: 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 te array with th
6870: 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d e actual hostnam
6880: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 e. */. if (re
6890: 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a maining <= 2) {.
68a0: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f .*alert = SSL_R_
68b0: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 TLSV1_ALERT_INTE
68c0: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 RNAL_ERROR;..ret
68d0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
68e0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
68f0: 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 }. len = (*(p
6900: 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c ++) << 8);. l
6910: 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 en += *(p++);.
6920: 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 if (len + 2 >
6930: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 remaining) {..*a
6940: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 lert = SSL_R_TLS
6950: 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 V1_ALERT_INTERNA
6960: 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e L_ERROR;..return
6970: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6980: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 O_ERROR;. }.
6990: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c remaining = l
69a0: 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 en;. serverna
69b0: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 me = (const char
69c0: 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 *)p;.. /* Cr
69d0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
69e0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 eval with fn, ch
69f0: 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e an, and server n
6a00: 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 ame args */.
6a10: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
6a20: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
6a30: 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 tr->vcmd);. T
6a40: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6a50: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
6a60: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
6a70: 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 tringObj("hello"
6a80: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
6a90: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
6aa0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
6ab0: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
6ac0: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
6ad0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
6ae0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
6af0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
6b00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
6b10: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
6b20: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
6b30: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 bj(servername, (
6b40: 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 3b Tcl_Size) len));
6b50: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
6b60: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
6b70: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
6b80: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
6b90: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 if ((code =
6ba0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
6bb0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
6bc0: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 mdPtr)) > 1) {..
6bd0: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 res = SSL_CLIENT
6be0: 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a _HELLO_RETRY;..*
6bf0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c alert = SSL_R_TL
6c00: 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 SV1_ALERT_USER_C
6c10: 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 ANCELLED;. }
6c20: 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d else if (code ==
6c30: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 1) {..res = SSL
6c40: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 _CLIENT_HELLO_SU
6c50: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 CCESS;. } els
6c60: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 e {..res = SSL_C
6c70: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6c80: 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c R;..*alert = SSL
6c90: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
6ca0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 NTERNAL_ERROR;.
6cb0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
6cc0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
6cd0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 );. return re
6ce0: 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a s;.}.../********
6cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a ************/./*
6d00: 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 Commands
6d10: 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./**********
6d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a **********/../*.
6d30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d70: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 -----. *. * Ciph
6d80: 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 ersObjCmd -- lis
6d90: 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 t available ciph
6da0: 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 ers. *. *.This p
6db0: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
6dc0: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 ked to process t
6dd0: 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 he "tls::ciphers
6de0: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 " command. *.to
6df0: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 list available c
6e00: 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70 iphers, based up
6e10: 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 on protocol sele
6e20: 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 cted.. *. * Resu
6e30: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
6e40: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 rd Tcl result li
6e50: 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 st.. *. * Side e
6e60: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 ffects:. *.const
6e70: 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f ructs and destro
6e80: 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 ys SSL context (
6e90: 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d CTX). *. *------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
6ee0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 /.static const c
6ef0: 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d har *protocols[]
6f00: 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 73 = {.."ssl2", "s
6f10: 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 74 sl3", "tls1", "t
6f20: 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22 ls1.1", "tls1.2"
6f30: 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c , "tls1.3", NULL
6f40: 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f .};.enum protoco
6f50: 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32 l {. TLS_SSL2
6f60: 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f , TLS_SSL3, TLS_
6f70: 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31 TLS1, TLS_TLS1_1
6f80: 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c , TLS_TLS1_2, TL
6f90: 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f S_TLS1_3, TLS_NO
6fa0: 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e NE.};..static in
6fb0: 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 t.CiphersObjCmd(
6fc0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
6fd0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
6fe0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
6ff0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
7000: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
7010: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
7020: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 r = NULL;. SS
7030: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c L_CTX *ctx = NUL
7040: 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 L;. SSL *ssl
7050: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 = NULL;. STAC
7060: 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29 K_OF(SSL_CIPHER)
7070: 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 62 *sk;. char b
7080: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 uf[BUFSIZ];.
7090: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f int index, verbo
70a0: 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 se = 0, use_supp
70b0: 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 orted = 0;. c
70c0: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 onst SSL_METHOD
70d0: 2a 6d 65 74 68 6f 64 3b 0a 20 20 20 20 28 76 6f *method;. (vo
70e0: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a id) clientData;.
70f0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
7100: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
7110: 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 ((objc < 2) || (
7120: 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 objc > 4)) {..Tc
7130: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
7140: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
7150: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f "protocol ?verbo
7160: 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 se? ?supported?"
7170: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
7180: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
7190: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
71a0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
71b0: 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f objv[1], protoco
71c0: 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 ls, "protocol",
71d0: 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 0, &index) != TC
71e0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
71f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7200: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e . if ((objc >
7210: 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 2) && Tcl_GetBo
7220: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 oleanFromObj(int
7230: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 erp, objv[2], &v
7240: 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f erbose) != TCL_O
7250: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
7260: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
7270: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 if ((objc > 3)
7280: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 && Tcl_GetBoole
7290: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 anFromObj(interp
72a0: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f , objv[3], &use_
72b0: 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 supported) != TC
72c0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
72d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
72e0: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f .. ERR_clear_
72f0: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 error();.. sw
7300: 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 itch ((enum prot
7310: 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 ocol)index) {..c
7320: 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 ase TLS_SSL2:.#i
7330: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
7340: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 N_NUMBER >= 0x10
7350: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 100000L || defin
7360: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 ed(NO_SSL2) || d
7370: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7380: 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c O_SSL2).. Tcl
7390: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
73a0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
73b0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
73c0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
73d0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
73e0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
73f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
7400: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 .. method = S
7410: 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 SLv2_method(); b
7420: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 reak;.#endif..ca
7430: 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 se TLS_SSL3:.#if
7440: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 defined(NO_SSL3
7450: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
7460: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c NSSL_NO_SSL3) ||
7470: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
7480: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 _NO_SSL3_METHOD)
7490: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
74a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
74b0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
74c0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
74d0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
74e0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
74f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
7500: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
7510: 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 ethod = SSLv3_me
7520: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 thod(); break;.#
7530: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
7540: 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 TLS1:.#if define
7550: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 d(NO_TLS1) || de
7560: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7570: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 _TLS1) || define
7580: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
7590: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 1_METHOD).. T
75a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
75b0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
75c0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
75d0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
75e0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ted", (char *) N
75f0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ULL);.. retur
7600: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c n TCL_ERROR;.#el
7610: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d se.. method =
7620: 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b TLSv1_method();
7630: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
7640: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a case TLS_TLS1_1:
7650: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
7660: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
7670: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7680: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
7690: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
76a0: 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 _1_METHOD)..
76b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
76c0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
76d0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
76e0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
76f0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
7700: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
7710: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
7720: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 lse.. method
7730: 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 = TLSv1_1_method
7740: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 (); break;.#endi
7750: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
7760: 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _2:.#if defined(
7770: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 NO_TLS1_2) || de
7780: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7790: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
77a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
77b0: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 LS1_2_METHOD)..
77c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
77d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
77e0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
77f0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
7800: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
7810: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 *) NULL);.. r
7820: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7830: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
7840: 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 od = TLSv1_2_met
7850: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 hod(); break;.#e
7860: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
7870: 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e LS1_3:.#if defin
7880: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c ed(NO_TLS1_3) ||
7890: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
78a0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 _NO_TLS1_3)..
78b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
78c0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
78d0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
78e0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
78f0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
7900: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
7910: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
7920: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 else.. method
7930: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b = TLS_method();
7940: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
7950: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 t_min_proto_vers
7960: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
7970: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 VERSION);.. S
7980: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 SL_CTX_set_max_p
7990: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
79a0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
79b0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 );.. break;.#
79c0: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a endif..default:.
79d0: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c . method = TL
79e0: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 S_method();..
79f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 break;. }..
7a00: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 ctx = SSL_CTX
7a10: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 _new(method);.
7a20: 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c if (ctx == NUL
7a30: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
7a40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 Result(interp, G
7a50: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
7a60: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
7a70: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7a80: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 OR;. }.. s
7a90: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 sl = SSL_new(ctx
7aa0: 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d );. if (ssl =
7ab0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 = NULL) {..Tcl_A
7ac0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7ad0: 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 rp, GET_ERR_REAS
7ae0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
7af0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
7b00: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
7b10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
7b20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c }.. /* Use l
7b30: 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 ist and order as
7b40: 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 would be sent i
7b50: 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 n a ClientHello
7b60: 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 or all available
7b70: 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 ciphers */.
7b80: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 if (use_supporte
7b90: 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 d) {..sk = SSL_g
7ba0: 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 et1_supported_ci
7bb0: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 phers(ssl);.
7bc0: 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 } else {..sk = S
7bd0: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 SL_get_ciphers(s
7be0: 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 sl);. }..
7bf0: 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 if (sk != NULL)
7c00: 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 {..if (!verbose)
7c10: 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68 {.. const ch
7c20: 61 72 20 2a 63 70 3b 0a 09 20 20 20 20 6f 62 6a ar *cp;.. obj
7c30: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
7c40: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 tObj(0, NULL);..
7c50: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d for (int i =
7c60: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 0; i < sk_SSL_C
7c70: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 IPHER_num(sk); i
7c80: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 ++) {...const SS
7c90: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b L_CIPHER *c = sk
7ca0: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 _SSL_CIPHER_valu
7cb0: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 e(sk, i);...if (
7cc0: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 c == NULL) conti
7cd0: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 nue;..../* ciphe
7ce0: 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 r name or (NONE)
7cf0: 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 */...cp = SSL_C
7d00: 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 IPHER_get_name(c
7d10: 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e );...if (cp == N
7d20: 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 ULL) break;...Tc
7d30: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
7d40: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
7d50: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
7d60: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 ringObj((char *)
7d70: 20 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 cp, -1));..
7d80: 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 }...} else {..
7d90: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
7da0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 ewStringObj("",0
7db0: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 );.. for (int
7dc0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 i = 0; i < sk_S
7dd0: 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b SL_CIPHER_num(sk
7de0: 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 ); i++) {...cons
7df0: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 t SSL_CIPHER *c
7e00: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f = sk_SSL_CIPHER_
7e10: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 value(sk, i);...
7e20: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 if (c == NULL) c
7e30: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 ontinue;..../* t
7e40: 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 extual descripti
7e50: 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 on of the cipher
7e60: 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 */...if (SSL_CI
7e70: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e PHER_description
7e80: 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 (c, buf, sizeof(
7e90: 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b buf)) != NULL) {
7ea0: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ... Tcl_Appen
7eb0: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 dToObj(objPtr, b
7ec0: 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 uf, (Tcl_Size) s
7ed0: 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d trlen(buf));...}
7ee0: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 else {... Tc
7ef0: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 l_AppendToObj(ob
7f00: 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e jPtr, "UNKNOWN\n
7f10: 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 ", 8);...}..
7f20: 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 }..}..if (use_su
7f30: 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 pported) {..
7f40: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 sk_SSL_CIPHER_fr
7f50: 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d ee(sk);..}. }
7f60: 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 . SSL_free(ss
7f70: 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f l);. SSL_CTX_
7f80: 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 free(ctx);..
7f90: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
7fa0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
7fb0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
7fc0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8010: 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c -. *. * Protocol
8020: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 sObjCmd -- list
8030: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 available protoc
8040: 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 ols. *. *.This p
8050: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
8060: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 ked to process t
8070: 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f he "tls::protoco
8080: 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 ls" command. *.t
8090: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 o list available
80a0: 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 protocols.. *.
80b0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
80c0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
80d0: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 ult list.. *. *
80e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
80f0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .none. *. *-----
8100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
8140: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 */.static int.Pr
8150: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c otocolsObjCmd(Cl
8160: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
8170: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
8180: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
8190: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
81a0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
81b0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
81c0: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 . (void) clie
81d0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ntData;.. dpr
81e0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
81f0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
8200: 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 1) {..Tcl_Wrong
8210: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
8220: 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 1, objv, "");..r
8230: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8240: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
8250: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
8260: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
8270: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
8280: 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 ULL);..#if OPENS
8290: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
82a0: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 R < 0x10100000L
82b0: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 && !defined(NO_S
82c0: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL2) && !defined
82d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
82e0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
82f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
8300: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
8310: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
8320: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 protocols[TLS_SS
8330: 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 L2], -1));.#endi
8340: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
8350: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
8360: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
8370: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
8380: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
8390: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c _METHOD). Tcl
83a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
83b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
83c0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
83d0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
83e0: 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 [TLS_SSL3], -1))
83f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
8400: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 fined(NO_TLS1) &
8410: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
8420: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 SL_NO_TLS1) && !
8430: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8440: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a NO_TLS1_METHOD).
8450: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
8460: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
8470: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
8480: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
8490: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
84a0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
84b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
84c0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
84d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
84e0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
84f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
8500: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_1_METHOD).
8510: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
8520: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
8530: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
8540: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
8550: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d cols[TLS_TLS1_1]
8560: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
8570: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
8580: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
8590: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
85a0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
85b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
85c0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_2_METHOD).
85d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
85e0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
85f0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
8600: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 StringObj(protoc
8610: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c ols[TLS_TLS1_2],
8620: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 -1));.#endif.#i
8630: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
8640: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
8650: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
8660: 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1_3). Tcl_Lis
8670: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
8680: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
8690: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
86a0: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
86b0: 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a _TLS1_3], -1));.
86c0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f #endif.. Tcl_
86d0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
86e0: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
86f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
8700: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
8710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
8750: 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a . * HandshakeObj
8760: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
8770: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 s command is use
8780: 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 d to verify whet
8790: 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b her the handshak
87a0: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a e is complete. *
87b0: 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 .or not.. *. * R
87c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
87d0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
87e0: 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 . 1 means handsh
87f0: 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 ake complete, 0
8800: 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 means pending..
8810: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
8820: 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 s:. *.May force
8830: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 SSL negotiation
8840: 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 to take place..
8850: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
8860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8890: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
88a0: 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 ic int Handshake
88b0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
88c0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
88d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
88e0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
88f0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
8900: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
8910: 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 nnel chan;
8920: 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c /* The channel
8930: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
8940: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 n. */. State
8950: 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20 *statePtr;
8960: 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 /* client stat
8970: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 e for ssl socket
8980: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 */. const ch
8990: 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c ar *errStr = NUL
89a0: 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d L;. int ret =
89b0: 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 1;. int err
89c0: 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 = 0;. (void)
89d0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
89e0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
89f0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
8a00: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
8a10: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
8a20: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
8a30: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
8a40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8a50: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
8a60: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 _error();.. c
8a70: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
8a80: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c nnel(interp, Tcl
8a90: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
8aa0: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 1]), NULL);.
8ab0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
8ac0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
8ad0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
8ae0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
8af0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
8b00: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
8b10: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
8b20: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
8b30: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
8b40: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 han);. if (Tc
8b50: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
8b60: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
8b70: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
8b80: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
8b90: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
8ba0: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
8bb0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
8bc0: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e an),.. "\": n
8bd0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
8be0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
8bf0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
8c00: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
8c10: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c S", "HANDSHAKE",
8c20: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
8c30: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
8c40: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
8c50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
8c60: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
8c70: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
8c80: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
8c90: 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 ta(chan);.. d
8ca0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 printf("Calling
8cb0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
8cc0: 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 ct");. ret =
8cd0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
8ce0: 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 ct(statePtr, &er
8cf0: 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e r, 1);. dprin
8d00: 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 tf("Tls_WaitForC
8d10: 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a onnect returned:
8d20: 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 %i", ret);..
8d30: 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 if (ret < 0 &&
8d40: 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ((statePtr->flag
8d50: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e s & TLS_TCL_ASYN
8d60: 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 C) && (err == EA
8d70: 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e GAIN))) {..dprin
8d80: 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e tf("Async set an
8d90: 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 d err = EAGAIN")
8da0: 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 ;..ret = 0;.
8db0: 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c } else if (ret <
8dc0: 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 0) {..long resu
8dd0: 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 74 lt;..errStr = st
8de0: 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 atePtr->err;..Tc
8df0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e l_ResetResult(in
8e00: 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 terp);..Tcl_SetE
8e10: 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 rrno(err);...if
8e20: 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 (!errStr || (*er
8e30: 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 rStr == 0)) {..
8e40: 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f errStr = Tcl_
8e50: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 PosixError(inter
8e60: 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 p);..}...Tcl_App
8e70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
8e80: 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69 , "handshake fai
8e90: 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 led: ", errStr,
8ea0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
8eb0: 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20 53 .if ((result = S
8ec0: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 SL_get_verify_re
8ed0: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 sult(statePtr->s
8ee0: 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f sl)) != X509_V_O
8ef0: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 K) {.. Tcl_Ap
8f00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
8f10: 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22 22 2c p, " due to \"",
8f20: 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 X509_verify_cer
8f30: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72 t_error_string(r
8f40: 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20 28 63 esult), "\"", (c
8f50: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d har *) NULL);..}
8f60: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
8f70: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
8f80: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 , "HANDSHAKE", "
8f90: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
8fa0: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 ) NULL);..dprint
8fb0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c f("Returning TCL
8fc0: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 _ERROR with hand
8fd0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 shake failed: %s
8fe0: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 ", errStr);..ret
8ff0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
9000: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
9010: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 (err != 0) {..
9020: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 dprintf("Got a
9030: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 n error with a c
9040: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 ompleted handsha
9050: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 ke: err = %i", e
9060: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 rr);..}..ret = 1
9070: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
9080: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 intf("Returning
9090: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 TCL_OK with data
90a0: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a \"%i\"", ret);.
90b0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
90c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
90d0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 _NewIntObj(ret))
90e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
90f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d _OK;.}../*. *---
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9140: 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a . *. * ImportObj
9150: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
9160: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
9170: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
9180: 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d s the "ssl" comm
9190: 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 and. *. *.The ss
91a0: 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 l command pushes
91b0: 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 SSL over a (new
91c0: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 ly connected) tc
91d0: 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 p socket. *. * R
91e0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
91f0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
9200: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
9210: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 ects:. *.May mod
9220: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 ify the behavior
9230: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 of an IO channe
9240: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d l.. *. *--------
9250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
9290: 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 static int.Impor
92a0: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 tObjCmd(ClientDa
92b0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
92c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
92d0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
92e0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
92f0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
9300: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 annel chan;../*
9310: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
9320: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f et a mode on. */
9330: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
9340: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 ePtr;../* client
9350: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
9360: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c ocket */. SSL
9370: 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c _CTX *ctx..= NUL
9380: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a L;. Tcl_Obj *
9390: 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b 0a script..= NULL;.
93a0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 Tcl_Obj *pas
93b0: 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 sword..= NULL;.
93c0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 Tcl_Obj *vcmd
93d0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 ..= NULL;. Tc
93e0: 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 l_DString upperC
93f0: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
9400: 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 n, upperChannelB
9410: 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 locking, upperCh
9420: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 annelEncoding, u
9430: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
9440: 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b ar;. int idx;
9450: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 . Tcl_Size le
9460: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 n;. int flags
9470: 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 ...= TLS_TCL_INI
9480: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 T;. int serve
9490: 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63 r...= 0;./* is c
94a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 onnection incomi
94b0: 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 ng or outgoing?
94c0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 */. char *key
94d0: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 file..= NULL;.
94e0: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 char *certfile
94f0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e ..= NULL;. un
9500: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 signed char *key
9510: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 ..= NULL;. Tc
9520: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09 l_Size key_len..
9530: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 = 0;. unsigne
9540: 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d 20 d char *cert..=
9550: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 NULL;. Tcl_Si
9560: 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30 ze cert_len..= 0
9570: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 ;. char *ciph
9580: 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ers..= NULL;.
9590: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 char *ciphersui
95a0: 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 tes..= NULL;.
95b0: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09 3d char *CAfile..=
95c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
95d0: 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b *CApath..= NULL;
95e0: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 73 74 6f . char *CAsto
95f0: 72 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 re..= NULL;.
9600: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 09 char *DHparams..
9610: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
9620: 20 2a 6d 6f 64 65 6c 09 09 09 3d 20 4e 55 4c 4c *model...= NULL
9630: 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 ;. char *serv
9640: 65 72 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09 ername..= NULL;.
9650: 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 /* hostname for
9660: 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 Server Name Indi
9670: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 68 cation */. ch
9680: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 09 09 ar *session_id..
9690: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
96a0: 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c Obj *alpn..= NUL
96b0: 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 L;. int ssl2
96c0: 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 = 0, ssl3 = 0;.
96d0: 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c int tls1 = 1,
96e0: 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 tls1_1 = 1, tls
96f0: 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 1_2 = 1, tls1_3
9700: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f = 1;. int pro
9710: 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 to = 0, level =
9720: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 -1;. int veri
9730: 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 fy = 0, require
9740: 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 = 0, request = 1
9750: 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 , post_handshake
9760: 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 = 0;. (void)
9770: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 clientData;..
9780: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
9790: 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 d");..#if define
97a0: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 d(NO_TLS1) || de
97b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
97c0: 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 _TLS1). tls1
97d0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 0;.#endif.#if
97e0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
97f0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
9800: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
9810: 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b . tls1_1 = 0;
9820: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
9830: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c ned(NO_TLS1_2) |
9840: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
9850: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 L_NO_TLS1_2).
9860: 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e tls1_2 = 0;.#en
9870: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
9880: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
9890: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
98a0: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 _TLS1_3). tls
98b0: 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 1_3 = 0;.#endif.
98c0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 . if (objc <
98d0: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
98e0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
98f0: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c , objv, "channel
9900: 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 ?options?");..r
9910: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
9920: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
9930: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
9940: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
9950: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
9960: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 , Tcl_GetString(
9970: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b objv[1]), NULL);
9980: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
9990: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
99a0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
99b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
99c0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
99d0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
99e0: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
99f0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
9a00: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
9a10: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 nel(chan);..
9a20: 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 for (idx = 2; id
9a30: 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 x < objc; idx++)
9a40: 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 {..char *opt =
9a50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
9a60: 6a 76 5b 69 64 78 5d 29 3b 0a 0a 09 69 66 20 28 jv[idx]);...if (
9a70: 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 opt[0] != '-')..
9a80: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 break;...OPT
9a90: 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 OBJ("-alpn", alp
9aa0: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 n);..OPTSTR("-ca
9ab0: 64 69 72 22 2c 20 43 41 70 61 74 68 29 3b 0a 09 dir", CApath);..
9ac0: 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 OPTSTR("-cafile"
9ad0: 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 53 , CAfile);..OPTS
9ae0: 54 52 28 22 2d 63 61 73 74 6f 72 65 22 2c 20 43 TR("-castore", C
9af0: 41 73 74 6f 72 65 29 3b 0a 09 4f 50 54 42 59 54 Astore);..OPTBYT
9b00: 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c E("-cert", cert,
9b10: 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 cert_len);..OPT
9b20: 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c STR("-certfile",
9b30: 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 certfile);..OPT
9b40: 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63 STR("-cipher", c
9b50: 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 iphers);..OPTSTR
9b60: 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70 ("-ciphers", cip
9b70: 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 hers);..OPTSTR("
9b80: 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 20 -ciphersuites",
9b90: 63 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09 ciphersuites);..
9ba0: 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 OPTOBJ("-command
9bb0: 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 ", script);..OPT
9bc0: 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c STR("-dhparams",
9bd0: 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 DHparams);..OPT
9be0: 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 BYTE("-key", key
9bf0: 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 , key_len);..OPT
9c00: 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 STR("-keyfile",
9c10: 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 keyfile);..OPTST
9c20: 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 R("-model", mode
9c30: 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 l);..OPTOBJ("-pa
9c40: 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 ssword", passwor
9c50: 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 d);..OPTBOOL("-p
9c60: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20 ost_handshake",
9c70: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b post_handshake);
9c80: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 ..OPTBOOL("-requ
9c90: 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a est", request);.
9ca0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 .OPTBOOL("-requi
9cb0: 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 re", require);..
9cc0: 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74 OPTINT("-securit
9cd0: 79 5f 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 y_level", level)
9ce0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 ;..OPTBOOL("-ser
9cf0: 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 ver", server);..
9d00: 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e OPTSTR("-servern
9d10: 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 ame", servername
9d20: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 );..OPTSTR("-ses
9d30: 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f sion_id", sessio
9d40: 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 n_id);..OPTBOOL(
9d50: 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a "-ssl2", ssl2);.
9d60: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 .OPTBOOL("-ssl3"
9d70: 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f , ssl3);..OPTBOO
9d80: 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 L("-tls1", tls1)
9d90: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
9da0: 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 1.1", tls1_1);..
9db0: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 OPTBOOL("-tls1.2
9dc0: 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 ", tls1_2);..OPT
9dd0: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 BOOL("-tls1.3",
9de0: 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a tls1_3);..OPTOBJ
9df0: 28 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 ("-validatecomma
9e00: 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 nd", vcmd);..OPT
9e10: 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d OBJ("-vcmd", vcm
9e20: 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 d);...OPTBAD("op
9e30: 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d tion", "-alpn, -
9e40: 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 cadir, -cafile,
9e50: 2d 63 61 73 74 6f 72 65 2c 20 2d 63 65 72 74 2c -castore, -cert,
9e60: 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 -certfile, -cip
9e70: 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 her, -ciphersuit
9e80: 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 es, -command, -d
9e90: 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d hparams, -key, -
9ea0: 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c keyfile, -model,
9eb0: 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 -password, -pos
9ec0: 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 t_handshake, -re
9ed0: 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c quest, -require,
9ee0: 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c -security_level
9ef0: 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 , -server, -serv
9f00: 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e ername, -session
9f10: 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c _id, -ssl2, -ssl
9f20: 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 3, -tls1, -tls1.
9f30: 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 1, -tls1.2, -tls
9f40: 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 1.3, or -validat
9f50: 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 ecommand");...re
9f60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9f70: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 }. if (re
9f80: 71 75 65 73 74 29 09 09 76 65 72 69 66 79 20 7c quest)..verify |
9f90: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 = SSL_VERIFY_CLI
9fa0: 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 ENT_ONCE | SSL_V
9fb0: 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 ERIFY_PEER;.
9fc0: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72 if (request && r
9fd0: 65 71 75 69 72 65 29 09 76 65 72 69 66 79 20 7c equire).verify |
9fe0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 = SSL_VERIFY_FAI
9ff0: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 L_IF_NO_PEER_CER
a000: 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 T;. if (reque
a010: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 st && post_hands
a020: 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 hake).verify |=
a030: 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f SSL_VERIFY_POST_
a040: 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 HANDSHAKE;. i
a050: 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 f (verify == 0).
a060: 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 .verify = SSL_VE
a070: 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 RIFY_NONE;..
a080: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f proto |= (ssl2 ?
a090: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 TLS_PROTO_SSL2
a0a0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
a0b0: 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 |= (ssl3 ? TLS_P
a0c0: 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a ROTO_SSL3 : 0);.
a0d0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
a0e0: 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 s1 ? TLS_PROTO_T
a0f0: 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 LS1 : 0);. pr
a100: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f oto |= (tls1_1 ?
a110: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
a120: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 1 : 0);. prot
a130: 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 o |= (tls1_2 ? T
a140: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 LS_PROTO_TLS1_2
a150: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
a160: 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 |= (tls1_3 ? TLS
a170: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 _PROTO_TLS1_3 :
a180: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 0);.. /* rese
a190: 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 t to NULL if bla
a1a0: 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 nk string provid
a1b0: 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 ed */. if (ce
a1c0: 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 rt && !*cert)..
a1d0: 20 20 20 20 20 20 20 63 65 72 74 09 20 20 20 20 cert.
a1e0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a1f0: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 if (key && !*key
a200: 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 ).. key.
a210: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a220: 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 if (certfile
a230: 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 && !*certfile)
a240: 20 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 certfile.
a250: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
a260: 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 keyfile && !*key
a270: 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 file)..keyfile.
a280: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a290: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26 if (ciphers &
a2a0: 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 & !*ciphers).
a2b0: 20 20 20 20 20 63 69 70 68 65 72 73 09 20 20 20 ciphers.
a2c0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
a2d0: 20 69 66 20 28 63 69 70 68 65 72 73 75 69 74 65 if (ciphersuite
a2e0: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 s && !*ciphersui
a2f0: 74 65 73 29 20 63 69 70 68 65 72 73 75 69 74 65 tes) ciphersuite
a300: 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 s = NULL;.
a310: 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 if (CAfile && !
a320: 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 *CAfile).
a330: 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 CAfile.
a340: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
a350: 43 41 70 61 74 68 20 26 26 20 21 2a 43 41 70 61 CApath && !*CApa
a360: 74 68 29 09 20 20 20 20 20 20 20 20 43 41 70 61 th). CApa
a370: 74 68 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c th. = NUL
a380: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 73 74 6f L;. if (CAsto
a390: 72 65 20 26 26 20 21 2a 43 41 73 74 6f 72 65 29 re && !*CAstore)
a3a0: 09 20 20 20 20 20 20 20 20 43 41 73 74 6f 72 65 . CAstore
a3b0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
a3c0: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d . if (DHparam
a3d0: 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 s && !*DHparams)
a3e0: 09 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d . DHparam
a3f0: 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b s = NULL;
a400: 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c .. /* new SSL
a410: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 state */. st
a420: 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 atePtr..= (State
a430: 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 *) ckalloc((uns
a440: 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 igned) sizeof(St
a450: 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 ate));. memse
a460: 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 t(statePtr, 0, s
a470: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a izeof(State));..
a480: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c statePtr->fl
a490: 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 ags.= flags;.
a4a0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
a4b0: 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 p.= interp;.
a4c0: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 statePtr->vflags
a4d0: 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 .= verify;. s
a4e0: 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 tatePtr->err.= "
a4f0: 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 ";.. /* alloc
a500: 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 ate script */.
a510: 20 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a if (script) {.
a520: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 .(void) Tcl_GetS
a530: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 tringFromObj(scr
a540: 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 ipt, &len);..if
a550: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 (len) {.. sta
a560: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
a570: 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 = script;.. T
a580: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
a590: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
a5a0: 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ck);..}. }..
a5b0: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 /* allocate p
a5c0: 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 assword */. i
a5d0: 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 f (password) {..
a5e0: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 (void) Tcl_GetSt
a5f0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 ringFromObj(pass
a600: 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 word, &len);..if
a610: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 (len) {.. st
a620: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
a630: 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 = password;..
a640: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
a650: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 nt(statePtr->pas
a660: 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d sword);..}. }
a670: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 .. /* allocat
a680: 65 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 e validate comma
a690: 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 nd */. if (vc
a6a0: 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 md) {..(void) Tc
a6b0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
a6c0: 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a bj(vcmd, &len);.
a6d0: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 .if (len) {..
a6e0: 20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 statePtr->vcmd
a6f0: 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c = vcmd;.. Tcl
a700: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _IncrRefCount(st
a710: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 atePtr->vcmd);..
a720: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 }. }.. if
a730: 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 (model != NULL)
a740: 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a {..int mode;../*
a750: 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 Get the "model"
a760: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 context */..cha
a770: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
a780: 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c el(interp, model
a790: 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 , &mode);..if (c
a7a0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
a7b0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 nel) NULL) {..
a7c0: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f Tls_Free((tls_
a7d0: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 free_type *) sta
a7e0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
a7f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
a800: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 }.../*.. * Make
a810: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
a820: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
a830: 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 hannel.. */..cha
a840: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
a850: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 annel(chan);..if
a860: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
a870: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
a880: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
a890: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
a8a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
a8b0: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
a8c0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
a8d0: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 lName(chan),..."
a8e0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
a8f0: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 annel", (char *)
a900: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c NULL);.. Tcl
a910: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
a920: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
a930: 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 PORT", "CHANNEL"
a940: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
a950: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
a960: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f Tls_Free((tls_
a970: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 free_type *) sta
a980: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
a990: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
a9a0: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 }..ctx = ((State
a9b0: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *)Tcl_GetChanne
a9c0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
a9d0: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d an))->ctx;. }
a9e0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 else {..if ((ct
a9f0: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 x = CTX_Init(sta
aa00: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 tePtr, server, p
aa10: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 roto, keyfile, c
aa20: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 ertfile, key, ce
aa30: 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 rt, key_len,..
aa40: 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61 cert_len, CApa
aa50: 74 68 2c 20 43 41 73 74 6f 72 65 2c 20 43 41 66 th, CAstore, CAf
aa60: 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 ile, ciphers, ci
aa70: 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 phersuites, leve
aa80: 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d l, DHparams)) ==
aa90: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c NULL) {.. Tl
aaa0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 s_Free((tls_free
aab0: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 _type *) statePt
aac0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
aad0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
aae0: 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 }.. statePt
aaf0: 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 r->ctx = ctx;..
ab00: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 /*. * We
ab10: 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 need to make sur
ab20: 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e e that the chann
ab30: 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 el works in bina
ab40: 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 ry (for the.
ab50: 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f * encryption no
ab60: 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 t to get goofed
ab70: 75 70 29 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 up).. */.
ab80: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
ab90: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 (&upperChannelTr
aba0: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 anslation);.
abb0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
abc0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f &upperChannelBlo
abd0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f cking);. Tcl_
abe0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 DStringInit(&upp
abf0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
ac00: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
ac10: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
ac20: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 nnelEncoding);.
ac30: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
ac40: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
ac50: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 chan, "-eofchar"
ac60: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 , &upperChannelE
ac70: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c OFChar);. Tcl
ac80: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
ac90: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
aca0: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 "-encoding", &up
acb0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
acc0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ng);. Tcl_Get
acd0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
ace0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 terp, chan, "-tr
acf0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 anslation", &upp
ad00: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
ad10: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 tion);. Tcl_G
ad20: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
ad30: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
ad40: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 blocking", &uppe
ad50: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
ad60: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
ad70: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
ad80: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e rp, chan, "-tran
ad90: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 slation", "binar
ada0: 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 y");. Tcl_Set
adb0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
adc0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c terp, chan, "-bl
add0: 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 ocking", "true")
ade0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 ;. dprintf("C
adf0: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 onsuming Tcl cha
ae00: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 nnel %s", Tcl_Ge
ae10: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
ae20: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 n));. statePt
ae30: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 r->self = Tcl_St
ae40: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 ackChannel(inter
ae50: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 p, Tls_ChannelTy
ae60: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 pe(), (ClientDat
ae70: 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54 a) statePtr,..(T
ae80: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 CL_READABLE | TC
ae90: 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 L_WRITABLE), cha
aea0: 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 n);. dprintf(
aeb0: 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c "Created channel
aec0: 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f named %s", Tcl_
aed0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
aee0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b tatePtr->self));
aef0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
af00: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f r->self == (Tcl_
af10: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
af20: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 ../*.. * No use
af30: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c of Tcl_Eventuall
af40: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f yFree because no
af50: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 possible Tcl_Pr
af60: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c eserve... */..Tl
af70: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 s_Free((tls_free
af80: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 _type *) statePt
af90: 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 r);..Tcl_DString
afa0: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e Free(&upperChann
afb0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
afc0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
afd0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e (&upperChannelEn
afe0: 63 6f 64 69 6e 67 29 3b 0a 09 54 63 6c 5f 44 53 coding);..Tcl_DS
aff0: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
b000: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
b010: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
b020: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 e(&upperChannelB
b030: 6c 6f 63 6b 69 6e 67 29 3b 0a 09 72 65 74 75 72 locking);..retur
b040: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
b050: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 }.. Tcl_SetC
b060: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
b070: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
b080: 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 elf, "-translati
b090: 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 on", Tcl_DString
b0a0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
b0b0: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 nelTranslation))
b0c0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
b0d0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
b0e0: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
b0f0: 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 f, "-encoding",
b100: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
b110: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e (&upperChannelEn
b120: 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 coding));. Tc
b130: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
b140: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 on(interp, state
b150: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 Ptr->self, "-eof
b160: 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 char", Tcl_DStri
b170: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
b180: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a annelEOFChar));.
b190: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
b1a0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
b1b0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c statePtr->self,
b1c0: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 "-blocking", Tc
b1d0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
b1e0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
b1f0: 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f king));. Tcl_
b200: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 DStringFree(&upp
b210: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
b220: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 tion);. Tcl_D
b230: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 StringFree(&uppe
b240: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
b250: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
b260: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 ngFree(&upperCha
b270: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 nnelEOFChar);.
b280: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
b290: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 e(&upperChannelB
b2a0: 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f locking);.. /
b2b0: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 *. * SSL Ini
b2c0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 tialization.
b2d0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
b2e0: 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 ->ssl = SSL_new(
b2f0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a statePtr->ctx);.
b300: 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 if (!statePt
b310: 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 r->ssl) {../* SS
b320: 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 L library error
b330: 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 */..Tcl_AppendRe
b340: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f sult(interp, "co
b350: 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 uldn't construct
b360: 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c ssl session: ",
b370: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
b380: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
b390: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
b3a0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
b3b0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
b3c0: 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 , "INIT", "FAILE
b3d0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
b3e0: 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 74 L);..Tls_Free((t
b3f0: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 ls_free_type *)
b400: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 statePtr);..retu
b410: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
b420: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 }.. /* Set
b430: 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 host server name
b440: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 */. if (serv
b450: 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 ername) {../* Se
b460: 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 ts the server na
b470: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 me indication (S
b480: 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c NI) in ClientHel
b490: 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a lo extension */.
b4a0: 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 ./* Per RFC 6066
b4b0: 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 , hostname is a
b4c0: 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 ASCII encoded st
b4d0: 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43 ring, though RFC
b4e0: 20 34 33 36 36 20 73 61 79 73 20 55 54 46 2d 38 4366 says UTF-8
b4f0: 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 . */..if (!SSL_s
b500: 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e et_tlsext_host_n
b510: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ame(statePtr->ss
b520: 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 l, servername) &
b530: 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 & require) {..
b540: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
b550: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 lt(interp, "Set
b560: 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 SNI extension fa
b570: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 iled: ", GET_ERR
b580: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 _REASON(), (char
b590: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
b5a0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
b5b0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
b5c0: 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c "IMPORT", "SNI",
b5d0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
b5e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
b5f0: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 Tls_Free((tls_fr
b600: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 ee_type *) state
b610: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
b620: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
b630: 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d ../* Set hostnam
b640: 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 e for peer certi
b650: 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 ficate hostname
b660: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 verification in
b670: 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e clients... Don
b680: 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 't use SSL_set1_
b690: 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68 61 host since it ha
b6a0: 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a s limitations. *
b6b0: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 /..if (!SSL_add1
b6c0: 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e _host(statePtr->
b6d0: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 ssl, servername)
b6e0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
b6f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
b700: 2c 20 22 53 65 74 20 44 4e 53 20 68 6f 73 74 6e , "Set DNS hostn
b710: 61 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 ame failed: ", G
b720: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
b730: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b740: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
b750: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
b760: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
b770: 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 "HOSTNAME", "FAI
b780: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
b790: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
b7a0: 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 ree((tls_free_ty
b7b0: 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b pe *) statePtr);
b7c0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
b7d0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
b7e0: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 .. /* Resume
b7f0: 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 session id */.
b800: 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 if (session_id
b810: 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 && strlen(sessi
b820: 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 on_id) <= SSL_MA
b830: 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 X_SID_CTX_LENGTH
b840: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f ) {../* SSL_set_
b850: 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 session() */..if
b860: 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 (!SSL_SESSION_s
b870: 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 et1_id_context(S
b880: 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 SL_get_session(s
b890: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 0a 09 tatePtr->ssl),..
b8a0: 09 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 .(const unsigned
b8b0: 20 63 68 61 72 20 2a 29 20 73 65 73 73 69 6f 6e char *) session
b8c0: 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 _id, (unsigned i
b8d0: 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69 nt) strlen(sessi
b8e0: 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20 on_id))) {..
b8f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
b900: 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65 (interp, "Resume
b910: 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64 3a session failed:
b920: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 ", GET_ERR_REAS
b930: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
b940: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 ULL);.. Tcl_S
b950: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
b960: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
b970: 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 RT", "SESSION",
b980: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
b990: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b9a0: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 ls_Free((tls_fre
b9b0: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 e_type *) stateP
b9c0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
b9d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
b9e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 }.. /* Ena
b9f0: 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d ble Application-
ba00: 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e Layer Protocol N
ba10: 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d egotiation. Exam
ba20: 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f 31 ples are: http/1
ba30: 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 .0,..http/1.1, h
ba40: 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2, h3, ftp, imap
ba50: 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 , pop3, xmpp-cli
ba60: 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 ent, xmpp-server
ba70: 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 63 , mqtt, irc, etc
ba80: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 . */. if (alp
ba90: 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 n) {../* Convert
baa0: 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f a TCL list into
bab0: 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 a protocol-list
bac0: 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 in wire-format
bad0: 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 */..unsigned cha
bae0: 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 r *protos, *p;..
baf0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f unsigned int pro
bb00: 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 tos_len = 0;..Tc
bb10: 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 l_Size cnt, i;..
bb20: 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 int j;..Tcl_Obj
bb30: 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 **list;...if (Tc
bb40: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d l_ListObjGetElem
bb50: 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 ents(interp, alp
bb60: 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 n, &cnt, &list)
bb70: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
bb80: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f Tls_Free((tls_
bb90: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 free_type *) sta
bba0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
bbb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
bbc0: 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 }.../* Determine
bbd0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 the memory requ
bbe0: 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f ired for the pro
bbf0: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 tocol-list */..f
bc00: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 or (i = 0; i < c
bc10: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 nt; i++) {..
bc20: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
bc30: 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c mObj(list[i], &l
bc40: 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 en);.. if (le
bc50: 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c n > 255) {...Tcl
bc60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
bc70: 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 terp, "ALPN prot
bc80: 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 6c ocol names too l
bc90: 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ong", (char *) N
bca0: 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 ULL);...Tcl_SetE
bcb0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
bcc0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
bcd0: 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 , "ALPN", "FAILE
bce0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
bcf0: 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 L);...Tls_Free((
bd00: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 tls_free_type *)
bd10: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 statePtr);...re
bd20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
bd30: 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 . }.. prot
bd40: 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 os_len += 1 + (i
bd50: 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a nt) len;..}.../*
bd60: 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c Build the compl
bd70: 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 ete protocol-lis
bd80: 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 t */..protos = c
bd90: 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 kalloc(protos_le
bda0: 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c n);../* protocol
bdb0: 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f -lists consist o
bdc0: 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 f 8-bit length-p
bdd0: 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 refixed, byte st
bde0: 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a rings */..for (j
bdf0: 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 = 0, p = protos
be00: 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 ; j < cnt; j++)
be10: 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 {.. char *str
be20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
be30: 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c FromObj(list[j],
be40: 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b &len);.. *p+
be50: 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 + = (unsigned ch
be60: 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 ar) len;.. me
be70: 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 mcpy(p, str, (si
be80: 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 ze_t) len);..
be90: 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 p += len;..}...
bea0: 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f /* SSL_set_alpn_
beb0: 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 protos makes a c
bec0: 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f opy of the proto
bed0: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 col-list */../*
bee0: 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 Note: This funct
bef0: 69 6f 6e 20 72 65 76 65 72 73 65 73 20 74 68 65 ion reverses the
bf00: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f return value co
bf10: 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 nvention */..if
bf20: 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 (SSL_set_alpn_pr
bf30: 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 otos(statePtr->s
bf40: 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 sl, protos, prot
bf50: 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 os_len)) {..
bf60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
bf70: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c (interp, "Set AL
bf80: 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 PN protocols fai
bf90: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f led: ", GET_ERR_
bfa0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
bfb0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
bfc0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
bfd0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
bfe0: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c IMPORT", "ALPN",
bff0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
c000: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
c010: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 Tls_Free((tls_fr
c020: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 ee_type *) state
c030: 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 Ptr);.. ckfre
c040: 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 e(protos);..
c050: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
c060: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 ;..}.../* Store
c070: 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a protocols list *
c080: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f /..statePtr->pro
c090: 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 tos = protos;..s
c0a0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f tatePtr->protos_
c0b0: 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e len = protos_len
c0c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
c0d0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
c0e0: 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 = NULL;..stateP
c0f0: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d tr->protos_len =
c100: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 0;. }.. /
c110: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c *. * SSL Cal
c120: 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 lbacks. */.
c130: 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 SSL_set_app_d
c140: 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ata(statePtr->ss
c150: 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 l, (void *)state
c160: 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 Ptr);./* point b
c170: 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 ack to us */.
c180: 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 SSL_set_verify(
c190: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 statePtr->ssl, v
c1a0: 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c erify, VerifyCal
c1b0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 2f 2a 53 53 lback);. /*SS
c1c0: 4c 5f 73 65 74 5f 76 65 72 69 66 79 5f 64 65 70 L_set_verify_dep
c1d0: 74 68 28 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 th(SSL_set_verif
c1e0: 79 5f 64 65 70 74 68 2c 20 30 29 3b 2a 2f 0a 20 y_depth, 0);*/.
c1f0: 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f SSL_set_info_
c200: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 callback(statePt
c210: 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c r->ssl, InfoCall
c220: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 back);.. /* C
c230: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 allback for obse
c240: 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d rving protocol m
c250: 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 essages */.#ifnd
c260: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ef OPENSSL_NO_SS
c270: 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 L_TRACE. /* v
c280: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f oid SSL_CTX_set_
c290: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 msg_callback_arg
c2a0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c2b0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
c2c0: 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f );. void SSL_
c2d0: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c CTX_set_msg_call
c2e0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 back(statePtr->c
c2f0: 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 tx, MessageCallb
c300: 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c ack); */. SSL
c310: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 _set_msg_callbac
c320: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e k_arg(statePtr->
c330: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ssl, (void *)sta
c340: 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f tePtr);. SSL_
c350: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
c360: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c370: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 MessageCallback)
c380: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a ;.#endif.. /*
c390: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e Create Tcl_Chan
c3a0: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 nel BIO Handler
c3b0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
c3c0: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 >p_bio.= BIO_new
c3d0: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 _tcl(statePtr, B
c3e0: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 IO_NOCLOSE);.
c3f0: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d statePtr->bio.=
c400: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 BIO_new(BIO_f_s
c410: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 sl());.. if (
c420: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 server) {../* Se
c430: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a rver callbacks *
c440: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 /..SSL_CTX_set_t
c450: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 lsext_servername
c460: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 _arg(statePtr->c
c470: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 tx, (void *)stat
c480: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f ePtr);..SSL_CTX_
c490: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 set_tlsext_serve
c4a0: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 rname_callback(s
c4b0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e tatePtr->ctx, SN
c4c0: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c ICallback);..SSL
c4d0: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
c4e0: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 hello_cb(statePt
c4f0: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c r->ctx, HelloCal
c500: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 lback, (void *)s
c510: 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 tatePtr);..if (s
c520: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
c530: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
c540: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e SSL_CTX_set_alpn
c550: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 _select_cb(state
c560: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 Ptr->ctx, ALPNCa
c570: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
c580: 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 statePtr);.#ifde
c590: 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 f USE_NPN.. i
c5a0: 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 f (tls1_2 == 0 &
c5b0: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b & tls1_3 == 0) {
c5c0: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e ...SSL_CTX_set_n
c5d0: 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 ext_protos_adver
c5e0: 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 tised_cb(statePt
c5f0: 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 r->ctx, NPNCallb
c600: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ack, (void *)sta
c610: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 tePtr);.. }.#
c620: 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e endif..}.../* En
c630: 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 able server to s
c640: 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74 end cert request
c650: 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 after handshake
c660: 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 (TLS 1.3 only)
c670: 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f */../* A write o
c680: 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 peration must ta
c690: 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 ke place for the
c6a0: 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71 Certificate Req
c6b0: 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 uest to be.. s
c6c0: 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e ent to the clien
c6d0: 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 t, this can be d
c6e0: 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f one with SSL_do_
c6f0: 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a handshake(). */.
c700: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 .if (request &&
c710: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 post_handshake &
c720: 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 & tls1_3) {..
c730: 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 SSL_verify_clie
c740: 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b nt_post_handshak
c750: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
c760: 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 ;..}.../* set au
c770: 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 tomatic curve se
c780: 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f lection */..SSL_
c790: 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 set_ecdh_auto(st
c7a0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b atePtr->ssl, 1);
c7b0: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 .../* Set server
c7c0: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 mode */..stateP
c7d0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 tr->flags |= TLS
c7e0: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 _TCL_SERVER;..SS
c7f0: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 L_set_accept_sta
c800: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
c810: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
c820: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 ./* Client callb
c830: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 acks */.#ifdef U
c840: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 SE_NPN..if (stat
c850: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
c860: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d NULL && tls1_2 =
c870: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d = 0 && tls1_3 ==
c880: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 0) {.. SSL_C
c890: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 TX_set_next_prot
c8a0: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 o_select_cb(stat
c8b0: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 ePtr->ctx, ALPNC
c8c0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
c8d0: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 )statePtr);..}.#
c8e0: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 endif.../* Sessi
c8f0: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 on caching */..S
c900: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 SL_CTX_set_sessi
c910: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 on_cache_mode(st
c920: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c atePtr->ctx, SSL
c930: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 _SESS_CACHE_CLIE
c940: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 NT | SSL_SESS_CA
c950: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f CHE_NO_INTERNAL_
c960: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 STORE);..SSL_CTX
c970: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 _sess_set_new_cb
c980: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c990: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 SessionCallback)
c9a0: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f ;.../* Enable po
c9b0: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 st handshake Aut
c9c0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 hentication exte
c9d0: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f nsion. TLS 1.3 o
c9e0: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e nly, not http/2.
c9f0: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 */..if (request
ca00: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 && post_handsha
ca10: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 ke) {.. SSL_s
ca20: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b et_post_handshak
ca30: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d e_auth(statePtr-
ca40: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f >ssl, 1);..}.../
ca50: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 * Set client mod
ca60: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f e */..SSL_set_co
ca70: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 nnect_state(stat
ca80: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
ca90: 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 }. SSL_set_bi
caa0: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c o(statePtr->ssl,
cab0: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
cac0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 , statePtr->p_bi
cad0: 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f o);. BIO_set_
cae0: 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 ssl(statePtr->bi
caf0: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c o, statePtr->ssl
cb00: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a , BIO_NOCLOSE);.
cb10: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 . /*. * E
cb20: 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 nd of SSL Init.
cb30: 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e */. dprin
cb40: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 tf("Returning %s
cb50: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
cb60: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
cb70: 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f self));. Tcl_
cb80: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
cb90: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 , (char *) Tcl_G
cba0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
cbb0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 atePtr->self), T
cbc0: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 CL_VOLATILE);..
cbd0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
cbe0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
cc30: 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a *. * UnimportObj
cc40: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
cc50: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
cc60: 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 nvoked to remove
cc70: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
cc80: 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a nnel filter.. *.
cc90: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
cca0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
ccb0: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
ccc0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 effects:. *.May
ccd0: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 modify the beha
cce0: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 vior of an IO ch
ccf0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d annel.. *. *----
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
cd40: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 */.static int.U
cd50: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c nimportObjCmd(Cl
cd60: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
cd70: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
cd80: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
cd90: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
cda0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
cdb0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
cdc0: 2c 20 63 68 69 6c 64 3b 09 2f 2a 20 54 68 65 20 , child;./* The
cdd0: 73 74 61 63 6b 65 64 20 61 6e 64 20 75 6e 64 65 stacked and unde
cde0: 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 73 20 rlying channels
cdf0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 */. Tcl_DStri
ce00: 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 ng upperChannelT
ce10: 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 ranslation, uppe
ce20: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
ce30: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e , upperChannelEn
ce40: 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 coding, upperCha
ce50: 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 nnelEOFChar;.
ce60: 20 69 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f 4f int res = TCL_O
ce70: 4b 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c K;. (void) cl
ce80: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 ientData;.. d
ce90: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
cea0: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
ceb0: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
cec0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
ced0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
cee0: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 nel");..return T
cef0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
cf00: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 . /* Validate
cf10: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 2a 2f channel name */
cf20: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
cf30: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
cf40: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
cf50: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 (objv[1]), NULL)
cf60: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
cf70: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
cf80: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
cf90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
cfa0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
cfb0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
cfc0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
cfd0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
cfe0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
cff0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
d000: 63 68 69 6c 64 20 3d 20 54 63 6c 5f 47 65 74 53 child = Tcl_GetS
d010: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 63 68 tackedChannel(ch
d020: 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 an);.. /* Ver
d030: 69 66 79 20 69 73 20 61 20 73 74 61 63 6b 65 64 ify is a stacked
d040: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
d050: 69 66 20 28 63 68 69 6c 64 20 3d 3d 20 4e 55 4c if (child == NUL
d060: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
d070: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
d080: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
d090: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
d0a0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
d0b0: 3a 20 6e 6f 74 20 61 20 73 74 61 63 6b 65 64 20 : not a stacked
d0c0: 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 channel", (char
d0d0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
d0e0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
d0f0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
d100: 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e UNIMPORT", "CHAN
d110: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c NEL", "INVALID",
d120: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d130: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
d140: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
d150: 2a 20 46 6c 75 73 68 20 61 6e 79 20 70 65 6e 64 * Flush any pend
d160: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 ing data */.
d170: 69 66 20 28 54 63 6c 5f 46 6c 75 73 68 28 63 68 if (Tcl_Flush(ch
d180: 61 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b an) != TCL_OK) {
d190: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
d1a0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
d1b0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
d1c0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
d1d0: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 slation);. Tc
d1e0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
d1f0: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
d200: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ing);. Tcl_DS
d210: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
d220: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
d230: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d240: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
d250: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 0a 20 20 elEncoding);..
d260: 20 20 2f 2a 20 47 65 74 20 63 75 72 72 65 6e 74 /* Get current
d270: 20 63 6f 6e 66 69 67 20 2d 20 45 4f 4c 20 74 72 config - EOL tr
d280: 61 6e 73 6c 61 74 69 6f 6e 2c 20 65 6e 63 6f 64 anslation, encod
d290: 69 6e 67 20 61 6e 64 20 62 75 66 66 65 72 69 6e ing and bufferin
d2a0: 67 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 73 68 g options are sh
d2b0: 61 72 65 64 20 62 65 74 77 65 65 6e 20 61 6c 6c ared between all
d2c0: 20 63 68 61 6e 6e 65 6c 73 20 69 6e 20 74 68 65 channels in the
d2d0: 20 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20 54 63 stack */. Tc
d2e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_GetChannelOpti
d2f0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
d300: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 "-blocking", &u
d310: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
d320: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 ing);. Tcl_Ge
d330: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
d340: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 nterp, chan, "-e
d350: 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 ncoding", &upper
d360: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
d370: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 ;. Tcl_GetCha
d380: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
d390: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 p, chan, "-eofch
d3a0: 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e ar", &upperChann
d3b0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 elEOFChar);.
d3c0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
d3d0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
d3e0: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
d3f0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
d400: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 0a 20 Translation);..
d410: 20 20 20 2f 2a 20 55 6e 73 74 61 63 6b 20 74 68 /* Unstack th
d420: 65 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20 72 65 e channel and re
d430: 73 74 6f 72 65 20 75 6e 64 65 72 6c 79 69 6e 67 store underlying
d440: 20 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 channel config
d450: 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 */. if (Tcl_U
d460: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e nstackChannel(in
d470: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 terp, chan) == T
d480: 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 65 CL_OK) {..Tcl_Se
d490: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
d4a0: 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c 20 22 2d nterp, child, "-
d4b0: 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 encoding", Tcl_D
d4c0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
d4d0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
d4e0: 67 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43 68 61 g));..Tcl_SetCha
d4f0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
d500: 70 2c 20 63 68 69 6c 64 2c 20 22 2d 65 6f 66 63 p, child, "-eofc
d510: 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e har", Tcl_DStrin
d520: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
d530: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 09 nnelEOFChar));..
d540: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
d550: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 69 tion(interp, chi
d560: 6c 64 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f ld, "-translatio
d570: 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 n", Tcl_DStringV
d580: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
d590: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b elTranslation));
d5a0: 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c ..Tcl_SetChannel
d5b0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
d5c0: 68 69 6c 64 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 hild, "-blocking
d5d0: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 ", Tcl_DStringVa
d5e0: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 lue(&upperChanne
d5f0: 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 lBlocking));.
d600: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
d610: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
d620: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d }.. /* Clean-
d630: 75 70 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 up */. Tcl_DS
d640: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
d650: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
d660: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 on);. Tcl_DSt
d670: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 ringFree(&upperC
d680: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b hannelEncoding);
d690: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d6a0: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e Free(&upperChann
d6b0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 elEOFChar);.
d6c0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
d6d0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f &upperChannelBlo
d6e0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 72 65 74 75 cking);. retu
d6f0: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 rn res;.}.../*.
d700: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
d710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d740: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 ----. *. * CTX_I
d750: 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 nit -- construct
d760: 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 a SSL_CTX insta
d770: 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 nce. *. * Result
d780: 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 s:. *.A valid SS
d790: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f L_CTX instance o
d7a0: 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 r NULL.. *. * Si
d7b0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 de effects:. *.c
d7c0: 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f onstructs SSL co
d7d0: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 ntext (CTX). *.
d7e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
d7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d820: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
d830: 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e SSL_CTX *.CTX_In
d840: 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 it(State *stateP
d850: 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 tr, int isServer
d860: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 , int proto, cha
d870: 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 r *keyfile, char
d880: 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 *certfile,.
d890: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b unsigned char *k
d8a0: 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ey, unsigned cha
d8b0: 72 20 2a 63 65 72 74 2c 20 54 63 6c 5f 53 69 7a r *cert, Tcl_Siz
d8c0: 65 20 6b 65 79 5f 6c 65 6e 2c 20 54 63 6c 5f 53 e key_len, Tcl_S
d8d0: 69 7a 65 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 ize cert_len, ch
d8e0: 61 72 20 2a 43 41 70 61 74 68 2c 0a 20 20 20 20 ar *CApath,.
d8f0: 63 68 61 72 20 2a 43 41 73 74 6f 72 65 2c 20 63 char *CAstore, c
d900: 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 har *CAfile, cha
d910: 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 r *ciphers, char
d920: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 *ciphersuites,
d930: 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 int level, char
d940: 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 *DHparams) {.
d950: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
d960: 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e erp = statePtr->
d970: 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f interp;. SSL_
d980: 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b CTX *ctx = NULL;
d990: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d9a0: 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 ds;. int off
d9b0: 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b = 0, abort = 0;
d9c0: 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 . int load_pr
d9d0: 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 ivate_key;. c
d9e0: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 onst SSL_METHOD
d9f0: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 *method;.. dp
da00: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
da10: 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f .. if (!proto
da20: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
da30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e esult(interp, "n
da40: 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c o valid protocol
da50: 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61 selected", (cha
da60: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
da70: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
da80: 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 . /* create S
da90: 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 SL context */.#i
daa0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
dab0: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 N_NUMBER >= 0x10
dac0: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 100000L || defin
dad0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 ed(NO_SSL2) || d
dae0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
daf0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 O_SSL2). if (
db00: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
db10: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 LS_PROTO_SSL2))
db20: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
db30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c ult(interp, "SSL
db40: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 2 protocol not s
db50: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
db60: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
db70: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
db80: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
db90: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 d(NO_SSL3) || de
dba0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
dbb0: 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 _SSL3). if (E
dbc0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
dbd0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b S_PROTO_SSL3)) {
dbe0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
dbf0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 lt(interp, "SSL3
dc00: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
dc10: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
dc20: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
dc30: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
dc40: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
dc50: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 (NO_TLS1) || def
dc60: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
dc70: 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e TLS1). if (EN
dc80: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
dc90: 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a _PROTO_TLS1)) {.
dca0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
dcb0: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
dcc0: 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .0 protocol not
dcd0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
dce0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
dcf0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
dd00: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
dd10: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
dd20: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
dd30: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 _NO_TLS1_1).
dd40: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
dd50: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
dd60: 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 1_1)) {..Tcl_App
dd70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
dd80: 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f , "TLS 1.1 proto
dd90: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
dda0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
ddb0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
ddc0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
ddd0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
dde0: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_2) || defined
ddf0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
de00: 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 _2). if (ENAB
de10: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
de20: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a ROTO_TLS1_2)) {.
de30: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
de40: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
de50: 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .2 protocol not
de60: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
de70: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
de80: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
de90: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
dea0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c ed(NO_TLS1_3) ||
deb0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
dec0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
ded0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
dee0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
def0: 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 1_3)) {..Tcl_App
df00: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
df10: 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f , "TLS 1.3 proto
df20: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
df30: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
df40: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
df50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 ;. }.#endif.
df60: 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 if (proto ==
df70: 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 0) {../* Use ful
df80: 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f l range */..SSL_
df90: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 CTX_set_min_prot
dfa0: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 o_version(ctx, 0
dfb0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
dfc0: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f max_proto_versio
dfd0: 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d n(ctx, 0);. }
dfe0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72 .. switch (pr
dff0: 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 oto) {.#if OPENS
e000: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
e010: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 R < 0x10100000L
e020: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 && !defined(NO_S
e030: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL2) && !defined
e040: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
e050: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
e060: 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 ROTO_SSL2:..meth
e070: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
e080: 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 SSLv2_server_met
e090: 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c hod() : SSLv2_cl
e0a0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
e0b0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
e0c0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
e0d0: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
e0e0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
e0f0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
e100: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 NSSL_NO_SSL3_MET
e110: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c HOD). case TL
e120: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d S_PROTO_SSL3:..m
e130: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
e140: 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f ? SSLv3_server_
e150: 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 method() : SSLv3
e160: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
e170: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
e180: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
e190: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e _TLS1) && !defin
e1a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e1b0: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
e1c0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
e1d0: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 METHOD). case
e1e0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a TLS_PROTO_TLS1:
e1f0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
e200: 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 ver ? TLSv1_serv
e210: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c er_method() : TL
e220: 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f Sv1_client_metho
e230: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
e240: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
e250: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 (NO_TLS1_1) && !
e260: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e270: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
e280: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e290: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 O_TLS1_1_METHOD)
e2a0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
e2b0: 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 OTO_TLS1_1:..met
e2c0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
e2d0: 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f TLSv1_1_server_
e2e0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 method() : TLSv1
e2f0: 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 _1_client_method
e300: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
e310: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
e320: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
e330: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e340: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
e350: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e360: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a _TLS1_2_METHOD).
e370: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
e380: 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 TO_TLS1_2:..meth
e390: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
e3a0: 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d TLSv1_2_server_m
e3b0: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f ethod() : TLSv1_
e3c0: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 2_client_method(
e3d0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
e3e0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
e3f0: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 O_TLS1_3) && !de
e400: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e410: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 _TLS1_3). cas
e420: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
e430: 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 _3:../* Use the
e440: 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 generic method a
e450: 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 nd constraint ra
e460: 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 nge after contex
e470: 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a t is created */.
e480: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
e490: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f er ? TLS_server_
e4a0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 method() : TLS_c
e4b0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
e4c0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 .break;.#endif.
e4d0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 default:../*
e4e0: 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 Negotiate highes
e4f0: 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f t available SSL/
e500: 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 TLS version */..
e510: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
e520: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d r ? TLS_server_m
e530: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c ethod() : TLS_cl
e540: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 ient_method();.#
e550: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
e560: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
e570: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 100000L && !defi
e580: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 ned(NO_SSL2) &&
e590: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e5a0: 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c _NO_SSL2)..off |
e5b0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
e5c0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 , TLS_PROTO_SSL2
e5d0: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 ) ? 0 : SSL_OP
e5e0: 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 _NO_SSLv2);.#end
e5f0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
e600: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
e610: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
e620: 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 SSL3)..off |= (E
e630: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
e640: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 S_PROTO_SSL3)
e650: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
e660: 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 SSLv3);.#endif.#
e670: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
e680: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
e690: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
e6a0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
e6b0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
e6c0: 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 OTO_TLS1) ? 0
e6d0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
e6e0: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 1);.#endif.#if !
e6f0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
e700: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
e710: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
e720: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
e730: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
e740: 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 OTO_TLS1_1) ? 0
e750: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
e760: 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 1_1);.#endif.#if
e770: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
e780: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
e790: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
e7a0: 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 _2)..off |= (ENA
e7b0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
e7c0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 PROTO_TLS1_2) ?
e7d0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 0 : SSL_OP_NO_TL
e7e0: 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 Sv1_2);.#endif.#
e7f0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
e800: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
e810: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e820: 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 S1_3)..off |= (E
e830: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
e840: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 S_PROTO_TLS1_3)
e850: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
e860: 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 TLSv1_3);.#endif
e870: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a ..break;. }..
e880: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
e890: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 ror();.. ctx
e8a0: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 = SSL_CTX_new(me
e8b0: 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 thod);. if (!
e8c0: 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e ctx) {..return N
e8d0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
e8e0: 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 if (getenv(SSLKE
e8f0: 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 YLOGFILE)) {..SS
e900: 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 L_CTX_set_keylog
e910: 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b _callback(ctx, K
e920: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a eyLogCallback);.
e930: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 }..#if !defi
e940: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
e950: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
e960: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
e970: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 if (proto == T
e980: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
e990: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
e9a0: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f min_proto_versio
e9b0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
e9c0: 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 RSION);..SSL_CTX
e9d0: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 _set_max_proto_v
e9e0: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
e9f0: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 _3_VERSION);.
ea00: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f }.#endif.. /
ea10: 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 * Force cipher s
ea20: 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 election order b
ea30: 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 y server */.
ea40: 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b if (!isServer) {
ea50: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 ..SSL_CTX_set_op
ea60: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
ea70: 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f P_CIPHER_SERVER_
ea80: 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 PREFERENCE);.
ea90: 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f }..#if OPENSSL_
eaa0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
eab0: 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 0x10100000L.
eac0: 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c OpenSSL_add_all
ead0: 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f _algorithms(); /
eae0: 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 * Load ciphers a
eaf0: 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 nd digests */.#e
eb00: 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 ndif.. SSL_CT
eb10: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 X_set_app_data(c
eb20: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 tx, (void*)inter
eb30: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 p);./* remember
eb40: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
eb50: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
eb60: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
eb70: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 SSL_OP_ALL);./*
eb80: 45 6e 61 62 6c 65 20 61 6c 6c 20 53 53 4c 20 62 Enable all SSL b
eb90: 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a ug workarounds *
eba0: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 /. SSL_CTX_se
ebb0: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 t_options(ctx, S
ebc0: 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 SL_OP_NO_COMPRES
ebd0: 53 49 4f 4e 29 3b 09 2f 2a 20 44 69 73 61 62 6c SION);./* Disabl
ebe0: 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76 e compression ev
ebf0: 65 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 20 en if supported
ec00: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
ec10: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
ec20: 6f 66 66 29 3b 09 09 2f 2a 20 44 69 73 61 62 6c off);../* Disabl
ec30: 65 20 73 70 65 63 69 66 69 65 64 20 70 72 6f 74 e specified prot
ec40: 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f ocol versions */
ec50: 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 20 77 .. /* Allow w
ec60: 72 69 74 65 73 20 74 6f 20 72 65 70 6f 72 74 20 rites to report
ec70: 73 75 63 63 65 73 73 20 77 68 65 6e 20 6c 65 73 success when les
ec80: 73 20 74 68 61 6e 20 61 6c 6c 20 72 65 63 6f 72 s than all recor
ec90: 64 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 ds have been wri
eca0: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f tten */. SSL_
ecb0: 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 CTX_set_mode(ctx
ecc0: 2c 20 53 53 4c 5f 4d 4f 44 45 5f 45 4e 41 42 4c , SSL_MODE_ENABL
ecd0: 45 5f 50 41 52 54 49 41 4c 5f 57 52 49 54 45 29 E_PARTIAL_WRITE)
ece0: 3b 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 62 6c ;.. /* Disabl
ecf0: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 74 72 e attempts to tr
ed00: 79 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 y to process the
ed10: 20 6e 65 78 74 20 72 65 63 6f 72 64 20 69 6e 73 next record ins
ed20: 74 65 61 64 20 6f 66 20 72 65 74 75 72 6e 69 6e tead of returnin
ed30: 67 20 61 66 74 65 72 20 61 0a 20 20 20 20 20 20 g after a.
ed40: 20 6e 6f 6e 2d 61 70 70 20 72 65 63 6f 72 64 2e non-app record.
ed50: 20 41 76 6f 69 64 73 20 68 61 6e 67 73 20 69 6e Avoids hangs in
ed60: 20 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 blocking mode,
ed70: 77 68 65 6e 20 75 73 69 6e 67 20 53 53 4c 5f 72 when using SSL_r
ed80: 65 61 64 28 29 20 61 6e 64 20 61 0a 20 20 20 20 ead() and a.
ed90: 20 20 20 6e 6f 6e 2d 61 70 70 6c 69 63 61 74 69 non-applicati
eda0: 6f 6e 20 72 65 63 6f 72 64 20 77 61 73 20 73 65 on record was se
edb0: 6e 74 20 61 6e 64 20 6e 6f 20 61 70 70 6c 69 63 nt and no applic
edc0: 61 74 69 6f 6e 20 64 61 74 61 20 77 61 73 20 73 ation data was s
edd0: 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f ent. */. SSL_
ede0: 43 54 58 5f 63 6c 65 61 72 5f 6d 6f 64 65 28 63 CTX_clear_mode(c
edf0: 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 tx, SSL_MODE_AUT
ee00: 4f 5f 52 45 54 52 59 29 3b 0a 0a 20 20 20 20 53 O_RETRY);.. S
ee10: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f SL_CTX_sess_set_
ee20: 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 cache_size(ctx,
ee30: 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 128);.. /* Se
ee40: 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 t user defined c
ee50: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 iphers, cipher s
ee60: 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 uites, and secur
ee70: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 ity level */.
ee80: 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d if ((ciphers !=
ee90: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 NULL) && !SSL_C
eea0: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 TX_set_cipher_li
eeb0: 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 st(ctx, ciphers)
eec0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
eed0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
eee0: 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 et ciphers faile
eef0: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 d: No valid ciph
ef00: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ers", (char *) N
ef10: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
ef20: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
ef30: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 n NULL;. }.
ef40: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69 if ((ciphersui
ef50: 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 tes != NULL) &&
ef60: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 !SSL_CTX_set_cip
ef70: 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 hersuites(ctx, c
ef80: 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a iphersuites)) {.
ef90: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
efa0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 t(interp, "Set c
efb0: 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69 ipher suites fai
efc0: 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 led: No valid ci
efd0: 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 phers", (char *)
efe0: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
eff0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
f000: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
f010: 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 . /* Set secu
f020: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 rity level */.
f030: 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 if (level > -1
f040: 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b && level < 6) {
f050: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 ../* SSL_set_sec
f060: 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 urity_level */..
f070: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 SSL_CTX_set_secu
f080: 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 rity_level(ctx,
f090: 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 level);. }..
f0a0: 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 /* set some c
f0b0: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 allbacks */.
f0c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 SSL_CTX_set_defa
f0d0: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 ult_passwd_cb(ct
f0e0: 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 x, PasswordCallb
f0f0: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 ack);. SSL_CT
f100: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 X_set_default_pa
f110: 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 sswd_cb_userdata
f120: 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 (ctx, (void *)st
f130: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a atePtr);.. /*
f140: 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 read a Diffie-H
f150: 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 ellman parameter
f160: 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 s file, or use t
f170: 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 he built-in one
f180: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 */. Tcl_DStri
f190: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 23 69 66 ngInit(&ds);.#if
f1a0: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 def OPENSSL_NO_D
f1b0: 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 H. if (DHpara
f1c0: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 ms != NULL) {..T
f1d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
f1e0: 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 interp, "DH para
f1f0: 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f meter support no
f200: 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 t available", (c
f210: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 har *) NULL);..S
f220: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
f230: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
f240: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 }.#else.
f250: 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 {..DH* dh;..if (
f260: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c DHparams != NULL
f270: 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 ) {.. BIO *bi
f280: 6f 3b 0a 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 o;... bio = B
f290: 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 IO_new_file(F2N(
f2a0: 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 DHparams, &ds),
f2b0: 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 "r");.. if (!
f2c0: 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 bio) {...Tcl_DSt
f2d0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
f2e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
f2f0: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 t(interp, "Could
f300: 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 not find DH par
f310: 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 ameters file", (
f320: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
f330: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
f340: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c x);...return NUL
f350: 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 L;.. }...
f360: 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 dh = PEM_read_bi
f370: 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 o_DHparams(bio,
f380: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c NULL, NULL, NULL
f390: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 );.. BIO_free
f3a0: 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f (bio);.. Tcl_
f3b0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
f3c0: 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20 ;.. if (!dh)
f3d0: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {...Tcl_AppendRe
f3e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f sult(interp, "Co
f3f0: 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 uld not read DH
f400: 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 parameters from
f410: 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 file", (char *)
f420: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
f430: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
f440: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
f450: 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 }.. SSL_CTX_s
f460: 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 et_tmp_dh(ctx, d
f470: 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65 h);.. DH_free
f480: 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b (dh);...} else {
f490: 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c .. /* Use wel
f4a0: 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d l known DH param
f4b0: 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65 20 eters that have
f4c0: 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 built-in support
f4d0: 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 in OpenSSL */..
f4e0: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 if (!SSL_CTX
f4f0: 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 _set_dh_auto(ctx
f500: 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 , 1)) {...Tcl_Ap
f510: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f520: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e p, "Could not en
f530: 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f able set DH auto
f540: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
f550: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
f560: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
f570: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
f580: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
f590: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 }..}. }.#endi
f5a0: 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 f.. /* set ou
f5b0: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f r certificate */
f5c0: 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 . load_privat
f5d0: 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 e_key = 0;. i
f5e0: 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e f (certfile != N
f5f0: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 ULL) {..load_pri
f600: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 vate_key = 1;...
f610: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f if (SSL_CTX_use_
f620: 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 certificate_file
f630: 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 (ctx, F2N(certfi
f640: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 le, &ds), SSL_FI
f650: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 LETYPE_PEM) <= 0
f660: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 ) {.. Tcl_DSt
f670: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
f680: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
f690: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e sult(interp, "un
f6a0: 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 able to set cert
f6b0: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 ificate file ",
f6c0: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a certfile, ": ",.
f6d0: 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e ..GET_ERR_REASON
f6e0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
f6f0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
f700: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
f710: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d return NULL;..}
f720: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
f730: 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d 20 65 e(&ds);.. } e
f740: 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 lse if (cert !=
f750: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 NULL) {..load_pr
f760: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 ivate_key = 1;..
f770: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f if (SSL_CTX_use_
f780: 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 certificate_ASN1
f790: 28 63 74 78 2c 20 28 69 6e 74 29 20 63 65 72 74 (ctx, (int) cert
f7a0: 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 _len, cert) <= 0
f7b0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
f7c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
f7d0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 , "unable to set
f7e0: 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c certificate: ",
f7f0: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f ...GET_ERR_REASO
f800: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
f810: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
f820: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
f830: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 return NULL;..
f840: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 }. } else {..
f850: 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72 certfile = (char
f860: 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 *)X509_get_defau
f870: 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a lt_cert_file();.
f880: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 ..if (SSL_CTX_us
f890: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 e_certificate_fi
f8a0: 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65 le(ctx, certfile
f8b0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 , SSL_FILETYPE_P
f8c0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 EM) <= 0) {.#if
f8d0: 30 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 0.. Tcl_Appen
f8e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
f8f0: 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 "unable to use d
f900: 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 efault certifica
f910: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 te file ", certf
f920: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 ile, ": ",...GET
f930: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
f940: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
f950: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
f960: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 (ctx);.. retu
f970: 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a rn NULL;.#endif.
f980: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
f990: 20 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 set our private
f9a0: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 key */. if (
f9b0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 load_private_key
f9c0: 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 ) {..if (keyfile
f9d0: 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 == NULL && key
f9e0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 == NULL) {..
f9f0: 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 keyfile = certfi
fa00: 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 le;..}...if (key
fa10: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
fa20: 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 . /* get the
fa30: 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f private key asso
fa40: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 ciated with this
fa50: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a certificate */.
fa60: 09 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 . if (keyfile
fa70: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 == NULL) {...ke
fa80: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 yfile = certfile
fa90: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 ;.. }... i
faa0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 f (SSL_CTX_use_P
fab0: 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 rivateKey_file(c
fac0: 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c tx, F2N(keyfile,
fad0: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 &ds), SSL_FILET
fae0: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b YPE_PEM) <= 0) {
faf0: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ...Tcl_DStringFr
fb00: 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c ee(&ds);.../* fl
fb10: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 ush the passphra
fb20: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 se which might b
fb30: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 e left in the re
fb40: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 sult */...Tcl_Se
fb50: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
fb60: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 NULL, TCL_STATIC
fb70: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 );...Tcl_AppendR
fb80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
fb90: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 nable to set pub
fba0: 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 lic key file ",
fbb0: 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 keyfile, " ",...
fbc0: 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41 53 GET_ERR_REAS
fbd0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
fbe0: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
fbf0: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
fc00: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d urn NULL;.. }
fc10: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
fc20: 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 gFree(&ds);...}
fc30: 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20 else if (key !=
fc40: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 NULL) {.. if
fc50: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 (SSL_CTX_use_Pri
fc60: 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 vateKey_ASN1(EVP
fc70: 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 _PKEY_RSA, ctx,
fc80: 6b 65 79 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c key, (int) key_l
fc90: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a en) <= 0) {.../*
fca0: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 flush the passp
fcb0: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 hrase which migh
fcc0: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 t be left in the
fcd0: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c result */...Tcl
fce0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
fcf0: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 p, NULL, TCL_STA
fd00: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 TIC);...Tcl_Appe
fd10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
fd20: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
fd30: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 public key: ", G
fd40: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
fd50: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
fd60: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
fd70: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e ctx);...return N
fd80: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 ULL;.. }..}..
fd90: 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 /* Now we know t
fda0: 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 hat a key and ce
fdb0: 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 rt have been set
fdc0: 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 against.. * the
fdd0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
fde0: 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 .if (!SSL_CTX_ch
fdf0: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 eck_private_key(
fe00: 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c ctx)) {.. Tcl
fe10: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
fe20: 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b terp, "private k
fe30: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 ey does not matc
fe40: 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 h the certificat
fe50: 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 e public key",..
fe60: 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 .. (char *)
fe70: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
fe80: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
fe90: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
fea0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
feb0: 2a 20 53 65 74 20 74 6f 20 75 73 65 20 74 68 65 * Set to use the
fec0: 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f default locatio
fed0: 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 n and file for C
fee0: 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f ertificate Autho
fef0: 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69 66 rity (CA) certif
ff00: 69 63 61 74 65 73 2e 0a 20 20 20 20 20 2a 20 54 icates.. * T
ff10: 68 65 20 64 65 66 61 75 6c 74 20 43 41 20 63 65 he default CA ce
ff20: 72 74 69 66 69 63 61 74 65 73 20 64 69 72 65 63 rtificates direc
ff30: 74 6f 72 79 20 69 73 20 63 61 6c 6c 65 64 20 63 tory is called c
ff40: 65 72 74 73 20 69 6e 20 74 68 65 20 64 65 66 61 erts in the defa
ff50: 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 20 20 20 20 ult OpenSSL.
ff60: 20 2a 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74 * directory. It
ff70: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 41 contains the CA
ff80: 20 63 65 72 74 69 66 69 63 61 74 65 73 20 69 6e certificates in
ff90: 20 50 45 4d 20 66 6f 72 6d 61 74 2c 20 77 69 74 PEM format, wit
ffa0: 68 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74 h one certificat
ffb0: 65 20 70 65 72 0a 20 20 20 20 20 2a 20 66 69 6c e per. * fil
ffc0: 65 2e 20 54 68 65 20 76 65 72 69 66 79 20 70 61 e. The verify pa
ffd0: 74 68 20 61 6e 64 20 73 74 6f 72 65 20 63 61 6e th and store can
ffe0: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 be overridden b
fff0: 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 y the SSL_CERT_D
10000 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68 65 0a IR env var. The.
10010 20 20 20 20 20 2a 20 64 65 66 61 75 6c 74 20 43 * default C
10020 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20 66 A certificates f
10030 69 6c 65 20 69 73 20 63 61 6c 6c 65 64 20 63 65 ile is called ce
10040 72 74 2e 70 65 6d 20 69 6e 20 74 68 65 20 64 65 rt.pem in the de
10050 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c 20 64 69 fault OpenSSL di
10060 72 65 63 74 6f 72 79 2e 0a 20 20 20 20 20 2a 20 rectory.. *
10070 54 68 65 20 76 65 72 69 66 79 20 66 69 6c 65 20 The verify file
10080 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 can be overridde
10090 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 n by the SSL_CER
100a0 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 T_FILE env var.
100b0 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f */. if (!SSL_
100c0 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
100d0 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 verify_paths(ctx
100e0 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 )) {..abort++;.
100f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 }.. /* Ove
10100 72 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 43 rrides for the C
10110 41 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e A verify path an
10120 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a d file */. {.
10130 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
10140 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
10150 30 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41 0000000L..if (CA
10160 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 path != NULL ||
10170 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 CAfile != NULL)
10180 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 {.. Tcl_DStri
10190 6e 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63 6c ng ds1;.. Tcl
101a0 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 _DStringInit(&ds
101b0 31 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 53 1);... if (!S
101c0 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 SL_CTX_load_veri
101d0 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 fy_locations(ctx
101e0 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 , F2N(CAfile, &d
101f0 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 s), F2N(CApath,
10200 26 64 73 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 &ds1))) {...abor
10210 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 t++;.. }..
10220 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
10230 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f (&ds);.. Tcl_
10240 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 DStringFree(&ds1
10250 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 );... /* Set
10260 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 list of CAs to s
10270 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 end to client wh
10280 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 en requesting a
10290 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 client certifica
102a0 74 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 te */.. /* ht
102b0 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 tps://sourceforg
102c0 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 e.net/p/tls/bugs
102d0 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 /57/ */.. /*
102e0 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 XXX:TODO: Let th
102f0 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 e user supply va
10300 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 lues here instea
10310 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 d of something t
10320 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 hat exists on th
10330 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a e filesystem */.
10340 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 . STACK_OF(X5
10350 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 09_NAME) *certNa
10360 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 mes = SSL_load_c
10370 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 lient_CA_file(F2
10380 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b N(CAfile, &ds));
10390 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 .. if (certNa
103a0 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 mes != NULL) {..
103b0 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 .SSL_CTX_set_cli
103c0 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c ent_CA_list(ctx,
103d0 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 certNames);..
103e0 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
103f0 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
10400 7d 0a 0a 23 65 6c 73 65 0a 09 2f 2a 20 44 69 72 }..#else../* Dir
10410 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e ectory containin
10420 67 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65 g CA certificate
10430 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d 61 74 2e s in PEM format.
10440 20 2a 2f 0a 09 69 66 20 28 43 41 70 61 74 68 20 */..if (CApath
10450 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
10460 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 if (!SSL_CTX_loa
10470 64 5f 76 65 72 69 66 79 5f 64 69 72 28 63 74 78 d_verify_dir(ctx
10480 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 , F2N(CApath, &d
10490 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b s))) {...abort++
104a0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 ;.. }.. Tc
104b0 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
104c0 73 29 3b 0a 09 7d 0a 09 0a 09 2f 2a 20 55 52 49 s);..}..../* URI
104d0 20 66 6f 72 20 74 6f 20 61 20 73 74 6f 72 65 2c for to a store,
104e0 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 61 20 which may be a
104f0 73 69 6e 67 6c 65 20 63 6f 6e 74 61 69 6e 65 72 single container
10500 20 6f 72 20 61 20 63 61 74 61 6c 6f 67 20 6f 66 or a catalog of
10510 20 63 6f 6e 74 61 69 6e 65 72 73 2e 20 2a 2f 0a containers. */.
10520 09 69 66 20 28 43 41 73 74 6f 72 65 20 21 3d 20 .if (CAstore !=
10530 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 NULL) {.. if
10540 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 (!SSL_CTX_load_v
10550 65 72 69 66 79 5f 73 74 6f 72 65 28 63 74 78 2c erify_store(ctx,
10560 20 46 32 4e 28 43 41 73 74 6f 72 65 2c 20 26 64 F2N(CAstore, &d
10570 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b s))) {...abort++
10580 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 ;.. }.. Tc
10590 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
105a0 73 29 3b 0a 09 7d 0a 09 0a 09 2f 2a 20 46 69 6c s);..}..../* Fil
105b0 65 20 6f 66 20 43 41 20 63 65 72 74 69 66 69 63 e of CA certific
105c0 61 74 65 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d ates in PEM form
105d0 61 74 2e 20 20 2a 2f 0a 09 69 66 20 28 43 41 66 at. */..if (CAf
105e0 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ile != NULL) {..
105f0 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 if (!SSL_CTX
10600 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 69 6c _load_verify_fil
10610 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c e(ctx, F2N(CAfil
10620 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 e, &ds))) {...ab
10630 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 ort++;.. }..
10640 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
10650 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 20 2f ee(&ds);... /
10660 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41 * Set list of CA
10670 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 s to send to cli
10680 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74 ent when request
10690 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72 ing a client cer
106a0 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 tificate */..
106b0 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e STACK_OF(X509_N
106c0 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 AME) *certNames
106d0 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e = SSL_load_clien
106e0 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 t_CA_file(F2N(CA
106f0 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 file, &ds));..
10700 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 if (certNames
10710 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c != NULL) {...SSL
10720 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
10730 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 CA_list(ctx, cer
10740 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a tNames);.. }.
10750 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
10760 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65 Free(&ds);..}.#e
10770 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ndif. }..
10780 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a return ctx;.}...
10790 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
107a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
107b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
107c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
107d0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 --------. *. * S
107e0 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 tatusObjCmd -- r
107f0 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 eturn certificat
10800 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 e for connected
10810 70 65 65 72 20 69 6e 66 6f 2e 0a 20 2a 0a 20 2a peer info.. *. *
10820 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
10830 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
10840 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
10850 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
10860 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
10870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
108a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
108b0 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f atic int.StatusO
108c0 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
108d0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
108e0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
108f0 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
10900 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
10910 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
10920 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 tatePtr;. X50
10930 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 9 *peer;. Tcl
10940 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 _Obj *objPtr;.
10950 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
10960 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 an;. char *ch
10970 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 annelName, *ciph
10980 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 ers;. int mod
10990 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
109a0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 igned char *prot
109b0 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 o;. unsigned
109c0 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 int len;. int
109d0 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20 20 28 nid, res;. (
109e0 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
109f0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
10a00 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
10a10 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f f (objc < 2 || o
10a20 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 bjc > 3 || (objc
10a30 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70 == 3 && !strcmp
10a40 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f (Tcl_GetString(o
10a50 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c bjv[1]), "-local
10a60 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e "))) {..Tcl_Wron
10a70 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
10a80 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 1, objv, "?-loc
10a90 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 al? channel");..
10aa0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
10ab0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
10ac0 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a Get channel Id *
10ad0 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d /. channelNam
10ae0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e e = Tcl_GetStrin
10af0 67 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 g(objv[(objc ==
10b00 32 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 2 ? 1 : 2)]);.
10b10 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
10b20 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
10b30 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f channelName, &mo
10b40 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 de);. if (cha
10b50 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
10b60 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
10b70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
10b80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
10b90 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
10ba0 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
10bb0 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
10bc0 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
10bd0 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 Channel(chan);.
10be0 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
10bf0 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
10c00 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
10c10 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
10c20 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
10c30 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
10c40 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
10c50 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 elName(chan),...
10c60 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
10c70 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a hannel", (char *
10c80 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 ) NULL);..Tcl_Se
10c90 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
10ca0 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 p, "TLS", "STATU
10cb0 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 S", "CHANNEL", "
10cc0 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
10cd0 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
10ce0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
10cf0 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 }. statePtr
10d00 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f = (State *) Tcl_
10d10 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
10d20 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 ceData(chan);..
10d30 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66 /* Get certif
10d40 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f icate for peer o
10d50 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 r self */. if
10d60 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
10d70 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 peer = SSL_get_p
10d80 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 eer_certificate(
10d90 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
10da0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 } else {..pe
10db0 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 er = SSL_get_cer
10dc0 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 tificate(statePt
10dd0 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 r->ssl);. }.
10de0 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63 /* Get X509 c
10df0 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20 ertificate info
10e00 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 */. if (peer)
10e10 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 {..objPtr = Tls
10e20 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 _NewX509Obj(inte
10e30 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28 rp, peer);..if (
10e40 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 objc == 2) {..
10e50 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 72 X509_free(peer
10e60 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e );.. peer = N
10e70 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c ULL;..}. } el
10e80 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 se {..objPtr = T
10e90 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
10ea0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 NULL);. }..
10eb0 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 /* Peer name
10ec0 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 */. LAPPEND_S
10ed0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10ee0 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 r, "peername", S
10ef0 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 SL_get0_peername
10f00 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c (statePtr->ssl),
10f10 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e -1);. LAPPEN
10f20 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
10f30 6a 50 74 72 2c 20 22 73 62 69 74 73 22 2c 20 53 jPtr, "sbits", S
10f40 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69 SL_get_cipher_bi
10f50 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ts(statePtr->ssl
10f60 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 , NULL));.. c
10f70 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 iphers = (char*)
10f80 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 SSL_get_cipher(s
10f90 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
10fa0 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
10fb0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10fc0 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 cipher", ciphers
10fd0 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 , -1);.. /* V
10fe0 65 72 69 66 79 20 74 68 65 20 58 35 30 39 20 63 erify the X509 c
10ff0 65 72 74 69 66 69 63 61 74 65 20 70 72 65 73 65 ertificate prese
11000 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 65 72 nted by the peer
11010 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f */. LAPPEND_
11020 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11030 74 72 2c 20 22 76 65 72 69 66 79 52 65 73 75 6c tr, "verifyResul
11040 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 79 t",..X509_verify
11050 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 _cert_error_stri
11060 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 ng(SSL_get_verif
11070 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 y_result(statePt
11080 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a r->ssl)), -1);..
11090 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f /* Verify mo
110a0 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d de */. mode =
110b0 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f SSL_get_verify_
110c0 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73 mode(statePtr->s
110d0 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 sl);. if (mod
110e0 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f e && SSL_VERIFY_
110f0 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 NONE) {..LAPPEND
11100 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11110 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 Ptr, "verifyMode
11120 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a ", "none", -1);.
11130 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
11140 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 l_Obj *listObjPt
11150 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
11160 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 bj(0, NULL);..if
11170 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 (mode && SSL_VE
11180 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 RIFY_PEER) {..
11190 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
111a0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
111b0 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 p, listObjPtr, T
111c0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
111d0 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d "peer", -1));..}
111e0 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 ..if (mode && SS
111f0 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 L_VERIFY_FAIL_IF
11200 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b _NO_PEER_CERT) {
11210 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
11220 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
11230 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 nterp, listObjPt
11240 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
11250 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 Obj("fail if no
11260 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29 peer cert", -1))
11270 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 ;..}..if (mode &
11280 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 & SSL_VERIFY_CLI
11290 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 ENT_ONCE) {..
112a0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
112b0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
112c0 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 , listObjPtr, Tc
112d0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
112e0 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 client once", -1
112f0 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 ));..}..if (mode
11300 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 && SSL_VERIFY_P
11310 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b OST_HANDSHAKE) {
11320 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
11330 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
11340 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 nterp, listObjPt
11350 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
11360 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68 Obj("post handsh
11370 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 ake", -1));..}..
11380 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 LAPPEND_OBJ(inte
11390 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 rp, objPtr, "ver
113a0 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 ifyMode", listOb
113b0 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 jPtr). }..
113c0 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 /* Verify mode
113d0 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 depth */. LAP
113e0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
113f0 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 objPtr, "verify
11400 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f Depth", SSL_get_
11410 76 65 72 69 66 79 5f 64 65 70 74 68 28 73 74 61 verify_depth(sta
11420 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 tePtr->ssl));..
11430 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 /* Report the
11440 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 selected protoc
11450 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f ol as a result o
11460 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f f the negotiatio
11470 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 n */. SSL_get
11480 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 0_alpn_selected(
11490 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
114a0 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 proto, &len);.
114b0 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
114c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 terp, objPtr, "a
114d0 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72 lpn", (char *)pr
114e0 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 oto, (Tcl_Size)
114f0 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e len);. LAPPEN
11500 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11510 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 jPtr, "protocol"
11520 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f , SSL_get_versio
11530 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 n(statePtr->ssl)
11540 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 , -1);.. /* V
11550 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 alid for non-RSA
11560 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54 signature and T
11570 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 LS 1.3 */. if
11580 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
11590 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 res = SSL_get_pe
115a0 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 er_signature_nid
115b0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
115c0 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 &nid);. } els
115d0 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 e {..res = SSL_g
115e0 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 et_signature_nid
115f0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
11600 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 &nid);. }.
11610 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 if (!res) {nid
11620 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e = 0;}. LAPPEN
11630 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11640 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 jPtr, "signature
11650 48 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 HashAlgorithm",
11660 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c OBJ_nid2ln(nid),
11670 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 -1);.. /* Ad
11680 64 65 64 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 ded in OpenSSL 1
11690 2e 31 2e 31 61 20 2a 2f 0a 23 69 66 20 4f 50 45 .1.1a */.#if OPE
116a0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
116b0 42 45 52 20 3e 20 30 78 31 30 31 30 31 30 30 30 BER > 0x10101000
116c0 4c 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d L. if (objc =
116d0 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 = 2) {..res = SS
116e0 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 L_get_peer_signa
116f0 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 ture_type_nid(st
11700 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
11710 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b d);. } else {
11720 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f ..res = SSL_get_
11730 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e signature_type_n
11740 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c id(statePtr->ssl
11750 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 , &nid);. }.
11760 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 if (!res) {ni
11770 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 d = 0;}. LAPP
11780 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11790 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 objPtr, "signatu
117a0 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 reType", OBJ_nid
117b0 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 23 2ln(nid), -1);.#
117c0 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 endif.. Tcl_S
117d0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
117e0 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
117f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
11800 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
11810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
11850 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 * ConnectionInf
11860 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 oObjCmd -- retur
11870 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 n connection inf
11880 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a o from OpenSSL..
11890 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
118a0 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e *.A list of conn
118b0 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a ection info. *.
118c0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
118d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
118e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
118f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11900 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
11910 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e c int Connection
11920 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e InfoObjCmd(Clien
11930 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
11940 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
11950 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
11960 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
11970 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
11980 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 _Channel chan;..
11990 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 /* The channel t
119a0 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 o set a mode on
119b0 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 */. State *st
119c0 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 atePtr;../* clie
119d0 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c nt state for ssl
119e0 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 socket */. T
119f0 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 cl_Obj *objPtr,
11a00 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f *listPtr;. co
11a10 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 nst SSL *ssl;.
11a20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 const SSL_CIPH
11a30 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 ER *cipher;.
11a40 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f const SSL_SESSIO
11a50 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 N *session;.
11a60 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 const EVP_MD *md
11a70 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 ;. (void) cli
11a80 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 entData;.. if
11a90 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
11aa0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
11ab0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
11ac0 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
11ad0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
11ae0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e . }.. chan
11af0 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
11b00 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
11b10 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 tString(objv[1])
11b20 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 , NULL);. if
11b30 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
11b40 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
11b50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
11b60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
11b70 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
11b80 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
11b90 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
11ba0 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
11bb0 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
11bc0 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 );. if (Tcl_G
11bd0 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
11be0 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
11bf0 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
11c00 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
11c10 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
11c20 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
11c30 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
11c40 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 ,.. "\": not
11c50 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 a TLS channel",
11c60 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
11c70 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
11c80 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
11c90 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 "CONNECTION", "
11ca0 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c CHANNEL", "INVAL
11cb0 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ID", (char *) NU
11cc0 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
11cd0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
11ce0 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
11cf0 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
11d00 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e LL);.. /* Con
11d10 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a nection info */.
11d20 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
11d30 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
11d40 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
11d50 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 ta(chan);. ss
11d60 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 l = statePtr->ss
11d70 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 l;. if (ssl !
11d80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 = NULL) {..const
11d90 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
11da0 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 proto;..unsigned
11db0 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 09 2f 2a 20 int ulen;.../*
11dc0 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 Initialization f
11dd0 69 6e 69 73 68 65 64 20 2a 2f 0a 09 4c 41 50 50 inished */..LAPP
11de0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
11df0 20 6f 62 6a 50 74 72 2c 20 22 69 6e 69 74 5f 66 objPtr, "init_f
11e00 69 6e 69 73 68 65 64 22 2c 20 53 53 4c 5f 69 73 inished", SSL_is
11e10 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 _init_finished(s
11e20 73 6c 29 29 3b 0a 09 0a 09 2f 2a 20 63 6f 6e 6e sl));..../* conn
11e30 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a ection state */.
11e40 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
11e50 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 erp, objPtr, "st
11e60 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f ate", SSL_state_
11e70 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 string_long(ssl)
11e80 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 , -1);.../* Get
11e90 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65 SNI requested se
11ea0 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 rver name */..LA
11eb0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11ec0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 , objPtr, "serve
11ed0 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f rname", SSL_get_
11ee0 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 servername(ssl,
11ef0 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f TLSEXT_NAMETYPE_
11f00 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b host_name), -1);
11f10 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 .../* Report the
11f20 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 selected protoc
11f30 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f ol as a result o
11f40 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f f the negotiatio
11f50 6e 20 2a 2f 0a 09 53 53 4c 5f 67 65 74 30 5f 61 n */..SSL_get0_a
11f60 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 lpn_selected(sta
11f70 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f tePtr->ssl, &pro
11f80 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 to, &ulen);..LAP
11f90 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11fa0 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c objPtr, "alpn",
11fb0 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 (char *)proto,
11fc0 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 (Tcl_Size) ulen)
11fd0 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f ;.../* Get proto
11fe0 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f col */..LAPPEND_
11ff0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12000 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 tr, "protocol",
12010 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 SSL_get_version(
12020 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 ssl), -1);.../*
12030 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c Renegotiation al
12040 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e lowed */..LAPPEN
12050 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
12060 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 bjPtr, "renegoti
12070 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 ation_allowed",
12080 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 SSL_get_secure_r
12090 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 enegotiation_sup
120a0 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c port((SSL *) ssl
120b0 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 ));.../* Get sec
120c0 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 urity level */..
120d0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
120e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 rp, objPtr, "sec
120f0 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 urity_level", SS
12100 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c L_get_security_l
12110 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a evel(ssl));.../*
12120 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f Session info */
12130 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
12140 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12150 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c session_reused",
12160 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 SSL_session_reu
12170 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 sed(ssl));.../*
12180 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a Is server info *
12190 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
121a0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
121b0 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c "is_server", SSL
121c0 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 _is_server(ssl))
121d0 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a ;.../* Is DTLS *
121e0 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
121f0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12200 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 "is_dtls", SSL_i
12210 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 0a 23 s_dtls(ssl));..#
12220 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
12230 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33 ON_NUMBER >= 0x3
12240 30 32 30 30 30 30 30 4c 0a 09 2f 2a 20 49 73 20 0200000L../* Is
12250 51 55 49 43 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 QUIC */..LAPPEND
12260 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
12270 6a 50 74 72 2c 20 22 69 73 5f 71 75 69 63 22 2c jPtr, "is_quic",
12280 20 53 53 4c 5f 69 73 5f 71 75 69 63 28 73 73 6c SSL_is_quic(ssl
12290 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 54 4c 53 20 ));.../* Is TLS
122a0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
122b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
122c0 20 22 69 73 5f 74 6c 73 22 2c 20 53 53 4c 5f 69 "is_tls", SSL_i
122d0 73 5f 74 6c 73 28 73 73 6c 29 29 3b 0a 23 65 6e s_tls(ssl));.#en
122e0 64 69 66 0a 0a 09 2f 2a 20 44 41 4e 45 20 54 4c dif.../* DANE TL
122f0 53 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e S authentication
12300 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f */..LAPPEND_BOO
12310 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 L(interp, objPtr
12320 2c 20 22 64 61 6e 65 5f 61 75 74 68 22 2c 20 53 , "dane_auth", S
12330 53 4c 5f 67 65 74 30 5f 64 61 6e 65 28 73 73 6c SL_get0_dane(ssl
12340 29 20 21 3d 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a ) != NULL);.../*
12350 20 57 61 69 74 69 6e 67 20 66 6f 72 20 61 73 79 Waiting for asy
12360 6e 63 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 nc */..LAPPEND_B
12370 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
12380 74 72 2c 20 22 77 61 69 74 69 6e 67 5f 66 6f 72 tr, "waiting_for
12390 5f 61 73 79 6e 63 22 2c 20 53 53 4c 5f 77 61 69 _async", SSL_wai
123a0 74 69 6e 67 5f 66 6f 72 5f 61 73 79 6e 63 28 73 ting_for_async(s
123b0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 2d sl));.../* Time-
123c0 6f 75 74 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f out */..LAPPEND_
123d0 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a LONG(interp, obj
123e0 50 74 72 2c 20 22 74 69 6d 65 2d 6f 75 74 22 2c Ptr, "time-out",
123f0 20 53 53 4c 5f 67 65 74 5f 64 65 66 61 75 6c 74 SSL_get_default
12400 5f 74 69 6d 65 6f 75 74 28 73 73 6c 29 29 3b 0a _timeout(ssl));.
12410 0a 09 2f 2a 20 49 73 20 43 65 72 74 69 66 69 63 ../* Is Certific
12420 61 74 65 20 54 72 61 6e 73 70 61 72 65 6e 63 79 ate Transparency
12430 20 76 61 6c 69 64 61 74 69 6f 6e 20 65 6e 61 62 validation enab
12440 6c 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f led */..LAPPEND_
12450 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
12460 50 74 72 2c 20 22 63 74 5f 65 6e 61 62 6c 65 64 Ptr, "ct_enabled
12470 22 2c 20 53 53 4c 5f 63 74 5f 69 73 5f 65 6e 61 ", SSL_ct_is_ena
12480 62 6c 65 64 28 73 73 6c 29 29 3b 0a 20 20 20 20 bled(ssl));.
12490 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72 }.. /* Cipher
124a0 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 info */. cip
124b0 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 her = SSL_get_cu
124c0 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c rrent_cipher(ssl
124d0 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 );. if (ciphe
124e0 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 r != NULL) {..ch
124f0 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d ar buf[BUFSIZ] =
12500 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c {0};..int bits,
12510 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 alg_bits;.../*
12520 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 Cipher name */..
12530 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12540 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
12550 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 her", SSL_CIPHER
12560 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 _get_name(cipher
12570 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 ), -1);.../* RFC
12580 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 name of cipher
12590 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
125a0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
125b0 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c "standard_name",
125c0 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e SSL_CIPHER_stan
125d0 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 dard_name(cipher
125e0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 ), -1);.../* Ope
125f0 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 nSSL name of cip
12600 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
12610 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12620 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d tr, "openssl_nam
12630 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 e", OPENSSL_ciph
12640 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 er_name(SSL_CIPH
12650 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 ER_standard_name
12660 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
12670 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 ../* number of s
12680 65 63 72 65 74 20 62 69 74 73 20 75 73 65 64 20 ecret bits used
12690 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 for cipher */..b
126a0 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 its = SSL_CIPHER
126b0 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 _get_bits(cipher
126c0 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c , &alg_bits);..L
126d0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
126e0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 p, objPtr, "secr
126f0 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b et_bits", bits);
12700 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
12710 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 terp, objPtr, "a
12720 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 lgorithm_bits",
12730 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 alg_bits);../* a
12740 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 lg_bits is actua
12750 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 l key secret bit
12760 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 61 s. If use bits a
12770 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 nd secret (algor
12780 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 ithm) bits diffe
12790 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 r,.. the rest
127a0 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20 of the bits are
127b0 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 fixed, i.e. for
127c0 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 limited export c
127d0 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 iphers (bits < 5
127e0 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 6) */.../* Indic
127f0 61 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54 ates which SSL/T
12800 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 LS protocol vers
12810 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65 ion first define
12820 64 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a d the cipher */.
12830 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
12840 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 erp, objPtr, "mi
12850 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f n_version", SSL_
12860 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 CIPHER_get_versi
12870 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b on(cipher), -1);
12880 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 .../* Cipher NID
12890 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
128a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
128b0 20 22 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63 "cipherNID", (c
128c0 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e har *)OBJ_nid2ln
128d0 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f (SSL_CIPHER_get_
128e0 63 69 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65 cipher_nid(ciphe
128f0 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 r)), -1);..LAPPE
12900 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
12910 62 6a 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49 bjPtr, "digestNI
12920 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f D", (char *)OBJ_
12930 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 nid2ln(SSL_CIPHE
12940 52 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 R_get_digest_nid
12950 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
12960 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
12970 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 erp, objPtr, "ke
12980 79 45 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 yExchangeNID", (
12990 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c char *)OBJ_nid2l
129a0 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 n(SSL_CIPHER_get
129b0 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29 _kx_nid(cipher))
129c0 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f , -1);..LAPPEND_
129d0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
129e0 74 72 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74 tr, "authenticat
129f0 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a ionNID", (char *
12a00 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f )OBJ_nid2ln(SSL_
12a10 43 49 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f CIPHER_get_auth_
12a20 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
12a30 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 );.../* message
12a40 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 authentication c
12a50 6f 64 65 20 2d 20 43 69 70 68 65 72 20 69 73 20 ode - Cipher is
12a60 41 45 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f AEAD (e.g. GCM o
12a70 72 20 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 r ChaCha20/Poly1
12a80 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 305) or not */..
12a90 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 74 65 64 /* Authenticated
12aa0 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68 Encryption with
12ab0 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 associated data
12ac0 20 28 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f (AEAD) check */
12ad0 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
12ae0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12af0 63 69 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c cipher_is_aead",
12b00 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 SSL_CIPHER_is_a
12b10 65 61 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 ead(cipher));...
12b20 2f 2a 20 44 69 67 65 73 74 20 75 73 65 64 20 64 /* Digest used d
12b30 75 72 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c uring the SSL/TL
12b40 53 20 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e S handshake when
12b50 20 75 73 69 6e 67 20 74 68 65 20 63 69 70 68 65 using the ciphe
12b60 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f r. */..md = SSL_
12b70 43 49 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 CIPHER_get_hands
12b80 68 61 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68 hake_digest(ciph
12b90 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 er);..LAPPEND_ST
12ba0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
12bb0 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 , "handshake_dig
12bc0 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56 est", (char *)EV
12bd0 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d P_MD_name(md), -
12be0 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 1);.../* Get Ope
12bf0 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 nSSL-specific ID
12c00 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f , not IANA ID */
12c10 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
12c20 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
12c30 69 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 ipher_id", (int)
12c40 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
12c50 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f id(cipher));.../
12c60 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73 * Two-byte ID us
12c70 65 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72 ed in the TLS pr
12c80 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 otocol of the gi
12c90 76 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c ven cipher */..L
12ca0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
12cb0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 p, objPtr, "prot
12cc0 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 ocol_id", (int)
12cd0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 SSL_CIPHER_get_p
12ce0 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 rotocol_id(ciphe
12cf0 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 r));.../* Textua
12d00 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 l description of
12d10 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 the cipher */..
12d20 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 if (SSL_CIPHER_d
12d30 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 escription(ciphe
12d40 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 r, buf, sizeof(b
12d50 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a uf)) != NULL) {.
12d60 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
12d70 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12d80 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 "description",
12d90 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 buf, -1);..}.
12da0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 }.. /* Sessi
12db0 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 on info */. s
12dc0 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 ession = SSL_get
12dd0 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 _session(ssl);.
12de0 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21 if (session !
12df0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 = NULL) {..const
12e00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
12e10 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 ticket;..size_t
12e20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 len2;..unsigned
12e30 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 int ulen;..const
12e40 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
12e50 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f session_id, *pro
12e60 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 to;..unsigned ch
12e70 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 ar buffer[SSL_MA
12e80 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e X_MASTER_KEY_LEN
12e90 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 GTH];.../* Repor
12ea0 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 t the selected p
12eb0 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 rotocol as a res
12ec0 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 ult of the ALPN
12ed0 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 negotiation */..
12ee0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
12ef0 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 _alpn_selected(s
12f00 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 ession, &proto,
12f10 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 &len2);..LAPPEND
12f20 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12f30 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 Ptr, "alpn", (ch
12f40 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 ar *) proto, (Tc
12f50 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a l_Size) len2);..
12f60 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 ./* Report the s
12f70 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
12f80 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 as a result of
12f90 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 the NPN negotiat
12fa0 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 ion */.#ifdef US
12fb0 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f E_NPN..SSL_get0_
12fc0 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 next_proto_negot
12fd0 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 iated(ssl, &prot
12fe0 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 o, &ulen);..LAPP
12ff0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
13000 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 objPtr, "npn", (
13010 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 char *) proto, (
13020 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b Tcl_Size) ulen);
13030 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 .#endif.../* Res
13040 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a umable session *
13050 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
13060 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
13070 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c "resumable", SSL
13080 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 _SESSION_is_resu
13090 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b mable(session));
130a0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 .../* Session st
130b0 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 art time (second
130c0 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a s since epoch) *
130d0 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 /..LAPPEND_LONG(
130e0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
130f0 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 "start_time", SS
13100 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
13110 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 me(session));...
13120 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 /* Timeout value
13130 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 - SSL_CTX_get_t
13140 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e imeout (in secon
13150 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ds) */..LAPPEND_
13160 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a LONG(interp, obj
13170 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 Ptr, "timeout",
13180 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
13190 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 timeout(session)
131a0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
131b0 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 id - TLSv1.2 and
131c0 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 below only */..
131d0 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c session_id = SSL
131e0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 _SESSION_get_id(
131f0 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b session, &ulen);
13200 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
13210 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
13220 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 "session_id", s
13230 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f ession_id, (Tcl_
13240 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f Size) ulen);.../
13250 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 * Session contex
13260 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 t */..session_id
13270 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
13280 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 et0_id_context(s
13290 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a ession, &ulen);.
132a0 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
132b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
132c0 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 "session_context
132d0 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 ", session_id, (
132e0 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b Tcl_Size) ulen);
132f0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 .../* Session ti
13300 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e cket - client on
13310 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 ly */..SSL_SESSI
13320 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 ON_get0_ticket(s
13330 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c ession, &ticket,
13340 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e &len2);..LAPPEN
13350 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c D_BARRAY(interp,
13360 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
13370 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 n_ticket", ticke
13380 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 t, (Tcl_Size) le
13390 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f n2);.../* Sessio
133a0 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d n ticket lifetim
133b0 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e e hint (in secon
133c0 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ds) */..LAPPEND_
133d0 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a LONG(interp, obj
133e0 50 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c Ptr, "lifetime",
133f0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
13400 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 _ticket_lifetime
13410 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b _hint(session));
13420 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 .../* Ticket app
13430 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 4f 50 45 data */.#if OPE
13440 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
13450 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
13460 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 L..SSL_SESSION_g
13470 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 et0_ticket_appda
13480 74 61 28 28 53 53 4c 5f 53 45 53 53 49 4f 4e 20 ta((SSL_SESSION
13490 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 *) session, &tic
134a0 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 ket, &len2);..LA
134b0 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 PPEND_BARRAY(int
134c0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 erp, objPtr, "ti
134d0 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 cket_app_data",
134e0 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a ticket, (Tcl_Siz
134f0 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 66 e) len2);.#endif
13500 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 .../* Get master
13510 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 key */..len2 =
13520 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
13530 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 master_key(sessi
13540 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f on, buffer, SSL_
13550 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c MAX_MASTER_KEY_L
13560 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 ENGTH);..LAPPEND
13570 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
13580 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f objPtr, "master_
13590 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20 28 54 key", buffer, (T
135a0 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a cl_Size) len2);.
135b0 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e ../* Compression
135c0 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 id */..unsigned
135d0 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 int id = SSL_SE
135e0 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 SSION_get_compre
135f0 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a ss_id(session);.
13600 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
13610 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f erp, objPtr, "co
13620 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 mpression_id", i
13630 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 d == 1 ? "zlib"
13640 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 : "none", -1);.
13650 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d }.. /* Com
13660 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f pression info */
13670 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 . if (ssl !=
13680 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 NULL) {.#ifdef H
13690 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 AVE_SSL_COMPRESS
136a0 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f ION..const COMP_
136b0 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 METHOD *comp, *e
136c0 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c xpn;..comp = SSL
136d0 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d _get_current_com
136e0 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 pression(ssl);..
136f0 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 expn = SSL_get_c
13700 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e urrent_expansion
13710 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 (ssl);...LAPPEND
13720 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
13730 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f Ptr, "compressio
13740 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 n", comp ? SSL_C
13750 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d OMP_get_name(com
13760 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 p) : "none", -1)
13770 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
13780 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
13790 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e expansion", expn
137a0 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f ? SSL_COMP_get_
137b0 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f name(expn) : "no
137c0 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a ne", -1);.#else.
137d0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
137e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f erp, objPtr, "co
137f0 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e mpression", "non
13800 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e e", -1);..LAPPEN
13810 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
13820 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e jPtr, "expansion
13830 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a ", "none", -1);.
13840 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
13850 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f /* Server info
13860 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 */. {..long
13870 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 mode = SSL_CTX_g
13880 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 et_session_cache
13890 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e _mode(statePtr->
138a0 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 ctx);..char *msg
138b0 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53 ;...if (mode & S
138c0 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 SL_SESS_CACHE_OF
138d0 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 F) {.. msg =
138e0 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 "off";..} else i
138f0 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 f (mode & SSL_SE
13900 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 SS_CACHE_CLIENT)
13910 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63 {.. msg = "c
13920 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 lient";..} else
13930 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 if (mode & SSL_S
13940 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 ESS_CACHE_SERVER
13950 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 ) {.. msg = "
13960 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 server";..} else
13970 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f if (mode & SSL_
13980 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 SESS_CACHE_BOTH)
13990 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62 {.. msg = "b
139a0 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a oth";..} else {.
139b0 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e . msg = "unkn
139c0 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e own";..}..LAPPEN
139d0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
139e0 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 jPtr, "session_c
139f0 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c ache_mode", msg,
13a00 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 -1);. }..
13a10 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 /* CA List */.
13a20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 /* IF not a s
13a30 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53 erver, same as S
13a40 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f SL_get0_peer_CA_
13a50 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65 72 20 list. If server
13a60 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f same as SSL_CTX_
13a70 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 get_client_CA_li
13a80 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 st */. listPt
13a90 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
13aa0 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 bj(0, NULL);.
13ab0 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e STACK_OF(X509_N
13ac0 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 AME) *ca_list;.
13ad0 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20 if ((ca_list
13ae0 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 = SSL_get_client
13af0 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 _CA_list(ssl)) !
13b00 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 = NULL) {..char
13b10 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a buffer[BUFSIZ];.
13b20 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b .for (int i = 0;
13b30 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d i < sk_X509_NAM
13b40 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 E_num(ca_list);
13b50 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 i++) {.. X509
13b60 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b _NAME *name = sk
13b70 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 _X509_NAME_value
13b80 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 (ca_list, i);..
13b90 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 if (name) {..
13ba0 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 .X509_NAME_oneli
13bb0 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c ne(name, buffer,
13bc0 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f BUFSIZ);...Tcl_
13bd0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
13be0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
13bf0 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tPtr, Tcl_NewStr
13c00 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d ingObj(buffer, -
13c10 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 1));.. }..}.
13c20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 }. LAPPEND
13c30 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a _OBJ(interp, obj
13c40 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c Ptr, "caList", l
13c50 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 istPtr);. LAP
13c60 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
13c70 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 objPtr, "caList
13c80 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f Count", sk_X509_
13c90 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 NAME_num(ca_list
13ca0 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 ));.. Tcl_Set
13cb0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
13cc0 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 , objPtr);. r
13cd0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
13ce0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
13cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
13d30 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d VersionObjCmd -
13d40 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e - return version
13d50 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 string from Ope
13d60 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 nSSL.. *. * Resu
13d70 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
13d80 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
13d90 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
13da0 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
13db0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
13dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13df0 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
13e00 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d int.VersionObjCm
13e10 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
13e20 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
13e30 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
13e40 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
13e50 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
13e60 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
13e70 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 Ptr;. (void)
13e80 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 clientData;.
13e90 28 76 6f 69 64 29 20 6f 62 6a 63 3b 0a 20 20 20 (void) objc;.
13ea0 20 28 76 6f 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 (void) objv;..
13eb0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
13ec0 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 ed");.. objPt
13ed0 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e r = Tcl_NewStrin
13ee0 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 gObj(OPENSSL_VER
13ef0 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a SION_TEXT, -1);.
13f00 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
13f10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
13f20 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 Ptr);.. retur
13f30 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
13f40 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
13f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f80 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 ------. *. * Mis
13f90 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 cObjCmd -- misc
13fa0 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 commands. *. * R
13fb0 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
13fc0 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
13fd0 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
13fe0 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
13ff0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
14000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14030 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
14040 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d ic int.MiscObjCm
14050 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
14060 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
14070 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
14080 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
14090 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
140a0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 static const
140b0 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 char *commands
140c0 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 [] = { "req", "s
140d0 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a trreq", NULL };.
140e0 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 enum command
140f0 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 { C_REQ, C_STRR
14100 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 EQ, C_DUMMY };.
14110 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b Tcl_Size cmd;
14120 0a 20 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a . int isStr;.
14130 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b char buffer[
14140 31 36 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69 16384];. (voi
14150 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a d) clientData;..
14160 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
14170 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
14180 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c objc < 2) {..Tcl
14190 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
141a0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
141b0 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 subcommand ?args
141c0 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c ?");..return TCL
141d0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
141e0 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 if (Tcl_GetInd
141f0 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 exFromObj(interp
14200 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 , objv[1], comma
14210 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 nds, "command",
14220 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 0, &cmd) != TCL_
14230 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
14240 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
14250 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
14260 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 ror();.. isSt
14270 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 r = (cmd == C_ST
14280 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 RREQ);. switc
14290 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 h ((enum command
142a0 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 ) cmd) {..case C
142b0 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 _REQ:..case C_ST
142c0 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 RREQ: {.. EVP
142d0 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c _PKEY *pkey=NULL
142e0 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 ;.. X509 *cer
142f0 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 t=NULL;.. X50
14300 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 9_NAME *name=NUL
14310 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 L;.. Tcl_Obj
14320 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63 **listv;.. Tc
14330 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 l_Size listc;..
14340 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 int i;...
14350 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a BIO *out=NULL;..
14360 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 . char *k_C="
14370 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d ",*k_ST="",*k_L=
14380 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 "",*k_O="",*k_OU
14390 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f ="",*k_CN="",*k_
143a0 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 Email="";.. c
143b0 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d har *keyout,*pem
143c0 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 out,*str;.. i
143d0 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 nt keysize,seria
143e0 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 l=0,days=365;..#
143f0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
14400 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
14410 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 000000L.. BIG
14420 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b NUM *bne = NULL;
14430 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d .. RSA *rsa =
14440 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 NULL;.#else..
14450 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a EVP_PKEY_CTX *
14460 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 ctx = NULL;.#end
14470 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 if... if ((ob
14480 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 jc<5) || (objc>6
14490 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 )) {...Tcl_Wrong
144a0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
144b0 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 2, objv, "keysiz
144c0 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 e keyfile certfi
144d0 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 le ?info?");...r
144e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
144f0 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 .. }... if
14500 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
14510 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
14520 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 [2], &keysize) !
14530 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 = TCL_OK) {...re
14540 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
14550 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f . }.. keyo
14560 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 ut=Tcl_GetString
14570 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 (objv[3]);..
14580 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 pemout=Tcl_GetSt
14590 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 ring(objv[4]);..
145a0 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b if (isStr) {
145b0 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e ...Tcl_SetVar(in
145c0 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 terp,keyout,"",0
145d0 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 );...Tcl_SetVar(
145e0 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 interp,pemout,""
145f0 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ,0);.. }...
14600 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b if (objc>=6) {
14610 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f ...if (Tcl_ListO
14620 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e bjGetElements(in
14630 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 terp, objv[5], &
14640 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 listc, &listv) !
14650 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 = TCL_OK) {...
14660 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
14670 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 OR;...}....if ((
14680 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b listc%2) != 0) {
14690 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 ... Tcl_SetRe
146a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 sult(interp,"Inf
146b0 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 ormation list mu
146c0 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d st have even num
146d0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
146e0 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 ",NULL);... r
146f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
14700 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b ...}...for (i=0;
14710 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 i<listc; i+=2)
14720 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f {... str=Tcl_
14730 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
14740 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 i]);... if (s
14750 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 trcmp(str,"days"
14760 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 )==0) {....if (T
14770 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
14780 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b (interp,listv[i+
14790 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 1],&days)!=TCL_O
147a0 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e K).... return
147b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 TCL_ERROR;...
147c0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
147d0 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 cmp(str,"serial"
147e0 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 )==0) {....if (T
147f0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
14800 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b (interp,listv[i+
14810 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 1],&serial)!=TCL
14820 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 _OK).... retu
14830 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
14840 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
14850 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d trcmp(str,"C")==
14860 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 0) {....k_C=Tcl_
14870 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
14880 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
14890 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
148a0 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 tr,"ST")==0) {..
148b0 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 ..k_ST=Tcl_GetSt
148c0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
148d0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
148e0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c f (strcmp(str,"L
148f0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d ")==0) {....k_L=
14900 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
14910 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
14920 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
14930 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 mp(str,"O")==0)
14940 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 {....k_O=Tcl_Get
14950 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
14960 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
14970 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
14980 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b "OU")==0) {....k
14990 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e _OU=Tcl_GetStrin
149a0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
149b0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
149c0 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 strcmp(str,"CN")
149d0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 ==0) {....k_CN=T
149e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
149f0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
14a00 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
14a10 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d p(str,"Email")==
14a20 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 0) {....k_Email=
14a30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
14a40 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
14a50 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c } else {....Tcl
14a60 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
14a70 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d p,"Unknown param
14a80 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 eter",NULL);....
14a90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
14aa0 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 ;... }...}..
14ab0 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 }..#if OPENSS
14ac0 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
14ad0 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
14ae0 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 bne = BN_new
14af0 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 ();.. rsa = R
14b00 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 SA_new();.. p
14b10 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e key = EVP_PKEY_n
14b20 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 ew();.. if (b
14b30 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 ne == NULL || rs
14b40 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 a == NULL || pke
14b50 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e y == NULL || !BN
14b60 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 _set_word(bne,RS
14b70 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f A_F4) ||...!RSA_
14b80 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 generate_key_ex(
14b90 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e rsa, keysize, bn
14ba0 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 e, NULL) || !EVP
14bb0 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 _PKEY_assign_RSA
14bc0 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 (pkey, rsa)) {..
14bd0 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 .EVP_PKEY_free(p
14be0 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 key);.../* RSA_f
14bf0 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 ree(rsa); freed
14c00 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 by EVP_PKEY_free
14c10 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e */...BN_free(bn
14c20 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 e);.#else.. p
14c30 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 key = EVP_RSA_ge
14c40 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 n((unsigned int)
14c50 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 keysize);..
14c60 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 ctx = EVP_PKEY_C
14c70 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c TX_new(pkey,NULL
14c80 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 );.. if (pkey
14c90 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 == NULL || ctx
14ca0 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f == NULL || !EVP_
14cb0 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 PKEY_keygen_init
14cc0 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f (ctx) ||...!EVP_
14cd0 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 PKEY_CTX_set_rsa
14ce0 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 _keygen_bits(ctx
14cf0 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 , keysize) || !E
14d00 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 VP_PKEY_keygen(c
14d10 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 tx, &pkey)) {...
14d20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
14d30 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f ey);...EVP_PKEY_
14d40 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 CTX_free(ctx);.#
14d50 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 endif...Tcl_SetR
14d60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 esult(interp,"Er
14d70 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 ror generating p
14d80 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c rivate key",NULL
14d90 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
14da0 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c ERROR;.. } el
14db0 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 se {...if (isStr
14dc0 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 ) {... out=BI
14dd0 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 O_new(BIO_s_mem(
14de0 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 ));... PEM_wr
14df0 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b ite_bio_PrivateK
14e00 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c ey(out,pkey,NULL
14e10 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c ,NULL,0,NULL,NUL
14e20 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f L);... i=BIO_
14e30 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c read(out,buffer,
14e40 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 sizeof(buffer)-1
14e50 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 );... i=(i<0)
14e60 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 ? 0 : i;...
14e70 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a buffer[i]='\0';.
14e80 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 .. Tcl_SetVar
14e90 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 (interp,keyout,b
14ea0 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 uffer,0);...
14eb0 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a BIO_flush(out);.
14ec0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f .. BIO_free(o
14ed0 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a ut);...} else {.
14ee0 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 .. out=BIO_ne
14ef0 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b w(BIO_s_file());
14f00 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 ... BIO_write
14f10 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 _filename(out,ke
14f20 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d yout);... PEM
14f30 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 _write_bio_Priva
14f40 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e teKey(out,pkey,N
14f50 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c ULL,NULL,0,NULL,
14f60 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 NULL);... /*
14f70 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 PEM_write_bio_RS
14f80 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c APrivateKey(out,
14f90 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c rsa, NULL, NULL
14fa0 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 , 0, NULL, NULL)
14fb0 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 ; */... BIO_f
14fc0 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 ree_all(out);..
14fd0 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d .}....if ((cert=
14fe0 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c X509_new())==NUL
14ff0 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 L) {... Tcl_S
15000 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
15010 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e "Error generatin
15020 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65 g certificate re
15030 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 quest",NULL);...
15040 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 EVP_PKEY_fre
15050 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 e(pkey);.#if OPE
15060 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
15070 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
15080 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 L... BN_free(
15090 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 bne);.#endif...
150a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
150b0 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 ROR;...}....X509
150c0 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 _set_version(cer
150d0 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 t,2);...ASN1_INT
150e0 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 EGER_set(X509_ge
150f0 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 t_serialNumber(c
15100 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 ert),serial);...
15110 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 X509_gmtime_adj(
15120 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 X509_getm_notBef
15130 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 ore(cert),0);...
15140 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 X509_gmtime_adj(
15150 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 X509_getm_notAft
15160 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 er(cert),(long)6
15170 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 0*60*24*days);..
15180 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 .X509_set_pubkey
15190 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 (cert,pkey);....
151a0 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 name=X509_get_su
151b0 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 bject_name(cert)
151c0 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 ;....X509_NAME_a
151d0 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
151e0 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 name,"C", MBSTRI
151f0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
15200 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
15210 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b k_C, -1, -1, 0);
15220 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
15230 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
15240 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e me,"ST", MBSTRIN
15250 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
15260 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
15270 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _ST, -1, -1, 0);
15280 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
15290 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
152a0 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 me,"L", MBSTRING
152b0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
152c0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
152d0 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 L, -1, -1, 0);..
152e0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
152f0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
15300 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 ,"O", MBSTRING_A
15310 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
15320 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c ned char *) k_O,
15330 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
15340 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
15350 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
15360 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 OU", MBSTRING_AS
15370 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
15380 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c ed char *) k_OU,
15390 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
153a0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
153b0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
153c0 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 CN", MBSTRING_AS
153d0 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
153e0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c ed char *) k_CN,
153f0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
15400 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
15410 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
15420 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 Email", MBSTRING
15430 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
15440 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
15450 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 Email, -1, -1, 0
15460 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 );....X509_set_s
15470 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 ubject_name(cert
15480 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 ,name);....if (!
15490 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 X509_sign(cert,p
154a0 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 key,EVP_sha256()
154b0 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f )) {... X509_
154c0 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 free(cert);...
154d0 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 EVP_PKEY_free(
154e0 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 pkey);.#if OPENS
154f0 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
15500 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
15510 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e .. BN_free(bn
15520 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 e);.#endif...
15530 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
15540 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 nterp,"Error sig
15550 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 ning certificate
15560 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 ",NULL);... r
15570 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
15580 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 ...}....if (isSt
15590 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 r) {... out=B
155a0 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d IO_new(BIO_s_mem
155b0 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ());... PEM_w
155c0 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 rite_bio_X509(ou
155d0 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 t,cert);... i
155e0 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 =BIO_read(out,bu
155f0 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 ffer,sizeof(buff
15600 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d er)-1);... i=
15610 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 (i<0) ? 0 : i;..
15620 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 . buffer[i]='
15630 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 \0';... Tcl_S
15640 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d etVar(interp,pem
15650 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 out,buffer,0);..
15660 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f . BIO_flush(o
15670 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 ut);... BIO_f
15680 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c ree(out);...} el
15690 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 se {... out=B
156a0 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c IO_new(BIO_s_fil
156b0 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f e());... BIO_
156c0 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f write_filename(o
156d0 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 ut,pemout);...
156e0 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
156f0 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a X509(out,cert);.
15700 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 .. BIO_free_a
15710 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 ll(out);...}....
15720 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b X509_free(cert);
15730 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
15740 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e (pkey);.#if OPEN
15750 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
15760 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
15770 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b ...BN_free(bne);
15780 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 .#endif.. }..
15790 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 }..break;. de
157a0 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 fault:..break;.
157b0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
157c0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a TCL_OK;.}.../***
157d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
157e0 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 */./* Init
157f0 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a */./*****
15800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
15810 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
15820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
15860 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a Tls_Free --. *.
15870 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
15880 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e e cleans up when
15890 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
158a0 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 sed channel. *.i
158b0 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 s closed and its
158c0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
158d0 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 falls below 1.
158e0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
158f0 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .none. *. * Side
15900 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 effects:. *.Fre
15910 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 es all the state
15920 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
15930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15960 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
15970 69 64 0a 54 6c 73 5f 46 72 65 65 28 74 6c 73 5f id.Tls_Free(tls_
15980 66 72 65 65 5f 74 79 70 65 20 2a 62 6c 6f 63 6b free_type *block
15990 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 Ptr) {. State
159a0 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
159b0 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a ate *)blockPtr;.
159c0 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
159d0 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 lled");.. Tls
159e0 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 _Clean(statePtr)
159f0 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f ;. ckfree(blo
15a00 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ckPtr);.}.../*.
15a10 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
15a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a50 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 ----. *. * Tls_C
15a60 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 lean --. *. *.Th
15a70 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 is procedure cle
15a80 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 ans up when a SS
15a90 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 L socket based c
15aa0 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f hannel. *.is clo
15ab0 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 sed and its refe
15ac0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c rence count fall
15ad0 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 s below 1. This
15ae0 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 should. *.be ca
15af0 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 lled synchronous
15b00 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 ly by the CloseP
15b10 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a roc, not in the.
15b20 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 *.EventuallyFre
15b30 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 e callback.. *.
15b40 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f * Results:. *.no
15b50 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
15b60 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 fects:. *.Frees
15b70 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a all the state. *
15b80 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
15b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15bc0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 ------. */.void
15bd0 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 Tls_Clean(State
15be0 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 *statePtr) {.
15bf0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
15c00 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
15c10 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f tePtr->ssl) {../
15c20 2a 20 53 65 6e 64 20 63 6c 6f 73 65 5f 6e 6f 74 * Send close_not
15c30 69 66 79 20 6d 65 73 73 61 67 65 20 2a 2f 0a 09 ify message */..
15c40 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 73 68 75 dprintf("SSL_shu
15c50 74 64 6f 77 6e 28 25 70 29 22 2c 20 73 74 61 74 tdown(%p)", stat
15c60 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 2f 2a 20 ePtr->ssl);../*
15c70 57 69 6c 6c 20 72 65 74 75 72 6e 20 72 65 74 75 Will return retu
15c80 72 6e 20 30 20 77 68 69 6c 65 20 73 68 75 74 64 rn 0 while shutd
15c90 6f 77 6e 20 69 6e 20 70 72 6f 63 65 73 73 2c 20 own in process,
15ca0 74 68 65 6e 20 31 20 77 68 65 6e 20 63 6f 6d 70 then 1 when comp
15cb0 6c 65 74 65 20 2a 2f 0a 09 2f 2a 20 63 6c 6f 73 lete */../* clos
15cc0 65 73 20 74 68 65 20 77 72 69 74 65 20 64 69 72 es the write dir
15cd0 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f ection of the co
15ce0 6e 6e 65 63 74 69 6f 6e 3b 20 74 68 65 20 72 65 nnection; the re
15cf0 61 64 20 64 69 72 65 63 74 69 6f 6e 20 69 73 20 ad direction is
15d00 63 6c 6f 73 65 64 20 62 79 20 74 68 65 20 70 65 closed by the pe
15d10 65 72 2e 20 2a 2f 0a 09 2f 2a 20 44 6f 65 73 20 er. */../* Does
15d20 6e 6f 74 20 61 66 66 65 63 74 20 73 6f 63 6b 65 not affect socke
15d30 74 20 2a 2f 0a 09 53 53 4c 5f 73 68 75 74 64 6f t */..SSL_shutdo
15d40 77 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c wn(statePtr->ssl
15d50 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
15d60 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 . * we're as
15d70 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 suming here that
15d80 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 we're single-th
15d90 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 readed. */.
15da0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
15db0 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 >timer != (Tcl_T
15dc0 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 imerToken) NULL)
15dd0 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 {..Tcl_DeleteTi
15de0 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 merHandler(state
15df0 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 Ptr->timer);..st
15e00 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 atePtr->timer =
15e10 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
15e20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 61 6c 6c 62 /* Remove callb
15e30 61 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 acks */. if (
15e40 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
15e50 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 ck) {..Tcl_DecrR
15e60 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
15e70 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 ->callback);..st
15e80 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
15e90 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
15ea0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
15eb0 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 >password) {..Tc
15ec0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
15ed0 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
15ee0 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 d);..statePtr->p
15ef0 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a assword = NULL;.
15f00 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
15f10 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a atePtr->vcmd) {.
15f20 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
15f30 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 t(statePtr->vcmd
15f40 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63 );..statePtr->vc
15f50 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d md = NULL;. }
15f60 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
15f70 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 tr->protos) {..c
15f80 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e kfree(statePtr->
15f90 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 protos);..stateP
15fa0 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c tr->protos = NUL
15fb0 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 L;. }.. if
15fc0 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 (statePtr->bio)
15fd0 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c {../* This will
15fe0 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f call SSL_shutdo
15ff0 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 wn. Bug 1414045
16000 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f */..dprintf("BIO
16010 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 _free_all(%p)",
16020 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a statePtr->bio);.
16030 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 .BIO_free_all(st
16040 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 atePtr->bio);..s
16050 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e tatePtr->bio = N
16060 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
16070 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 if (statePtr->ss
16080 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 l) {..dprintf("S
16090 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 SL_free(%p)", st
160a0 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 atePtr->ssl);..S
160b0 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 SL_free(statePtr
160c0 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 ->ssl);..statePt
160d0 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 r->ssl = NULL;.
160e0 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
160f0 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 atePtr->ctx) {..
16100 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 SSL_CTX_free(sta
16110 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 tePtr->ctx);..st
16120 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 atePtr->ctx = NU
16130 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 LL;. }.. d
16140 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
16150 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d g");.}.../*. *--
16160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
161a0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 ----. *. * Build
161b0 20 49 6e 66 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d Info Command --
161c0 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 63 6f . *. *.Create co
161d0 6d 6d 61 6e 64 20 74 6f 20 72 65 74 75 72 6e 20 mmand to return
161e0 62 75 69 6c 64 20 69 6e 66 6f 20 66 6f 72 20 70 build info for p
161f0 61 63 6b 61 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 ackage.. *. * Re
16200 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
16210 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a dard Tcl result.
16220 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
16230 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 64 20 62 ts:. *.Created b
16240 75 69 6c 64 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e uild-info comman
16250 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d d.. *. *--------
16260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
162a0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 54 52 49 */..#ifndef STRI
162b0 4e 47 49 46 59 0a 23 20 20 64 65 66 69 6e 65 20 NGIFY.# define
162c0 53 54 52 49 4e 47 49 46 59 28 78 29 20 53 54 52 STRINGIFY(x) STR
162d0 49 4e 47 49 46 59 31 28 78 29 0a 23 20 20 64 65 INGIFY1(x).# de
162e0 66 69 6e 65 20 53 54 52 49 4e 47 49 46 59 31 28 fine STRINGIFY1(
162f0 78 29 20 23 78 0a 23 65 6e 64 69 66 0a 0a 69 6e x) #x.#endif..in
16300 74 0a 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 t.BuildInfoComma
16310 6e 64 28 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69 nd(Tcl_Interp* i
16320 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c nterp) {. Tcl
16330 5f 43 6d 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a _CmdInfo info;..
16340 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
16350 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 ommandInfo(inter
16360 70 2c 20 22 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 p, "::tcl::build
16370 2d 69 6e 66 6f 22 2c 20 26 69 6e 66 6f 29 29 20 -info", &info))
16380 7b 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a {..Tcl_CreateObj
16390 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
163a0 22 3a 3a 74 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e "::tls::build-in
163b0 66 6f 22 2c 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f fo", info.objPro
163c0 63 2c 20 28 76 6f 69 64 20 2a 29 28 0a 09 09 50 c, (void *)(...P
163d0 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 22 ACKAGE_VERSION "
163e0 2b 22 20 53 54 52 49 4e 47 49 46 59 28 54 4c 53 +" STRINGIFY(TLS
163f0 5f 56 45 52 53 49 4f 4e 5f 55 55 49 44 29 0a 23 _VERSION_UUID).#
16400 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 if defined(__cla
16410 6e 67 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 ng__) && defined
16420 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f (__clang_major__
16430 29 0a 09 09 09 20 20 20 20 22 2e 63 6c 61 6e 67 ).... ".clang
16440 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 -" STRINGIFY(__c
16450 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 lang_major__).#i
16460 66 20 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f f __clang_minor_
16470 5f 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 _ < 10.... "0
16480 22 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 ".#endif....
16490 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e STRINGIFY(__clan
164a0 67 5f 6d 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 g_minor__).#endi
164b0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f f.#if defined(__
164c0 63 70 6c 75 73 70 6c 75 73 29 20 26 26 20 21 64 cplusplus) && !d
164d0 65 66 69 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 efined(__OBJC__)
164e0 0a 09 09 09 20 20 20 20 22 2e 63 70 6c 75 73 70 .... ".cplusp
164f0 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e lus".#endif.#ifn
16500 64 65 66 20 4e 44 45 42 55 47 0a 09 09 09 20 20 def NDEBUG....
16510 20 20 22 2e 64 65 62 75 67 22 0a 23 65 6e 64 69 ".debug".#endi
16520 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f f.#if !defined(_
16530 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20 21 64 65 _clang__) && !de
16540 66 69 6e 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f fined(__INTEL_CO
16550 4d 50 49 4c 45 52 29 20 26 26 20 64 65 66 69 6e MPILER) && defin
16560 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 ed(__GNUC__)....
16570 20 20 20 20 22 2e 67 63 63 2d 22 20 53 54 52 49 ".gcc-" STRI
16580 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a NGIFY(__GNUC__).
16590 23 69 66 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 #if __GNUC_MINOR
165a0 5f 5f 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 __ < 10.... "
165b0 30 22 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 0".#endif....
165c0 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 STRINGIFY(__GNU
165d0 43 5f 4d 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 C_MINOR__).#endi
165e0 66 0a 23 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c f.#ifdef __INTEL
165f0 5f 43 4f 4d 50 49 4c 45 52 0a 09 09 09 20 20 20 _COMPILER....
16600 20 22 2e 69 63 63 2d 22 20 53 54 52 49 4e 47 49 ".icc-" STRINGI
16610 46 59 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 FY(__INTEL_COMPI
16620 4c 45 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 LER).#endif.#ifd
16630 65 66 20 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 ef TCL_MEM_DEBUG
16640 0a 09 09 09 20 20 20 20 22 2e 6d 65 6d 64 65 62 .... ".memdeb
16650 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 ug".#endif.#if d
16660 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 efined(_MSC_VER)
16670 0a 09 09 09 20 20 20 20 22 2e 6d 73 76 63 2d 22 .... ".msvc-"
16680 20 53 54 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f STRINGIFY(_MSC_
16690 56 45 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 VER).#endif.#ifd
166a0 65 66 20 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 ef USE_NMAKE....
166b0 20 20 20 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e ".nmake".#en
166c0 64 69 66 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f dif.#ifndef TCL_
166d0 43 46 47 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09 CFG_OPTIMIZED...
166e0 09 20 20 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 . ".no-optimi
166f0 7a 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 ze".#endif.#ifde
16700 66 20 5f 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 f __OBJC__....
16710 20 20 22 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22 ".objective-c"
16720 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 .#if defined(__c
16730 70 6c 75 73 70 6c 75 73 29 0a 09 09 09 20 20 20 plusplus)....
16740 20 22 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 "plusplus".#end
16750 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 if.#endif.#ifdef
16760 20 54 43 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45 TCL_CFG_PROFILE
16770 44 0a 09 09 09 20 20 20 20 22 2e 70 72 6f 66 69 D.... ".profi
16780 6c 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 le".#endif.#ifde
16790 66 20 50 55 52 49 46 59 0a 09 09 09 20 20 20 20 f PURIFY....
167a0 22 2e 70 75 72 69 66 79 22 0a 23 65 6e 64 69 66 ".purify".#endif
167b0 0a 23 69 66 64 65 66 20 53 54 41 54 49 43 5f 42 .#ifdef STATIC_B
167c0 55 49 4c 44 0a 09 09 09 20 20 20 20 22 2e 73 74 UILD.... ".st
167d0 61 74 69 63 22 0a 23 65 6e 64 69 66 0a 09 09 29 atic".#endif...)
167e0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 , NULL);. }.
167f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
16800 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
16810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16840 2d 2a 0a 20 2a 0a 20 2a 20 54 6c 73 4c 69 62 53 -*. *. * TlsLibS
16850 68 75 74 64 6f 77 6e 20 2d 2d 0a 20 2a 0a 20 2a hutdown --. *. *
16860 09 53 68 75 74 64 6f 77 6e 20 53 53 4c 20 6c 69 .Shutdown SSL li
16870 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 brary once per a
16880 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 0a 20 2a pplication. *. *
16890 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
168a0 74 61 6e 64 61 72 64 20 54 43 4c 20 72 65 73 75 tandard TCL resu
168b0 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 lt. *. * Side ef
168c0 66 65 63 74 73 3a 0a 20 2a 09 53 68 75 74 64 6f fects:. *.Shutdo
168d0 77 6e 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 wn SSL library.
168e0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
168f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a ----------*. */.
16920 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 static int TlsLi
16930 62 53 68 75 74 64 6f 77 6e 28 43 6c 69 65 6e 74 bShutdown(Client
16940 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 Data clientData)
16950 20 7b 0a 20 20 20 20 42 49 4f 5f 63 6c 65 61 6e {. BIO_clean
16960 75 70 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e up();. return
16970 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 TCL_OK;.}../*.
16980 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
16990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
169a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
169b0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 -------*. *. *.T
169c0 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a lsLibInit --. *.
169d0 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 *.Initializes S
169e0 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 SL library once
169f0 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a per application.
16a00 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
16a10 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
16a20 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 result. *. * Si
16a30 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 49 de effects:. *.I
16a40 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c nitializes SSL l
16a50 69 62 72 61 72 79 0a 20 2a 0a 20 2a 2d 2d 2d 2d ibrary. *. *----
16a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a90 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 --*. */.static i
16aa0 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 29 20 nt TlsLibInit()
16ab0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 {. static int
16ac0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 initialized = 0
16ad0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
16ae0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
16af0 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 f (!initialized)
16b00 20 7b 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a {../* Initializ
16b10 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f e BOTH libcrypto
16b20 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a and libssl. */.
16b30 09 69 66 20 28 21 4f 50 45 4e 53 53 4c 5f 69 6e .if (!OPENSSL_in
16b40 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 it_ssl(OPENSSL_I
16b50 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 NIT_LOAD_SSL_STR
16b60 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 INGS | OPENSSL_I
16b70 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f NIT_LOAD_CRYPTO_
16b80 53 54 52 49 4e 47 53 0a 09 20 20 20 20 7c 20 4f STRINGS.. | O
16b90 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f PENSSL_INIT_ADD_
16ba0 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 ALL_CIPHERS | OP
16bb0 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 ENSSL_INIT_ADD_A
16bc0 4c 4c 5f 44 49 47 45 53 54 53 0a 09 20 20 20 20 LL_DIGESTS..
16bd0 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c | OPENSSL_INIT_L
16be0 4f 41 44 5f 43 4f 4e 46 49 47 20 7c 20 4f 50 45 OAD_CONFIG | OPE
16bf0 4e 53 53 4c 5f 49 4e 49 54 5f 41 53 59 4e 43 2c NSSL_INIT_ASYNC,
16c00 20 4e 55 4c 4c 29 29 20 7b 0a 09 20 20 20 20 72 NULL)) {.. r
16c10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
16c20 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 ..}.../* Create
16c30 42 49 4f 20 68 61 6e 64 6c 65 72 73 20 2a 2f 0a BIO handlers */.
16c40 09 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c .BIO_new_tcl(NUL
16c50 4c 2c 20 30 29 3b 0a 09 0a 09 2f 2a 20 43 72 65 L, 0);..../* Cre
16c60 61 74 65 20 65 78 69 74 20 68 61 6e 64 6c 65 72 ate exit handler
16c70 20 2a 2f 0a 09 54 63 6c 5f 43 72 65 61 74 65 45 */..Tcl_CreateE
16c80 78 69 74 48 61 6e 64 6c 65 72 28 54 6c 73 4c 69 xitHandler(TlsLi
16c90 62 53 68 75 74 64 6f 77 6e 2c 20 4e 55 4c 4c 29 bShutdown, NULL)
16ca0 3b 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d ;..initialized =
16cb0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 1;. }. re
16cc0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
16cd0 0a 2f 2a 20 49 6e 69 74 20 73 63 72 69 70 74 20 ./* Init script
16ce0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 */.static const
16cf0 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 char tlsTclInitS
16d00 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 cript[] = {.#inc
16d10 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 lude "tls.tcl.h"
16d20 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .};../*. *------
16d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
16d70 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a . * Tls_Init --.
16d80 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 *. *.This is a
16d90 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 package initiali
16da0 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 zation procedure
16db0 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 , which is calle
16dc0 64 0a 20 2a 09 62 79 20 54 43 4c 20 77 68 65 6e d. *.by TCL when
16dd0 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 this package is
16de0 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 to be added to
16df0 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a an interpreter..
16e00 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
16e10 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 73 74 *.Initializes st
16e20 72 75 63 74 75 72 65 73 20 61 6e 64 20 63 72 65 ructures and cre
16e30 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73 2e 0a 20 ates commands..
16e40 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
16e50 73 3a 0a 20 2a 09 20 43 72 65 61 74 65 20 74 68 s:. *. Create th
16e60 65 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a e commands. *. *
16e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16eb0 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 20 54 43 4c ---. */..#if TCL
16ec0 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e _MAJOR_VERSION >
16ed0 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56 8.#define MIN_V
16ee0 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65 6c ERSION "9.0".#el
16ef0 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56 se.#define MIN_V
16f00 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65 6e ERSION "8.5".#en
16f10 64 69 66 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 dif..DLLEXPORT i
16f20 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f nt Tls_Init(Tcl_
16f30 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 Interp *interp)
16f40 7b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 {.. dprintf("
16f50 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64 65 Called");..#ifde
16f60 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a f USE_TCL_STUBS.
16f70 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 if (Tcl_Init
16f80 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d 49 Stubs(interp, MI
16f90 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d N_VERSION, 0) ==
16fa0 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
16fb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
16fc0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 }.#endif. if
16fd0 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 (Tcl_PkgRequire(
16fe0 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d interp, "Tcl", M
16ff0 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d IN_VERSION, 0) =
17000 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
17010 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
17020 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c }.. if (TlsL
17030 69 62 49 6e 69 74 28 29 20 21 3d 20 54 43 4c 5f ibInit() != TCL_
17040 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e OK) {..Tcl_Appen
17050 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
17060 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 "could not initi
17070 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 alize SSL librar
17080 79 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c y", (char *) NUL
17090 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
170a0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
170b0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
170c0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
170d0 3a 3a 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c ::tls::ciphers",
170e0 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 CiphersObjCmd,
170f0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c (ClientData) NUL
17100 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 L, (Tcl_CmdDelet
17110 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
17120 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
17130 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
17140 20 22 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 "::tls::connect
17150 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e ion", Connection
17160 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 InfoObjCmd, (Cli
17170 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 entData) NULL, (
17180 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
17190 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
171a0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
171b0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a mand(interp, "::
171c0 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c tls::handshake",
171d0 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 HandshakeObjCmd
171e0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e , (ClientData) N
171f0 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ULL, (Tcl_CmdDel
17200 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
17210 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
17220 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
17230 70 2c 20 22 3a 3a 74 6c 73 3a 3a 69 6d 70 6f 72 p, "::tls::impor
17240 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 t", ImportObjCmd
17250 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e , (ClientData) N
17260 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ULL, (Tcl_CmdDel
17270 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
17280 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
17290 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
172a0 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 69 6d 70 p, "::tls::unimp
172b0 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 ort", UnimportOb
172c0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
172d0 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d a) NULL, (Tcl_Cm
172e0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
172f0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
17300 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
17310 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 nterp, "::tls::u
17320 6e 73 74 61 63 6b 22 2c 20 55 6e 69 6d 70 6f 72 nstack", Unimpor
17330 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 tObjCmd, (Client
17340 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c Data) NULL, (Tcl
17350 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
17360 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
17370 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
17380 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 d(interp, "::tls
17390 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 ::status", Statu
173a0 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 sObjCmd, (Client
173b0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c Data) NULL, (Tcl
173c0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
173d0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
173e0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
173f0 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 d(interp, "::tls
17400 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 ::version", Vers
17410 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 ionObjCmd, (Clie
17420 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
17430 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
17440 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
17450 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
17460 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
17470 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f ls::misc", MiscO
17480 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
17490 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 ta) NULL, (Tcl_C
174a0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
174b0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
174c0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
174d0 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a interp, "::tls::
174e0 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 protocols", Prot
174f0 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c ocolsObjCmd, (Cl
17500 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
17510 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
17520 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 oc *) NULL);..
17530 20 20 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 BuildInfoComma
17540 6e 64 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 nd(interp);..
17550 20 69 66 20 28 69 6e 74 65 72 70 20 26 26 20 54 if (interp && T
17560 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 cl_Eval(interp,
17570 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 tlsTclInitScript
17580 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
17590 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
175a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 ;. }.. ret
175b0 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 urn Tcl_PkgProvi
175c0 64 65 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 de(interp, PACKA
175d0 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 GE_NAME, PACKAGE
175e0 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a _VERSION);.}../*
175f0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
17600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17630 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 09 54 6c 73 ------. *. *.Tls
17640 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a _SafeInit --. *.
17650 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63 *.This is a pac
17660 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 kage initializat
17670 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 20 66 6f ion procedure fo
17680 72 20 73 61 66 65 20 69 6e 74 65 72 70 73 2e 0a r safe interps..
17690 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
176a0 2a 09 53 61 6d 65 20 61 73 20 6f 66 20 27 54 6c *.Same as of 'Tl
176b0 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 20 53 69 s_Init'. *. * Si
176c0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 de effects:. *.S
176d0 61 6d 65 20 61 73 20 6f 66 20 27 54 6c 73 5f 49 ame as of 'Tls_I
176e0 6e 69 74 27 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nit'. *. *------
176f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
17730 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 /.DLLEXPORT int
17740 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c Tls_SafeInit(Tcl
17750 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 _Interp *interp)
17760 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 {. dprintf("
17770 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 Called");. re
17780 74 75 72 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e turn Tls_Init(in
17790 74 65 72 70 29 3b 0a 7d 0a terp);.}.