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 2c bj(interp, cert,
2c60: 20 30 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 0));. Tcl_Li
2c70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2c80: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2c90: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a r, Tcl_NewIntObj
2ca0: 28 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c (ok));. Tcl_L
2cb0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2cc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2cd0: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 tr,..Tcl_NewStri
2ce0: 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30 ngObj((char*)X50
2cf0: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 9_verify_cert_er
2d00: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c ror_string(err),
2d10: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 -1));.. /* P
2d20: 72 65 76 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 revent I/O while
2d30: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 callback is in
2d40: 70 72 6f 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 progress */.
2d50: 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 /* statePtr->fla
2d60: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 gs |= TLS_TCL_CA
2d70: 4c 4c 42 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 LLBACK; */..
2d80: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
2d90: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
2da0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
2db0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b (cmdPtr);. ok
2dc0: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 = EvalCallback(
2dd0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
2de0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 , cmdPtr);. T
2df0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
2e00: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 64 70 cmdPtr);.. dp
2e10: 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c rintf("VerifyCal
2e20: 6c 62 61 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72 lback: command r
2e30: 65 73 75 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29 esult = %d", ok)
2e40: 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 ;.. /* stateP
2e50: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 tr->flags &= ~(T
2e60: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 LS_TCL_CALLBACK)
2e70: 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 ; */. return
2e80: 6f 6b 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c ok;./* By defaul
2e90: 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 t, leave verific
2ea0: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e ation unchanged.
2eb0: 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d ----------------
2f00: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 . *. * Tls_Error
2f10: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 --. *. *.Calls
2f20: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 65 72 callback with er
2f30: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a ror message.. *.
2f40: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
2f50: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c . *.The err fiel
2f60: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 d of the current
2f70: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 ly operative Sta
2f80: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 te is set. *. t
2f90: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 o a string descr
2fa0: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 ibing the SSL ne
2fb0: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 gotiation failur
2fc0: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d e reason. *. *--
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 2d 2d ----------------
3010: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 -. */.void.Tls_E
3020: 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 rror(State *stat
3030: 65 50 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 ePtr, const char
3040: 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c *msg) {. Tcl
3050: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
3060: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
3070: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
3080: 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 *cmdPtr, *listPt
3090: 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 r;. unsigned
30a0: 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 74 long err;. st
30b0: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 atePtr->err = ms
30c0: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 g;.. dprintf(
30d0: 22 43 61 6c 6c 65 64 20 77 69 74 68 20 6d 65 73 "Called with mes
30e0: 73 61 67 65 20 25 73 22 2c 20 6d 73 67 29 3b 0a sage %s", msg);.
30f0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
3100: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 r->callback == (
3110: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b Tcl_Obj*)NULL) {
3120: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a ..return;. }.
3130: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
3140: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 ommand to eval w
3150: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e ith fn, chan, an
3160: 64 20 6d 65 73 73 61 67 65 20 61 72 67 73 20 2a d message args *
3170: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
3180: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
3190: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
31a0: 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 ck);. Tcl_Lis
31b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
31c0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
31d0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
31e0: 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 bj("error", -1))
31f0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3200: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3210: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
3220: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
3230: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
3240: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
3250: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 ->self), -1));.
3260: 20 20 20 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 if (msg != NU
3270: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f LL) {..Tcl_ListO
3280: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3290: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
32a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
32b0: 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 (msg, -1));..
32c0: 20 7d 20 65 6c 73 65 20 69 66 20 28 28 6d 73 67 } else if ((msg
32d0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
32e0: 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c (Tcl_GetObjResul
32f0: 74 28 69 6e 74 65 72 70 29 29 29 20 21 3d 20 4e t(interp))) != N
3300: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 ULL) {..Tcl_List
3310: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3320: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3330: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3340: 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 j(msg, -1));..
3350: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 } else {..list
3360: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
3370: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 tObj(0, NULL);..
3380: 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20 45 52 while ((err = ER
3390: 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 20 21 R_get_error()) !
33a0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f = 0) {.. Tcl_
33b0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
33c0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
33d0: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tPtr, Tcl_NewStr
33e0: 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f ingObj(ERR_reaso
33f0: 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 n_error_string(e
3400: 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 rr), -1));..}..T
3410: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3420: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3430: 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 72 29 cmdPtr, listPtr)
3440: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
3450: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
3460: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
3470: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
3480: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 dPtr);. EvalC
3490: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
34a0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
34b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
34c0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
34d0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 0a 20 2a -------------. *
3520: 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 . * KeyLogCallba
3530: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 ck --. *. *.Writ
3540: 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 20 64 e received key d
3550: 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e ata to log file.
3560: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
3570: 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a cts:. *.none. *.
3580: 20 2a 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 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b -----. */.void K
35d0: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f eyLogCallback(co
35e0: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f nst SSL *ssl, co
35f0: 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 nst char *line)
3600: 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 {. char *str
3610: 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c = getenv(SSLKEYL
3620: 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c OGFILE);. FIL
3630: 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 72 69 E *fd;.. dpri
3640: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
3650: 20 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a 09 if (str) {..
3660: 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 fd = fopen(str,
3670: 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 "a");..fprintf(f
3680: 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b d, "%s\n",line);
3690: 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 ..fclose(fd);.
36a0: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d ----------------
36f0: 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 20 . *. * Password
3700: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 Callback --. *.
3710: 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 *.Called when a
3720: 70 61 73 73 77 6f 72 64 20 69 73 20 6e 65 65 64 password is need
3730: 65 64 20 66 6f 72 20 61 20 70 72 69 76 61 74 65 ed for a private
3740: 20 6b 65 79 20 77 68 65 6e 20 6c 6f 61 64 69 6e key when loadin
3750: 67 0a 20 2a 09 6f 72 20 73 74 6f 72 69 6e 67 20 g. *.or storing
3760: 61 20 50 45 4d 20 63 65 72 74 69 66 69 63 61 74 a PEM certificat
3770: 65 20 77 69 74 68 20 65 6e 63 72 79 70 74 69 6f e with encryptio
3780: 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 n. Evals callbac
3790: 6b 0a 20 2a 09 73 63 72 69 70 74 20 61 6e 64 20 k. *.script and
37a0: 72 65 74 75 72 6e 73 20 74 68 65 20 72 65 73 75 returns the resu
37b0: 6c 74 20 61 73 20 74 68 65 20 70 61 73 73 77 6f lt as the passwo
37c0: 72 64 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 rd string in buf
37d0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
37e0: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
37f0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
3800: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
3810: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
3820: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 * Returns:. *.Pa
3830: 73 73 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 ssword size in b
3840: 79 74 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 ytes or -1 for a
3850: 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d n error.. *. *--
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 2d 2d ----------------
38a0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
38b0: 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 .PasswordCallbac
38c0: 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 k(char *buf, int
38d0: 20 73 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 size, int rwfla
38e0: 67 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 g, void *udata)
38f0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
3900: 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a tePtr.= (State *
3910: 29 20 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c ) udata;. Tcl
3920: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
3930: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
3940: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
3950: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 *cmdPtr;. int
3960: 20 63 6f 64 65 3b 0a 20 20 20 20 54 63 6c 5f 53 code;. Tcl_S
3970: 69 7a 65 20 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 ize len;.. dp
3980: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
3990: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 .. /* If no c
39a0: 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64 65 66 allback, use def
39b0: 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f ault callback */
39c0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
39d0: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e r->password == N
39e0: 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f ULL) {..if (Tcl_
39f0: 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 EvalEx(interp, "
3a00: 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 tls::password",
3a10: 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f -1, TCL_EVAL_GLO
3a20: 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 BAL) == TCL_OK)
3a30: 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65 74 {.. char *ret
3a40: 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f = (char *) Tcl_
3a50: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
3a60: 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c (Tcl_GetObjResul
3a70: 74 28 69 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 t(interp), &len)
3a80: 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e ;.. if (len >
3a90: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 (Tcl_Size) size
3aa0: 2d 31 29 20 7b 0a 09 09 6c 65 6e 20 3d 20 28 54 -1) {...len = (T
3ab0: 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b cl_Size) size-1;
3ac0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 74 72 .. }.. str
3ad0: 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 ncpy(buf, ret, (
3ae0: 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 size_t) len);..
3af0: 20 20 20 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c buf[len] = '\
3b00: 30 27 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 0';.. return
3b10: 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 20 65 6c (int) len;..} el
3b20: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e se {.. return
3b30: 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 -1;..}. }..
3b40: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
3b50: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 mand to eval wit
3b60: 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c 20 61 6e h fn, rwflag, an
3b70: 64 20 73 69 7a 65 20 61 72 67 73 20 2a 2f 0a 20 d size args */.
3b80: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
3b90: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
3ba0: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
3bb0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3bc0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3bd0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3be0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
3bf0: 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 "password", -1))
3c00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3c10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3c20: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3c30: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 cl_NewIntObj(rwf
3c40: 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c lag));. Tcl_L
3c50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3c60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
3c70: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 tr, Tcl_NewIntOb
3c80: 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54 j(size));.. T
3c90: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
3ca0: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
3cb0: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 ;. Tcl_Preser
3cc0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
3cd0: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
3ce0: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
3cf0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
3d00: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
3d10: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
3d20: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
3d30: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
3d40: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
3d50: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
3d60: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
3d70: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
3d80: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
3d90: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
3da0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
3db0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
3dc0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
3dd0: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
3de0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
3df0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
3e00: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
3e10: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
3e20: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
3e30: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
3e40: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 ePtr);.. /* I
3e50: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 61 f successful, pa
3e60: 73 73 20 62 61 63 6b 20 70 61 73 73 77 6f 72 64 ss back password
3e70: 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72 75 6e string and trun
3e80: 63 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 cate if too long
3e90: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f 64 65 */. if (code
3ea0: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 == TCL_OK) {..c
3eb0: 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 har *ret = (char
3ec0: 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e *) Tcl_GetStrin
3ed0: 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 gFromObj(Tcl_Get
3ee0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
3ef0: 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c ), &len);..if (l
3f00: 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 en > (Tcl_Size)
3f10: 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c size-1) {.. l
3f20: 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 en = (Tcl_Size)
3f30: 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e size-1;..}..strn
3f40: 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 cpy(buf, ret, (s
3f50: 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 ize_t) len);..bu
3f60: 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 f[len] = '\0';..
3f70: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
3f80: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
3f90: 3b 0a 09 72 65 74 75 72 6e 20 28 69 6e 74 29 20 ;..return (int)
3fa0: 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 len;. }. T
3fb0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
3fc0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
3fd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a . return -1;.
3fe0: 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 0a 20 2a 0a ------------. *.
4030: 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 * Session Callb
4040: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 ack for Clients
4050: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
4060: 77 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 when a new sessi
4070: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 on is added to t
4080: 68 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 he cache. In TLS
4090: 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 1.3. *.this may
40a0: 20 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c be received mul
40b0: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 tiple times afte
40c0: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e r the handshake.
40d0: 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 For. *.earlier
40e0: 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 versions, this w
40f0: 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 ill be received
4100: 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 during the hands
4110: 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 hake.. *.This is
4120: 20 74 68 65 20 70 72 65 66 65 72 72 65 64 20 77 the preferred w
4130: 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 ay to obtain a r
4140: 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e esumable session
4150: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
4160: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
4170: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
4180: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
4190: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
41a0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
41b0: 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 *.0 = error whe
41c0: 72 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 re session will
41d0: 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 be immediately r
41e0: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 emoved from the
41f0: 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a internal cache..
4200: 20 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 *.1 = success w
4210: 68 65 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 here app retains
4220: 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 session in sess
4230: 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d ion cache, and m
4240: 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 ust call SSL_SES
4250: 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e SION_free() when
4260: 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d done.. *. *----
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 2d 2d 2d 0a ---------------.
42b0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 */.static int.S
42c0: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 essionCallback(S
42d0: 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 SL *ssl, SSL_SES
42e0: 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b SION *session) {
42f0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
4300: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 ePtr = (State*)S
4310: 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 SL_get_app_data(
4320: 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 (SSL *)ssl);.
4330: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
4340: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
4350: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
4360: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
4370: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
4380: 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 char *ticket;.
4390: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
43a0: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 char *session_i
43b0: 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 d;. size_t le
43c0: 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 n2;. unsigned
43d0: 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 int ulen;..
43e0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
43f0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
4400: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
4410: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
4420: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
4430: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 TLSEXT_ERR_OK;.
4440: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 } else if (ss
4450: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 l == NULL) {..re
4460: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
4470: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
4480: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
4490: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
44a0: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 73 with fn, chan, s
44b0: 65 73 73 69 6f 6e 20 69 64 2c 20 73 65 73 73 69 ession id, sessi
44c0: 6f 6e 20 74 69 63 6b 65 74 2c 20 61 6e 64 20 6c on ticket, and l
44d0: 69 66 65 74 69 6d 65 20 61 72 67 73 20 2a 2f 0a ifetime args */.
44e0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
44f0: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
4500: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
4510: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
4520: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
4530: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
4540: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
4550: 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 ("session", -1))
4560: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
4570: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
4580: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
4590: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
45a0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
45b0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
45c0: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a ->self), -1));..
45d0: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 /* Session i
45e0: 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e d */. session
45f0: 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f _id = SSL_SESSIO
4600: 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e N_get_id(session
4610: 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 , &ulen);. Tc
4620: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4630: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
4640: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 mdPtr, Tcl_NewBy
4650: 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 teArrayObj(sessi
4660: 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 on_id, (Tcl_Size
4670: 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f ) ulen));.. /
4680: 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 * Session ticket
4690: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 */. SSL_SESS
46a0: 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 ION_get0_ticket(
46b0: 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 session, &ticket
46c0: 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 , &len2);. Tc
46d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
46e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
46f0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 mdPtr, Tcl_NewBy
4700: 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 teArrayObj(ticke
4710: 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 t, (Tcl_Size) le
4720: 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 n2));.. /* Li
4730: 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 fetime - number
4740: 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 of seconds */.
4750: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
4760: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
4770: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f p, cmdPtr,..Tcl_
4780: 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 NewLongObj((long
4790: 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 ) SSL_SESSION_ge
47a0: 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d t_ticket_lifetim
47b0: 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 e_hint(session))
47c0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 );.. /* Eval
47d0: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
47e0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
47f0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
4800: 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 ;. EvalCallba
4810: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ck(interp, state
4820: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 Ptr, cmdPtr);.
4830: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
4840: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 nt(cmdPtr);..
4850: 20 2f 2a 20 52 65 74 75 72 6e 20 30 20 66 6f 72 /* Return 0 for
4860: 20 6e 6f 77 20 75 6e 74 69 6c 20 73 65 73 73 69 now until sessi
4870: 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 63 on handling is c
4880: 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 omplete */. r
4890: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a eturn 0;.}.../*.
48a0: 20 2a 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 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e -----. *. * ALPN
48f0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 Callback for Se
4900: 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 rvers and NPN Ca
4910: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e llback for Clien
4920: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 ts --. *. *.Perf
4930: 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 orm protocol (ht
4940: 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 tp/1.1, h2, h3,
4950: 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 etc.) selection
4960: 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d for the. *.incom
4970: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 ing connection.
4980: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c Called after Hel
4990: 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 lo and server ca
49a0: 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 llbacks.. *.Wher
49b0: 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 e 'out' is selec
49c0: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 ted protocol and
49d0: 20 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 'in' is the pee
49e0: 72 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 r advertised lis
49f0: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 t.. *. * Results
4a00: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.None. *. *
4a10: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
4a20: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 .Calls callback
4a30: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a (if defined). *.
4a40: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a * Return codes:
4a50: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
4a60: 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 RR_OK: ALPN prot
4a70: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 ocol selected. T
4a80: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
4a90: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f ntinues.. *.SSL_
4aa0: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 TLSEXT_ERR_ALERT
4ab0: 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 _FATAL: There wa
4ac0: 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 s no overlap bet
4ad0: 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 ween the client'
4ae0: 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 s. *. supplie
4af0: 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 d list and the s
4b00: 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 erver configurat
4b10: 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ion. The connect
4b20: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 ion will be abor
4b30: 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 ted.. *.SSL_TLSE
4b40: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c XT_ERR_NOACK: AL
4b50: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 PN protocol not
4b60: 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 selected, e.g.,
4b70: 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a because no ALPN.
4b80: 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 *. protocols
4b90: 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 are configured
4ba0: 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 for this connect
4bb0: 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ion. The connect
4bc0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
4bd0: 2a 0a 20 2a 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 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
4c20: 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 ic int.ALPNCallb
4c30: 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f ack(SSL *ssl, co
4c40: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
4c50: 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 r **out, unsigne
4c60: 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a d char *outlen,.
4c70: 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 .const unsigned
4c80: 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e char *in, unsign
4c90: 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f ed int inlen, vo
4ca0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
4cb0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
4cc0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 (State*)arg;.
4cd0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
4ce0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
4cf0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
4d00: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
4d10: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b int code, res;
4d20: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
4d30: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
4d40: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (ssl == NULL ||
4d50: 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a arg == NULL) {.
4d60: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4d70: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
4d80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 }.. /* Sele
4d90: 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 ct protocol */.
4da0: 20 20 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 if (SSL_selec
4db0: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e t_next_proto((un
4dc0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 29 20 signed char **)
4dd0: 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 out, outlen, sta
4de0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 tePtr->protos, s
4df0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f tatePtr->protos_
4e00: 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 len,..in, inlen)
4e10: 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f == OPENSSL_NPN_
4e20: 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f NEGOTIATED) {../
4e30: 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f * Match found */
4e40: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 ..res = SSL_TLSE
4e50: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
4e60: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e else {../* OPEN
4e70: 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c SSL_NPN_NO_OVERL
4e80: 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c AP = No overlap,
4e90: 20 73 6f 20 75 73 65 20 66 69 72 73 74 20 69 74 so use first it
4ea0: 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 em from client p
4eb0: 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a rotocol list */.
4ec0: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 .res = SSL_TLSEX
4ed0: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
4ee0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 }.. if (stat
4ef0: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 ePtr->vcmd == (T
4f00: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
4f10: 09 72 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 .return res;.
4f20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
4f30: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
4f40: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c l with fn, chan,
4f50: 20 64 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66 depth, cert inf
4f60: 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20 o list, status,
4f70: 61 6e 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a and error args *
4f80: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
4f90: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
4fa0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
4fb0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4fc0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4fd0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
4fe0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
4ff0: 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 alpn", -1));.
5000: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5010: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5020: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
5030: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
5040: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
5050: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
5060: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 f), -1));. Tc
5070: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
5080: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
5090: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
50a0: 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 ringObj((const c
50b0: 68 61 72 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 har *) *out, -1)
50c0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
50d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
50e0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
50f0: 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 Tcl_NewBooleanOb
5100: 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 j(res == SSL_TLS
5110: 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 EXT_ERR_OK));..
5120: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
5130: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 ack command */.
5140: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
5150: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
5160: 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 if ((code = Eva
5170: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
5180: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
5190: 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 tr)) > 1) {..res
51a0: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 = SSL_TLSEXT_ER
51b0: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 R_NOACK;. } e
51c0: 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 lse if (code ==
51d0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 1) {..res = SSL_
51e0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 TLSEXT_ERR_OK;.
51f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 } else {..res
5200: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 = SSL_TLSEXT_ER
5210: 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 R_ALERT_FATAL;.
5220: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
5230: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
5240: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 );. return re
5250: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d s;.}.../*. *----
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 2d 2d 2d 0a ---------------.
52a0: 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20 *. * Advertise
52b0: 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 Protocols Callba
52c0: 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 ck for Next Prot
52d0: 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e ocol Negotiation
52e0: 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72 (NPN) in Server
52f0: 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 Hello --. *. *.c
5300: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 alled when a TLS
5310: 20 73 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 server needs a
5320: 6c 69 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 list of supporte
5330: 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 d protocols for
5340: 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c Next. *.Protocol
5350: 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a Negotiation.. *
5360: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
5370: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
5380: 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 effects:. *. * R
5390: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 eturn codes:. *.
53a0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
53b0: 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 K: NPN protocol
53c0: 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f selected. The co
53d0: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
53e0: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es.. *.SSL_TLSEX
53f0: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e T_ERR_NOACK: NPN
5400: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 protocol not se
5410: 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e lected. The conn
5420: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
5430: 2e 0a 20 2a 0a 20 2a 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 2d 2d 2d 0a 20 2a 2f 0a 23 ----------. */.#
5480: 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 ifdef USE_NPN.st
5490: 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c atic int.NPNCall
54a0: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a back(const SSL *
54b0: 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 ssl, const unsig
54c0: 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 ned char **out,
54d0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 unsigned int *ou
54e0: 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 tlen, void *arg)
54f0: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
5500: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a atePtr = (State*
5510: 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e )arg;.. dprin
5520: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
5530: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 if (ssl == NU
5540: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c LL || arg == NUL
5550: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
5560: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
5570: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a K;. }.. /*
5580: 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c Set protocols l
5590: 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 ist */. if (s
55a0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
55b0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 != NULL) {..*out
55c0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f = statePtr->pro
55d0: 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 tos;..*outlen =
55e0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
55f0: 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 _len;. } else
5600: 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b {..*out = NULL;
5610: 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 ..*outlen = 0;..
5620: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
5630: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
5640: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 }. return SS
5650: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
5660: 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 .}.#endif.../*.
5670: 2a 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 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 ----. *. * SNI C
56c0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 allback for Serv
56d0: 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 ers --. *. *.Per
56e0: 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 form server-side
56f0: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 SNI hostname se
5700: 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 lection after re
5710: 63 65 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65 ceiving SNI exte
5720: 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 nsion. *.in Clie
5730: 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 nt Hello. Called
5740: 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c after hello cal
5750: 6c 62 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65 lback but before
5760: 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a ALPN callback..
5770: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
5780: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
5790: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
57a0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
57b0: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
57c0: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a Return codes:. *
57d0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
57e0: 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 OK: SNI hostname
57f0: 20 69 73 20 61 63 63 65 70 74 65 64 2e 20 54 68 is accepted. Th
5800: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
5810: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 tinues.. *.SSL_T
5820: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
5830: 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e FATAL: SNI hostn
5840: 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 ame is not accep
5850: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
5860: 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62 ion. *. is ab
5870: 6f 72 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66 orted. Default f
5880: 6f 72 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f or alert is SSL_
5890: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f AD_UNRECOGNIZED_
58a0: 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 NAME.. *.SSL_TLS
58b0: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 EXT_ERR_ALERT_WA
58c0: 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e RNING: SNI hostn
58d0: 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 ame is not accep
58e0: 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 ted, warning ale
58f0: 72 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28 rt. *. sent (
5900: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e not supported in
5910: 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63 TLSv1.3). The c
5920: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
5930: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 ues.. *.SSL_TLSE
5940: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e XT_ERR_NOACK: SN
5950: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
5960: 74 20 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e t accepted and n
5970: 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c ot acknowledged,
5980: 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20 . *. e.g. if
5990: 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e SNI has not been
59a0: 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65 configured. The
59b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
59c0: 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d inues.. *. *----
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 2d 2d 2d 0a ---------------.
5a10: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 */.static int.S
5a20: 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 NICallback(const
5a30: 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a SSL *ssl, int *
5a40: 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 alert, void *arg
5a50: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
5a60: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
5a70: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 *)arg;. Tcl_I
5a80: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
5a90: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
5aa0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
5ab0: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
5ac0: 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f ode, res;. co
5ad0: 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 nst char *server
5ae0: 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 name = NULL;..
5af0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
5b00: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 d");.. if (ss
5b10: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 l == NULL || arg
5b20: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
5b30: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
5b40: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
5b50: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 . /* Only wor
5b60: 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 ks for TLS 1.2 a
5b70: 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 nd earlier */.
5b80: 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 servername = S
5b90: 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d SL_get_servernam
5ba0: 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 e(ssl, TLSEXT_NA
5bb0: 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 METYPE_host_name
5bc0: 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72 76 );. if (!serv
5bd0: 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 ername || server
5be0: 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 name[0] == '\0')
5bf0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
5c00: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
5c10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
5c20: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
5c30: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
5c40: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
5c50: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 TLSEXT_ERR_OK;.
5c60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
5c70: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
5c80: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 val with fn, cha
5c90: 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e 61 n, and server na
5ca0: 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 me args */. c
5cb0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
5cc0: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
5cd0: 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 r->vcmd);. Tc
5ce0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
5cf0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
5d00: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
5d10: 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d ringObj("sni", -
5d20: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
5d30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
5d40: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
5d50: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
5d60: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
5d70: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
5d80: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
5d90: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
5da0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5db0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
5dc0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
5dd0: 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 servername , -1)
5de0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 );.. /* Eval
5df0: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
5e00: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
5e10: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
5e20: 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 ;. if ((code
5e30: 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 = EvalCallback(i
5e40: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
5e50: 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b cmdPtr)) > 1) {
5e60: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 ..res = SSL_TLSE
5e70: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 XT_ERR_ALERT_WAR
5e80: 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 NING;..*alert =
5e90: 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 SSL_AD_UNRECOGNI
5ea0: 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 ZED_NAME; /* Not
5eb0: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c supported by TL
5ec0: 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 S 1.3 */. } e
5ed0: 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 lse if (code ==
5ee0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 1) {..res = SSL_
5ef0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 TLSEXT_ERR_OK;.
5f00: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 } else {..res
5f10: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 = SSL_TLSEXT_ER
5f20: 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 R_ALERT_FATAL;..
5f30: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f *alert = SSL_AD_
5f40: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d UNRECOGNIZED_NAM
5f50: 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 E; /* Not suppor
5f60: 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a ted by TLS 1.3 *
5f70: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f /. }. Tcl_
5f80: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
5f90: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
5fa0: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d res;.}.../*. *-
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 2d ----------------
5ff0: 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 --. *. * ClientH
6000: 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 ello Handshake C
6010: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 allback for Serv
6020: 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 ers --. *. *.Use
6030: 64 20 62 79 20 73 65 72 76 65 72 20 74 6f 20 65 d by server to e
6040: 78 61 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65 xamine the serve
6050: 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f r name indicatio
6060: 6e 20 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f n (SNI) extensio
6070: 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79 n. *.provided by
6080: 20 74 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f the client in o
6090: 72 64 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61 rder to select a
60a0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 65 n appropriate ce
60b0: 72 74 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 rtificate to. *.
60c0: 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b present, and mak
60d0: 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 e other configur
60e0: 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 ation adjustment
60f0: 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 s relevant to th
6100: 61 74 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d at server. *.nam
6110: 65 20 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 e and its config
6120: 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e uration. This in
6130: 63 6c 75 64 65 73 20 73 77 61 70 70 69 6e 67 20 cludes swapping
6140: 6f 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 out the associat
6150: 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f ed. *.SSL_CTX po
6160: 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 inter, modifying
6170: 20 74 68 65 20 73 65 72 76 65 72 27 73 20 6c 69 the server's li
6180: 73 74 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20 st of permitted
6190: 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a TLS versions,. *
61a0: 09 63 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 .changing the se
61b0: 72 76 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 rver's cipher li
61c0: 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 st in response t
61d0: 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 o the client's c
61e0: 69 70 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e ipher list, etc.
61f0: 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 . *.Called befor
6200: 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 e SNI and ALPN c
6210: 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 allbacks.. *. *
6220: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 Results:. *.None
6230: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
6240: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 cts:. *.Calls ca
6250: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e llback (if defin
6260: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e ed). *. * Return
6270: 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 codes:. *.SSL_C
6280: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 LIENT_HELLO_RETR
6290: 59 3a 20 73 75 73 70 65 6e 64 20 74 68 65 20 68 Y: suspend the h
62a0: 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 andshake, and th
62b0: 65 20 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 e handshake func
62c0: 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e tion will return
62d0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 immediately. *.
62e0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
62f0: 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c _ERROR: failure,
6300: 20 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 terminate conne
6310: 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 ction. Set alert
6320: 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a to error code..
6330: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 *.SSL_CLIENT_HE
6340: 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 73 75 63 LLO_SUCCESS: suc
6350: 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d cess. *. *------
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 2d 2d 2d 0a 20 2a -------------. *
63a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 65 6c /.static int.Hel
63b0: 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a loCallback(SSL *
63c0: 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c ssl, int *alert,
63d0: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 void *arg) {.
63e0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
63f0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b r = (State*)arg;
6400: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
6410: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
6420: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
6430: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
6440: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 . int code, r
6450: 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 es;. const ch
6460: 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a ar *servername;.
6470: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
6480: 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 ed char *p;.
6490: 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 size_t len, rema
64a0: 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 ining;.. dpri
64b0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
64c0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
64d0: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f ->vcmd == (Tcl_O
64e0: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 bj*)NULL) {..ret
64f0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
6500: 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 ELLO_SUCCESS;.
6510: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c } else if (ssl
6520: 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a == (const SSL *
6530: 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 )NULL || arg ==
6540: 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a (void *)NULL) {.
6550: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 .return SSL_CLIE
6560: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a NT_HELLO_ERROR;.
6570: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 }.. /* Ge
6580: 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 t names */. i
6590: 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 f (!SSL_client_h
65a0: 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 ello_get0_ext(ss
65b0: 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 l, TLSEXT_TYPE_s
65c0: 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 erver_name, &p,
65d0: 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 &remaining) || r
65e0: 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b emaining <= 2) {
65f0: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 ..*alert = SSL_R
6600: 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c _SSLV3_ALERT_ILL
6610: 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a EGAL_PARAMETER;.
6620: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 .return SSL_CLIE
6630: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a NT_HELLO_ERROR;.
6640: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 }.. /* Ex
6650: 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67 74 68 tract the length
6660: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 of the supplied
6670: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 list of names.
6680: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 */. len = (*(
6690: 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 p++) << 8);.
66a0: 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 len += *(p++);.
66b0: 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 if (len + 2 !
66c0: 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 = remaining) {..
66d0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 *alert = SSL_R_S
66e0: 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 SLV3_ALERT_ILLEG
66f0: 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 AL_PARAMETER;..r
6700: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
6710: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
6720: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e }. remainin
6730: 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a g = len;.. /*
6740: 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70 72 61 The list in pra
6750: 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 ctice only has a
6760: 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c single element,
6770: 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 so we only cons
6780: 69 64 65 72 20 74 68 65 20 66 69 72 73 74 20 6f ider the first o
6790: 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 ne. */. if (r
67a0: 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c emaining == 0 ||
67b0: 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f *p++ != TLSEXT_
67c0: 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 NAMETYPE_host_na
67d0: 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 me) {..*alert =
67e0: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
67f0: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 T_INTERNAL_ERROR
6800: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
6810: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
6820: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 ;. }. rema
6830: 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a ining--;.. /*
6840: 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69 6e 61 Now we can fina
6850: 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 lly pull out the
6860: 20 62 79 74 65 20 61 72 72 61 79 20 77 69 74 68 byte array with
6870: 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f 73 74 the actual host
6880: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 name. */. if
6890: 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 (remaining <= 2)
68a0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
68b0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
68c0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 NTERNAL_ERROR;..
68d0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
68e0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
68f0: 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 }. len = (
6900: 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 *(p++) << 8);.
6910: 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b len += *(p++);
6920: 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 . if (len + 2
6930: 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a > remaining) {.
6940: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f .*alert = SSL_R_
6950: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 TLSV1_ALERT_INTE
6960: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 RNAL_ERROR;..ret
6970: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
6980: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
6990: 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 }. remaining
69a0: 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 = len;. serve
69b0: 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 rname = (const c
69c0: 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a har *)p;.. /*
69d0: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 Create command
69e0: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c to eval with fn,
69f0: 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 chan, and serve
6a00: 72 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 r name args */.
6a10: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
6a20: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
6a30: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 tePtr->vcmd);.
6a40: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
6a50: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
6a60: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
6a70: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c ewStringObj("hel
6a80: 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lo", -1));. T
6a90: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6aa0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
6ab0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
6ac0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
6ad0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
6ae0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
6af0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
6b00: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
6b10: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
6b20: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
6b30: 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 ngObj(servername
6b40: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e , (Tcl_Size) len
6b50: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c ));.. /* Eval
6b60: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
6b70: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
6b80: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
6b90: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 );. if ((code
6ba0: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 = EvalCallback(
6bb0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
6bc0: 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 , cmdPtr)) > 1)
6bd0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 {..res = SSL_CLI
6be0: 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b ENT_HELLO_RETRY;
6bf0: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 ..*alert = SSL_R
6c00: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 _TLSV1_ALERT_USE
6c10: 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 R_CANCELLED;.
6c20: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 } else if (code
6c30: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 == 1) {..res =
6c40: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
6c50: 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 _SUCCESS;. }
6c60: 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 else {..res = SS
6c70: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
6c80: 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 RROR;..*alert =
6c90: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
6ca0: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 T_INTERNAL_ERROR
6cb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
6cc0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
6cd0: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
6ce0: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a res;.}.../*****
6cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
6d00: 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 ./* Commands
6d10: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a */./*******
6d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
6d30: 2f 2a 0a 20 2a 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 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
6d80: 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 iphersObjCmd --
6d90: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 list available c
6da0: 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 iphers. *. *.Thi
6db0: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
6dc0: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
6dd0: 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 s the "tls::ciph
6de0: 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 ers" command. *.
6df0: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c to list availabl
6e00: 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 e ciphers, based
6e10: 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 upon protocol s
6e20: 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 elected.. *. * R
6e30: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
6e40: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
6e50: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 list.. *. * Sid
6e60: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f e effects:. *.co
6e70: 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 nstructs and des
6e80: 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 troys SSL contex
6e90: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d t (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 2d 2d 2d ----------------
6ee0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 . */.static cons
6ef0: 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c t char *protocol
6f00: 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c s[] = {.."ssl2",
6f10: 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c "ssl3", "tls1",
6f20: 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 "tls1.1", "tls1
6f30: 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e .2", "tls1.3", N
6f40: 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 ULL.};.enum prot
6f50: 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 ocol {. TLS_S
6f60: 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 SL2, TLS_SSL3, T
6f70: 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 LS_TLS1, TLS_TLS
6f80: 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 1_1, TLS_TLS1_2,
6f90: 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 TLS_TLS1_3, TLS
6fa0: 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 _NONE.};..static
6fb0: 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 int.CiphersObjC
6fc0: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
6fd0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
6fe0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
6ff0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
7000: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
7010: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
7020: 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 jPtr = NULL;.
7030: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 SSL_CTX *ctx =
7040: 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 NULL;. SSL *s
7050: 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 sl = NULL;. S
7060: 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 TACK_OF(SSL_CIPH
7070: 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 ER) *sk;. cha
7080: 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 r buf[BUFSIZ];.
7090: 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 int index, ve
70a0: 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 rbose = 0, use_s
70b0: 75 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 upported = 0;.
70c0: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 const SSL_METH
70d0: 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 20 20 20 20 OD *method;.
70e0: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 (void) clientDat
70f0: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 a;.. dprintf(
7100: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
7110: 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c if ((objc < 2) |
7120: 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a | (objc > 4)) {.
7130: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
7140: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
7150: 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 v, "protocol ?ve
7160: 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 rbose? ?supporte
7170: 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 d?");..return TC
7180: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
7190: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e if (Tcl_GetIn
71a0: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
71b0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 p, objv[1], prot
71c0: 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c ocols, "protocol
71d0: 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d ", 0, &index) !=
71e0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
71f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7200: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a }. if ((obj
7210: 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 c > 2) && Tcl_Ge
7220: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 tBooleanFromObj(
7230: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c interp, objv[2],
7240: 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 &verbose) != TC
7250: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
7260: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7270: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e . if ((objc >
7280: 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 3) && Tcl_GetBo
7290: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 oleanFromObj(int
72a0: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 erp, objv[3], &u
72b0: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d se_supported) !=
72c0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
72d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
72e0: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
72f0: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
7300: 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 switch ((enum p
7310: 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b rotocol)index) {
7320: 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a ..case TLS_SSL2:
7330: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
7340: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 SION_NUMBER >= 0
7350: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 x10100000L || de
7360: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c fined(NO_SSL2) |
7370: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
7380: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 L_NO_SSL2)..
7390: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
73a0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
73b0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
73c0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
73d0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
73e0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
73f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
7400: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 lse.. method
7410: 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 = SSLv2_method()
7420: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
7430: 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a .case TLS_SSL3:.
7440: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 #if defined(NO_S
7450: 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 SL3) || defined(
7460: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
7470: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7480: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 SSL_NO_SSL3_METH
7490: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 OD).. Tcl_App
74a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
74b0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
74c0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
74d0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
74e0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
74f0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
7500: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
7510: 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 method = SSLv3
7520: 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b _method(); break
7530: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 ;.#endif..case T
7540: 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 LS_TLS1:.#if def
7550: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c ined(NO_TLS1) ||
7560: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
7570: 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 _NO_TLS1) || def
7580: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
7590: 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 TLS1_METHOD)..
75a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
75b0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f lt(interp, proto
75c0: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 cols[index], ":
75d0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
75e0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
75f0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 ) NULL);.. re
7600: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7610: 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f #else.. metho
7620: 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 d = TLSv1_method
7630: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 (); break;.#endi
7640: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
7650: 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _1:.#if defined(
7660: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
7670: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7680: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
7690: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
76a0: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 LS1_1_METHOD)..
76b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
76c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
76d0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
76e0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
76f0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
7700: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 *) NULL);.. r
7710: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7720: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
7730: 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 od = TLSv1_1_met
7740: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 hod(); break;.#e
7750: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
7760: 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e LS1_2:.#if defin
7770: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c ed(NO_TLS1_2) ||
7780: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
7790: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 _NO_TLS1_2) || d
77a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
77b0: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 O_TLS1_2_METHOD)
77c0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
77d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
77e0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
77f0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
7800: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
7810: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
7820: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
7830: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
7840: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f ethod = TLSv1_2_
7850: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b method(); break;
7860: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c .#endif..case TL
7870: 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 S_TLS1_3:.#if de
7880: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
7890: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
78a0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 SSL_NO_TLS1_3)..
78b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
78c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
78d0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
78e0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
78f0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
7900: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
7910: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7920: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 ;.#else.. met
7930: 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 hod = TLS_method
7940: 28 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 ();.. SSL_CTX
7950: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 _set_min_proto_v
7960: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
7970: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 _3_VERSION);..
7980: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 SSL_CTX_set_ma
7990: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 x_proto_version(
79a0: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 ctx, TLS1_3_VERS
79b0: 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b ION);.. break
79c0: 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c ;.#endif..defaul
79d0: 74 3a 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d t:.. method =
79e0: 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 TLS_method();..
79f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
7a00: 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f .. ctx = SSL_
7a10: 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b CTX_new(method);
7a20: 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 . if (ctx ==
7a30: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
7a40: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
7a50: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
7a60: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
7a70: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
7a80: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
7a90: 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 ssl = SSL_new(
7aa0: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 ctx);. if (ss
7ab0: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 l == NULL) {..Tc
7ac0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
7ad0: 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 nterp, GET_ERR_R
7ae0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
7af0: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 ) NULL);..SSL_CT
7b00: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
7b10: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7b20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 }.. /* Us
7b30: 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72 e list and order
7b40: 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e as would be sen
7b50: 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c t in a ClientHel
7b60: 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 lo or all availa
7b70: 62 6c 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 ble ciphers */.
7b80: 20 20 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f if (use_suppo
7b90: 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 rted) {..sk = SS
7ba0: 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64 L_get1_supported
7bb0: 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 _ciphers(ssl);.
7bc0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 } else {..sk
7bd0: 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 = SSL_get_cipher
7be0: 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 s(ssl);. }..
7bf0: 20 20 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c if (sk != NUL
7c00: 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f L) {..if (!verbo
7c10: 73 65 29 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 se) {.. const
7c20: 20 63 68 61 72 20 2a 63 70 3b 0a 09 20 20 20 20 char *cp;..
7c30: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
7c40: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
7c50: 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 ;.. for (int
7c60: 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 i = 0; i < sk_SS
7c70: 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 L_CIPHER_num(sk)
7c80: 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 ; i++) {...const
7c90: 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d SSL_CIPHER *c =
7ca0: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 sk_SSL_CIPHER_v
7cb0: 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 alue(sk, i);...i
7cc0: 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f f (c == NULL) co
7cd0: 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 ntinue;..../* ci
7ce0: 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f pher name or (NO
7cf0: 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 NE) */...cp = SS
7d00: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d L_CIPHER_get_nam
7d10: 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d e(c);...if (cp =
7d20: 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 = NULL) break;..
7d30: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
7d40: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
7d50: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
7d60: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 wStringObj((char
7d70: 20 2a 29 20 63 70 2c 20 2d 31 29 29 3b 0a 09 20 *) cp, -1));..
7d80: 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a }...} else {.
7d90: 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 . objPtr = Tc
7da0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
7db0: 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 ",0);.. for (
7dc0: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 int i = 0; i < s
7dd0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d k_SSL_CIPHER_num
7de0: 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 (sk); i++) {...c
7df0: 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 onst SSL_CIPHER
7e00: 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 *c = sk_SSL_CIPH
7e10: 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b ER_value(sk, i);
7e20: 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c ...if (c == NULL
7e30: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f ) continue;..../
7e40: 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 * textual descri
7e50: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 ption of the cip
7e60: 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c her */...if (SSL
7e70: 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 _CIPHER_descript
7e80: 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 ion(c, buf, size
7e90: 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c of(buf)) != NULL
7ea0: 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 ) {... Tcl_Ap
7eb0: 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 pendToObj(objPtr
7ec0: 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 , buf, (Tcl_Size
7ed0: 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a ) strlen(buf));.
7ee0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 ..} else {...
7ef0: 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a Tcl_AppendToObj
7f00: 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 (objPtr, "UNKNOW
7f10: 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 N\n", 8);...}..
7f20: 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 }..}..if (use
7f30: 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 _supported) {..
7f40: 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 sk_SSL_CIPHER
7f50: 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 _free(sk);..}.
7f60: 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 }. SSL_free
7f70: 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 (ssl);. SSL_C
7f80: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 TX_free(ctx);..
7f90: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
7fa0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ult(interp, objP
7fb0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
7fc0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 TCL_OK;.}.../*.
7fd0: 2a 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 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f ----. *. * Proto
8020: 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 colsObjCmd -- li
8030: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f st available pro
8040: 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 tocols. *. *.Thi
8050: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
8060: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
8070: 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 s the "tls::prot
8080: 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 ocols" command.
8090: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 *.to list availa
80a0: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 ble protocols..
80b0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
80c0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
80d0: 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a result list.. *.
80e0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
80f0: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 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 2d 2d ----------------
8140: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
8150: 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 .ProtocolsObjCmd
8160: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
8170: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
8180: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
8190: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
81a0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
81b0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
81c0: 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 tr;. (void) c
81d0: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 lientData;..
81e0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
81f0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
8200: 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 != 1) {..Tcl_Wr
8210: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
8220: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b p, 1, objv, "");
8230: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
8240: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 OR;. }.. E
8250: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
8260: 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 ;.. objPtr =
8270: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
8280: 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 , NULL);..#if OP
8290: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
82a0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
82b0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
82c0: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
82d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
82e0: 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 SL2). Tcl_Lis
82f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
8300: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
8310: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
8320: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
8330: 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 _SSL2], -1));.#e
8340: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
8350: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 d(NO_SSL3) && !d
8360: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
8370: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
8380: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
8390: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 SL3_METHOD).
83a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
83b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
83c0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
83d0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 StringObj(protoc
83e0: 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d ols[TLS_SSL3], -
83f0: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
8400: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
8410: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
8420: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 ENSSL_NO_TLS1) &
8430: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
8440: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
8450: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f D). Tcl_ListO
8460: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
8470: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
8480: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
8490: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 (protocols[TLS_T
84a0: 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 LS1], -1));.#end
84b0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
84c0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
84d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
84e0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
84f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8500: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a _TLS1_1_METHOD).
8510: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
8520: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
8530: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
8540: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
8550: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
8560: 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 _1], -1));.#endi
8570: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
8580: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
8590: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
85a0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
85b0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
85c0: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 TLS1_2_METHOD).
85d0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
85e0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
85f0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
8600: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
8610: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f tocols[TLS_TLS1_
8620: 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 2], -1));.#endif
8630: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
8640: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 _TLS1_3) && !def
8650: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8660: 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f TLS1_3). Tcl_
8670: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
8680: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
8690: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
86a0: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
86b0: 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 TLS_TLS1_3], -1)
86c0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 );.#endif.. T
86d0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
86e0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
86f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
8700: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
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 2d 2d 2d ----------------
8750: 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 . *. * Handshake
8760: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
8770: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 This command is
8780: 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 used to verify w
8790: 68 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 hether the hands
87a0: 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 hake is complete
87b0: 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 . *.or not.. *.
87c0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
87d0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
87e0: 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e ult. 1 means han
87f0: 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c dshake complete,
8800: 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 0 means pending
8810: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
8820: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 ects:. *.May for
8830: 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 ce SSL negotiati
8840: 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 on to take place
8850: 2e 0a 20 2a 0a 20 2a 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 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
88a0: 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68 tatic int Handsh
88b0: 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 akeObjCmd(Client
88c0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
88d0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
88e0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
88f0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
8900: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
8910: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 Channel chan;
8920: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e /* The chan
8930: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 nel to set a mod
8940: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 e on. */. Sta
8950: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20 te *statePtr;
8960: 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 /* client s
8970: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 tate for ssl soc
8980: 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 ket */. const
8990: 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20 char *errStr =
89a0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 NULL;. int re
89b0: 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 t = 1;. int e
89c0: 72 72 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 rr = 0;. (voi
89d0: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a d) clientData;..
89e0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
89f0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
8a00: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 objc != 2) {..Tc
8a10: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
8a20: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
8a30: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 "channel");..ret
8a40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
8a50: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
8a60: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
8a70: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
8a80: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
8a90: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
8aa0: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 jv[1]), NULL);.
8ab0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
8ac0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
8ad0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
8ae0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
8af0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
8b00: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
8b10: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
8b20: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
8b30: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
8b40: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 l(chan);. if
8b50: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
8b60: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
8b70: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
8b80: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
8b90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
8ba0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
8bb0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
8bc0: 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 (chan),.. "\"
8bd0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
8be0: 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e nel", (char *) N
8bf0: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 ULL);..Tcl_SetEr
8c00: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
8c10: 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b "TLS", "HANDSHAK
8c20: 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 E", "CHANNEL", "
8c30: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
8c40: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
8c50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
8c60: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 }. statePtr
8c70: 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 = (State *)Tcl_G
8c80: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 etChannelInstanc
8c90: 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 eData(chan);..
8ca0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 dprintf("Calli
8cb0: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f ng Tls_WaitForCo
8cc0: 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 nnect");. ret
8cd0: 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f = Tls_WaitForCo
8ce0: 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 nnect(statePtr,
8cf0: 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 &err, 1);. dp
8d00: 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 rintf("Tls_WaitF
8d10: 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e orConnect return
8d20: 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a ed: %i", ret);..
8d30: 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 if (ret < 0
8d40: 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 && ((statePtr->f
8d50: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 lags & TLS_TCL_A
8d60: 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d SYNC) && (err ==
8d70: 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 EAGAIN))) {..dp
8d80: 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 rintf("Async set
8d90: 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 and err = EAGAI
8da0: 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 N");..ret = 0;.
8db0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 } else if (re
8dc0: 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 t < 0) {..long r
8dd0: 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d esult;..errStr =
8de0: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a statePtr->err;.
8df0: 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 .Tcl_ResetResult
8e00: 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 (interp);..Tcl_S
8e10: 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 etErrno(err);...
8e20: 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 if (!errStr || (
8e30: 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b *errStr == 0)) {
8e40: 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 .. errStr = T
8e50: 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e cl_PosixError(in
8e60: 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f terp);..}...Tcl_
8e70: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
8e80: 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 erp, "handshake
8e90: 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 failed: ", errSt
8ea0: 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c r, (char *) NULL
8eb0: 29 3b 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20 );..if ((result
8ec0: 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 = SSL_get_verify
8ed0: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 _result(statePtr
8ee0: 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f ->ssl)) != X509_
8ef0: 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c V_OK) {.. Tcl
8f00: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
8f10: 74 65 72 70 2c 20 22 20 64 75 65 20 74 6f 20 5c terp, " due to \
8f20: 22 22 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f "", X509_verify_
8f30: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e cert_error_strin
8f40: 67 28 72 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c g(result), "\"",
8f50: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
8f60: 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f ..}..Tcl_SetErro
8f70: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
8f80: 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 LS", "HANDSHAKE"
8f90: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
8fa0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 r *) NULL);..dpr
8fb0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 intf("Returning
8fc0: 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 TCL_ERROR with h
8fd0: 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a andshake failed:
8fe0: 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 %s", errStr);..
8ff0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
9000: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
9010: 69 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a if (err != 0) {.
9020: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f . dprintf("Go
9030: 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 t an error with
9040: 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 a completed hand
9050: 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 shake: err = %i"
9060: 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 , err);..}..ret
9070: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 = 1;. }..
9080: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
9090: 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 ng TCL_OK with d
90a0: 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 ata \"%i\"", ret
90b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 );. Tcl_SetOb
90c0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
90d0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 Tcl_NewIntObj(re
90e0: 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 t));. return
90f0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a TCL_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: 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 ---. *. * Import
9150: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
9160: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
9170: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
9180: 63 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 cess the "ssl" c
9190: 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 ommand. *. *.The
91a0: 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 ssl command pus
91b0: 68 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 hes SSL over a (
91c0: 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 newly connected)
91d0: 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 tcp socket. *.
91e0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
91f0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
9200: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
9210: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
9220: 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 modify the behav
9230: 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 ior of an IO cha
9240: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nnel.. *. *-----
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 2d 2d 2d 0a 20 --------------.
9290: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d */.static int.Im
92a0: 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e portObjCmd(Clien
92b0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
92c0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
92d0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
92e0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
92f0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
9300: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 _Channel chan;..
9310: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 /* The channel t
9320: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e o set a mode on.
9330: 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 */. State *s
9340: 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 tatePtr;../* cli
9350: 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 ent state for ss
9360: 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 l socket */.
9370: 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 SSL_CTX *ctx..=
9380: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
9390: 6a 20 2a 73 63 72 69 70 74 09 09 3d 20 4e 55 4c j *script..= NUL
93a0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a L;. Tcl_Obj *
93b0: 70 61 73 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c password..= NULL
93c0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 ;. Tcl_Obj *v
93d0: 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 cmd..= NULL;.
93e0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 Tcl_DString upp
93f0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
9400: 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e tion, upperChann
9410: 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 elBlocking, uppe
9420: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
9430: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f , upperChannelEO
9440: 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 FChar;. int i
9450: 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 dx;. Tcl_Size
9460: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c len;. int fl
9470: 61 67 73 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f ags...= TLS_TCL_
9480: 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 INIT;. int se
9490: 72 76 65 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 rver...= 0;./* i
94a0: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 s connection inc
94b0: 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e oming or outgoin
94c0: 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a g? */. char *
94d0: 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b keyfile..= NULL;
94e0: 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 . char *certf
94f0: 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ile..= NULL;.
9500: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
9510: 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 key..= NULL;.
9520: 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 Tcl_Size key_le
9530: 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 n..= 0;. unsi
9540: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 09 gned char *cert.
9550: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c .= NULL;. Tcl
9560: 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 _Size cert_len..
9570: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 = 0;. char *c
9580: 69 70 68 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a iphers..= NULL;.
9590: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 char *cipher
95a0: 73 75 69 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a suites..= NULL;.
95b0: 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 char *CAfile
95c0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 ..= NULL;. ch
95d0: 61 72 20 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 ar *CApath..= NU
95e0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 LL;. char *CA
95f0: 73 74 6f 72 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 store..= NULL;.
9600: 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d char *DHparam
9610: 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 s..= NULL;. c
9620: 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 3d 20 4e har *model...= N
9630: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 ULL;. char *s
9640: 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e 55 4c ervername..= NUL
9650: 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 L;./* hostname f
9660: 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 or Server Name I
9670: 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 ndication */.
9680: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 char *session_i
9690: 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 d..= NULL;. T
96a0: 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 cl_Obj *alpn..=
96b0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 NULL;. int ss
96c0: 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 l2 = 0, ssl3 = 0
96d0: 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d ;. int tls1 =
96e0: 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 1, tls1_1 = 1,
96f0: 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 tls1_2 = 1, tls1
9700: 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 _3 = 1;. int
9710: 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c proto = 0, level
9720: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 = -1;. int v
9730: 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 erify = 0, requi
9740: 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 re = 0, request
9750: 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 = 1, post_handsh
9760: 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f ake = 0;. (vo
9770: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a id) clientData;.
9780: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
9790: 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 lled");..#if def
97a0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c ined(NO_TLS1) ||
97b0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
97c0: 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c _NO_TLS1). tl
97d0: 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 s1 = 0;.#endif.#
97e0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
97f0: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
9800: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
9810: 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d _1). tls1_1 =
9820: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 0;.#endif.#if d
9830: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
9840: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
9850: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a NSSL_NO_TLS1_2).
9860: 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a tls1_2 = 0;.
9870: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
9880: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c ed(NO_TLS1_3) ||
9890: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
98a0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
98b0: 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 tls1_3 = 0;.#end
98c0: 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 if.. if (objc
98d0: 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f < 2) {..Tcl_Wro
98e0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
98f0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
9900: 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b nel ?options?");
9910: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
9920: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 OR;. }.. E
9930: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
9940: 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 ;.. chan = Tc
9950: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
9960: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 erp, Tcl_GetStri
9970: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c ng(objv[1]), NUL
9980: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e L);. if (chan
9990: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
99a0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
99b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
99c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 }.. /* Make
99d0: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
99e0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
99f0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
9a00: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
9a10: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 hannel(chan);..
9a20: 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b for (idx = 2;
9a30: 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 idx < objc; idx
9a40: 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 ++) {..char *opt
9a50: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
9a60: 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a 0a 09 69 (objv[idx]);...i
9a70: 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 f (opt[0] != '-'
9a80: 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ).. break;...
9a90: 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 OPTOBJ("-alpn",
9aa0: 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 alpn);..OPTSTR("
9ab0: 2d 63 61 64 69 72 22 2c 20 43 41 70 61 74 68 29 -cadir", CApath)
9ac0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 69 ;..OPTSTR("-cafi
9ad0: 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f le", CAfile);..O
9ae0: 50 54 53 54 52 28 22 2d 63 61 73 74 6f 72 65 22 PTSTR("-castore"
9af0: 2c 20 43 41 73 74 6f 72 65 29 3b 0a 09 4f 50 54 , CAstore);..OPT
9b00: 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65 BYTE("-cert", ce
9b10: 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 rt, cert_len);..
9b20: 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 69 6c OPTSTR("-certfil
9b30: 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 e", certfile);..
9b40: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 22 OPTSTR("-cipher"
9b50: 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 , ciphers);..OPT
9b60: 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c 20 STR("-ciphers",
9b70: 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 ciphers);..OPTST
9b80: 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 65 73 R("-ciphersuites
9b90: 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29 ", ciphersuites)
9ba0: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d ;..OPTOBJ("-comm
9bb0: 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 and", script);..
9bc0: 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 61 6d OPTSTR("-dhparam
9bd0: 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 s", DHparams);..
9be0: 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 OPTBYTE("-key",
9bf0: 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 key, key_len);..
9c00: 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 OPTSTR("-keyfile
9c10: 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 ", keyfile);..OP
9c20: 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d TSTR("-model", m
9c30: 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 odel);..OPTOBJ("
9c40: 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73 73 -password", pass
9c50: 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 word);..OPTBOOL(
9c60: 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 "-post_handshake
9c70: 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b ", post_handshak
9c80: 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 e);..OPTBOOL("-r
9c90: 65 71 75 65 73 74 22 2c 20 72 65 71 75 65 73 74 equest", request
9ca0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 );..OPTBOOL("-re
9cb0: 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 29 quire", require)
9cc0: 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 ;..OPTINT("-secu
9cd0: 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 6c 65 76 rity_level", lev
9ce0: 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d el);..OPTBOOL("-
9cf0: 73 65 72 76 65 72 22 2c 20 73 65 72 76 65 72 29 server", server)
9d00: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76 ;..OPTSTR("-serv
9d10: 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e ername", servern
9d20: 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ame);..OPTSTR("-
9d30: 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 session_id", ses
9d40: 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f sion_id);..OPTBO
9d50: 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 OL("-ssl2", ssl2
9d60: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 );..OPTBOOL("-ss
9d70: 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 l3", ssl3);..OPT
9d80: 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c BOOL("-tls1", tl
9d90: 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d s1);..OPTBOOL("-
9da0: 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 tls1.1", tls1_1)
9db0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
9dc0: 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 1.2", tls1_2);..
9dd0: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 OPTBOOL("-tls1.3
9de0: 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 ", tls1_3);..OPT
9df0: 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 63 6f OBJ("-validateco
9e00: 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 mmand", vcmd);..
9e10: 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 OPTOBJ("-vcmd",
9e20: 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 vcmd);...OPTBAD(
9e30: 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e "option", "-alpn
9e40: 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c , -cadir, -cafil
9e50: 65 2c 20 2d 63 61 73 74 6f 72 65 2c 20 2d 63 65 e, -castore, -ce
9e60: 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d rt, -certfile, -
9e70: 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 cipher, -ciphers
9e80: 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c uites, -command,
9e90: 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 -dhparams, -key
9ea0: 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 , -keyfile, -mod
9eb0: 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d el, -password, -
9ec0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 post_handshake,
9ed0: 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69 -request, -requi
9ee0: 72 65 2c 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 re, -security_le
9ef0: 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 vel, -server, -s
9f00: 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 ervername, -sess
9f10: 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d ion_id, -ssl2, -
9f20: 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c ssl3, -tls1, -tl
9f30: 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d s1.1, -tls1.2, -
9f40: 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 tls1.3, or -vali
9f50: 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a datecommand");..
9f60: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
9f70: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
9f80: 28 72 65 71 75 65 73 74 29 09 09 76 65 72 69 66 (request)..verif
9f90: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
9fa0: 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 CLIENT_ONCE | SS
9fb0: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 L_VERIFY_PEER;.
9fc0: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 if (request &
9fd0: 26 20 72 65 71 75 69 72 65 29 09 76 65 72 69 66 & require).verif
9fe0: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
9ff0: 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f FAIL_IF_NO_PEER_
a000: 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 CERT;. if (re
a010: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 quest && post_ha
a020: 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 ndshake).verify
a030: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f |= SSL_VERIFY_PO
a040: 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 ST_HANDSHAKE;.
a050: 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 if (verify ==
a060: 30 29 09 09 76 65 72 69 66 79 20 3d 20 53 53 4c 0)..verify = SSL
a070: 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 _VERIFY_NONE;..
a080: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c proto |= (ssl
a090: 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 2 ? TLS_PROTO_SS
a0a0: 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f L2 : 0);. pro
a0b0: 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c to |= (ssl3 ? TL
a0c0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 S_PROTO_SSL3 : 0
a0d0: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 );. proto |=
a0e0: 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 (tls1 ? TLS_PROT
a0f0: 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 O_TLS1 : 0);.
a100: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f proto |= (tls1_
a110: 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 1 ? TLS_PROTO_TL
a120: 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 S1_1 : 0);. p
a130: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 roto |= (tls1_2
a140: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 ? TLS_PROTO_TLS1
a150: 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f _2 : 0);. pro
a160: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 to |= (tls1_3 ?
a170: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
a180: 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 : 0);.. /* r
a190: 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 eset to NULL if
a1a0: 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f blank string pro
a1b0: 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 vided */. if
a1c0: 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 (cert && !*cert)
a1d0: 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20 .. cert.
a1e0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a1f0: 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a if (key && !*
a200: 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 key).. ke
a210: 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c y. = NULL
a220: 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 ;. if (certfi
a230: 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 le && !*certfile
a240: 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69 ) certfi
a250: 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 le.= NULL;. i
a260: 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a f (keyfile && !*
a270: 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c keyfile)..keyfil
a280: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c e. = NULL
a290: 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 ;. if (cipher
a2a0: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 s && !*ciphers).
a2b0: 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09 ciphers.
a2c0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
a2d0: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75 if (ciphersu
a2e0: 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 ites && !*cipher
a2f0: 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75 suites) ciphersu
a300: 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a ites = NULL;.
a310: 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 if (CAfile &
a320: 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 & !*CAfile).
a330: 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 CAfile.
a340: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
a350: 66 20 28 43 41 70 61 74 68 20 26 26 20 21 2a 43 f (CApath && !*C
a360: 41 70 61 74 68 29 09 20 20 20 20 20 20 20 20 43 Apath). C
a370: 41 70 61 74 68 09 20 20 20 20 20 20 20 20 3d 20 Apath. =
a380: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 NULL;. if (CA
a390: 73 74 6f 72 65 20 26 26 20 21 2a 43 41 73 74 6f store && !*CAsto
a3a0: 72 65 29 09 20 20 20 20 20 20 20 20 43 41 73 74 re). CAst
a3b0: 6f 72 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ore. = NU
a3c0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61 LL;. if (DHpa
a3d0: 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61 rams && !*DHpara
a3e0: 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70 61 ms). DHpa
a3f0: 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55 rams = NU
a400: 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 LL;.. /* new
a410: 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 SSL state */.
a420: 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 74 statePtr..= (St
a430: 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 ate *) ckalloc((
a440: 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 unsigned) sizeof
a450: 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 (State));. me
a460: 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 mset(statePtr, 0
a470: 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 , sizeof(State))
a480: 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d ;.. statePtr-
a490: 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a >flags.= flags;.
a4a0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e statePtr->in
a4b0: 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 terp.= interp;.
a4c0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c statePtr->vfl
a4d0: 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 ags.= verify;.
a4e0: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09 statePtr->err.
a4f0: 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c = "";.. /* al
a500: 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f locate script */
a510: 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29 . if (script)
a520: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 {..(void) Tcl_G
a530: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
a540: 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 script, &len);..
a550: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 if (len) {..
a560: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
a570: 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 ck = script;..
a580: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
a590: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c nt(statePtr->cal
a5a0: 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d lback);..}. }
a5b0: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 .. /* allocat
a5c0: 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 e password */.
a5d0: 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20 if (password)
a5e0: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 {..(void) Tcl_Ge
a5f0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 tStringFromObj(p
a600: 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a assword, &len);.
a610: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 .if (len) {..
a620: 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 statePtr->passw
a630: 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a ord = password;.
a640: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
a650: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
a660: 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 password);..}.
a670: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f }.. /* allo
a680: 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 6f cate validate co
a690: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 mmand */. if
a6a0: 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 (vcmd) {..(void)
a6b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
a6c0: 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e omObj(vcmd, &len
a6d0: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
a6e0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 63 statePtr->vc
a6f0: 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 md = vcmd;..
a700: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
a710: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
a720: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
a730: 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c if (model != NUL
a740: 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a L) {..int mode;.
a750: 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 ./* Get the "mod
a760: 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 el" context */..
a770: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
a780: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f annel(interp, mo
a790: 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 del, &mode);..if
a7a0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
a7b0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
a7c0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 . Tls_Free((t
a7d0: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 ls_free_type *)
a7e0: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
a7f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a800: 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 ;..}.../*.. * Ma
a810: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
a820: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
a830: 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 t channel.. */..
a840: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
a850: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
a860: 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e .if (Tcl_GetChan
a870: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
a880: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
a890: 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 ()) {.. Tcl_A
a8a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
a8b0: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
a8c0: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
a8d0: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
a8e0: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 .."\": not a TLS
a8f0: 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 channel", (char
a900: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
a910: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
a920: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
a930: 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e "IMPORT", "CHANN
a940: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 EL", "INVALID",
a950: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
a960: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 . Tls_Free((t
a970: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 ls_free_type *)
a980: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
a990: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a9a0: 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 ;..}..ctx = ((St
a9b0: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 ate *)Tcl_GetCha
a9c0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
a9d0: 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 (chan))->ctx;.
a9e0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 } else {..if (
a9f0: 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 (ctx = CTX_Init(
aa00: 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 statePtr, server
aa10: 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 , proto, keyfile
aa20: 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c , certfile, key,
aa30: 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a cert, key_len,.
aa40: 09 20 20 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 . cert_len, C
aa50: 41 70 61 74 68 2c 20 43 41 73 74 6f 72 65 2c 20 Apath, CAstore,
aa60: 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c CAfile, ciphers,
aa70: 20 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c ciphersuites, l
aa80: 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 evel, DHparams))
aa90: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 == NULL) {..
aaa0: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 Tls_Free((tls_f
aab0: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 ree_type *) stat
aac0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
aad0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
aae0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 . }.. stat
aaf0: 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b ePtr->ctx = ctx;
ab00: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
ab10: 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 We need to make
ab20: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 68 sure that the ch
ab30: 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 annel works in b
ab40: 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 inary (for the.
ab50: 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e * encryption
ab60: 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 not to get goof
ab70: 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 2f 0a ed up).. */.
ab80: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
ab90: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
aba0: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 lTranslation);.
abb0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
abc0: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
abd0: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 Blocking);. T
abe0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
abf0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
ac00: 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 har);. Tcl_DS
ac10: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
ac20: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
ac30: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 ;. Tcl_GetCha
ac40: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
ac50: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 p, chan, "-eofch
ac60: 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e ar", &upperChann
ac70: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 elEOFChar);.
ac80: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
ac90: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
aca0: 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 n, "-encoding",
acb0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 &upperChannelEnc
acc0: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f oding);. Tcl_
acd0: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
ace0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
acf0: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 -translation", &
ad00: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
ad10: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 slation);. Tc
ad20: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_GetChannelOpti
ad30: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
ad40: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 "-blocking", &u
ad50: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
ad60: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ing);. Tcl_Se
ad70: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
ad80: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 nterp, chan, "-t
ad90: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 ranslation", "bi
ada0: 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f nary");. Tcl_
adb0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
adc0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
add0: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 -blocking", "tru
ade0: 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 e");. dprintf
adf0: 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 ("Consuming Tcl
ae00: 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c channel %s", Tcl
ae10: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
ae20: 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 chan));. stat
ae30: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c ePtr->self = Tcl
ae40: 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e _StackChannel(in
ae50: 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 terp, Tls_Channe
ae60: 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 lType(), (Client
ae70: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 0a Data) statePtr,.
ae80: 09 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c .(TCL_READABLE |
ae90: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 TCL_WRITABLE),
aea0: 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e chan);. dprin
aeb0: 74 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e tf("Created chan
aec0: 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 nel named %s", T
aed0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
aee0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
aef0: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 ));. if (stat
af00: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 ePtr->self == (T
af10: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
af20: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 ) {../*.. * No u
af30: 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 se of Tcl_Eventu
af40: 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 allyFree because
af50: 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c no possible Tcl
af60: 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a _Preserve... */.
af70: 09 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 .Tls_Free((tls_f
af80: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 ree_type *) stat
af90: 65 50 74 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72 ePtr);..Tcl_DStr
afa0: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 ingFree(&upperCh
afb0: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
afc0: 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 );..Tcl_DStringF
afd0: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 ree(&upperChanne
afe0: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 09 54 63 6c lEncoding);..Tcl
aff0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 _DStringFree(&up
b000: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 perChannelEOFCha
b010: 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 r);..Tcl_DString
b020: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e Free(&upperChann
b030: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 09 72 65 elBlocking);..re
b040: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
b050: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 }.. Tcl_S
b060: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
b070: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
b080: 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c ->self, "-transl
b090: 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 ation", Tcl_DStr
b0a0: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 ingValue(&upperC
b0b0: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
b0c0: 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 n));. Tcl_Set
b0d0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
b0e0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e terp, statePtr->
b0f0: 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 self, "-encoding
b100: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 ", Tcl_DStringVa
b110: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 lue(&upperChanne
b120: 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 lEncoding));.
b130: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
b140: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 ption(interp, st
b150: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d atePtr->self, "-
b160: 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 eofchar", Tcl_DS
b170: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 tringValue(&uppe
b180: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
b190: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
b1a0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
b1b0: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
b1c0: 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c lf, "-blocking",
b1d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 Tcl_DStringValu
b1e0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 e(&upperChannelB
b1f0: 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 locking));. T
b200: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
b210: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
b220: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 slation);. Tc
b230: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 l_DStringFree(&u
b240: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
b250: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ing);. Tcl_DS
b260: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
b270: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
b280: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
b290: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e Free(&upperChann
b2a0: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 elBlocking);..
b2b0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 /*. * SSL
b2c0: 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 Initialization.
b2d0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 */. state
b2e0: 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e Ptr->ssl = SSL_n
b2f0: 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ew(statePtr->ctx
b300: 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 );. if (!stat
b310: 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a ePtr->ssl) {../*
b320: 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 SSL library err
b330: 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e or */..Tcl_Appen
b340: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
b350: 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 "couldn't constr
b360: 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a uct ssl session:
b370: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 ", GET_ERR_REAS
b380: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
b390: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 ULL);.. Tcl_S
b3a0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
b3b0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
b3c0: 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 RT", "INIT", "FA
b3d0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
b3e0: 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 NULL);..Tls_Free
b3f0: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 ((tls_free_type
b400: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 *) statePtr);..r
b410: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
b420: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
b430: 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e et host server n
b440: 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 ame */. if (s
b450: 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a ervername) {../*
b460: 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65 72 Sets the server
b470: 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e name indication
b480: 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 (SNI) in Client
b490: 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 Hello extension
b4a0: 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 */../* Per RFC 6
b4b0: 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 066, hostname is
b4c0: 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 a ASCII encoded
b4d0: 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 string, though
b4e0: 52 46 43 20 34 33 36 36 20 73 61 79 73 20 55 54 RFC 4366 says UT
b4f0: 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 F-8. */..if (!SS
b500: 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 L_set_tlsext_hos
b510: 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d t_name(statePtr-
b520: 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 >ssl, servername
b530: 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a ) && require) {.
b540: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
b550: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
b560: 65 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e et SNI extension
b570: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f failed: ", GET_
b580: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
b590: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
b5a0: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
b5b0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
b5c0: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e ", "IMPORT", "SN
b5d0: 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 I", "FAILED", (c
b5e0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
b5f0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 Tls_Free((tls
b600: 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 _free_type *) st
b610: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
b620: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
b630: 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 .}.../* Set host
b640: 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 name for peer ce
b650: 72 74 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61 rtificate hostna
b660: 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 me verification
b670: 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 in clients...
b680: 44 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65 Don't use SSL_se
b690: 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74 t1_host since it
b6a0: 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 has limitations
b6b0: 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 . */..if (!SSL_a
b6c0: 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 dd1_host(statePt
b6d0: 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 r->ssl, serverna
b6e0: 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f me)) {.. Tcl_
b6f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
b700: 65 72 70 2c 20 22 53 65 74 20 44 4e 53 20 68 6f erp, "Set DNS ho
b710: 73 74 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20 22 stname failed: "
b720: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
b730: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
b740: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
b750: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
b760: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
b770: 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 ", "HOSTNAME", "
b780: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
b790: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c ) NULL);.. Tl
b7a0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 s_Free((tls_free
b7b0: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 _type *) statePt
b7c0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
b7d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
b7e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 }.. /* Resu
b7f0: 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f me session id */
b800: 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e . if (session
b810: 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 _id && strlen(se
b820: 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c ssion_id) <= SSL
b830: 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e _MAX_SID_CTX_LEN
b840: 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 GTH) {../* SSL_s
b850: 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a et_session() */.
b860: 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f .if (!SSL_SESSIO
b870: 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 N_set1_id_contex
b880: 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f t(SSL_get_sessio
b890: 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 n(statePtr->ssl)
b8a0: 2c 0a 09 09 28 63 6f 6e 73 74 20 75 6e 73 69 67 ,...(const unsig
b8b0: 6e 65 64 20 63 68 61 72 20 2a 29 20 73 65 73 73 ned char *) sess
b8c0: 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 ion_id, (unsigne
b8d0: 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 d int) strlen(se
b8e0: 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 ssion_id))) {..
b8f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
b900: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 ult(interp, "Res
b910: 75 6d 65 20 73 65 73 73 69 6f 6e 20 66 61 69 6c ume session fail
b920: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 ed: ", GET_ERR_R
b930: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
b940: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 ) NULL);.. Tc
b950: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
b960: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
b970: 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e MPORT", "SESSION
b980: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
b990: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b9a0: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f Tls_Free((tls_
b9b0: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 free_type *) sta
b9c0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
b9d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
b9e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
b9f0: 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 Enable Applicati
ba00: 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f on-Layer Protoco
ba10: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 l Negotiation. E
ba20: 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 xamples are: htt
ba30: 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 p/1.0,..http/1.1
ba40: 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 , h2, h3, ftp, i
ba50: 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d map, pop3, xmpp-
ba60: 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 client, xmpp-ser
ba70: 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 ver, mqtt, irc,
ba80: 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 etc. */. if (
ba90: 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 alpn) {../* Conv
baa0: 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69 ert a TCL list i
bab0: 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c nto a protocol-l
bac0: 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d ist in wire-form
bad0: 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 at */..unsigned
bae0: 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 char *protos, *p
baf0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 ;..unsigned int
bb00: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a protos_len = 0;.
bb10: 09 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 .Tcl_Size cnt, i
bb20: 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f ;..int j;..Tcl_O
bb30: 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 bj **list;...if
bb40: 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 (Tcl_ListObjGetE
bb50: 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 lements(interp,
bb60: 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 alpn, &cnt, &lis
bb70: 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a t) != TCL_OK) {.
bb80: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 . Tls_Free((t
bb90: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 ls_free_type *)
bba0: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
bbb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
bbc0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d ;..}.../* Determ
bbd0: 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 ine the memory r
bbe0: 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 equired for the
bbf0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f protocol-list */
bc00: 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 ..for (i = 0; i
bc10: 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 < cnt; i++) {..
bc20: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 Tcl_GetString
bc30: 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c FromObj(list[i],
bc40: 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 &len);.. if
bc50: 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 (len > 255) {...
bc60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
bc70: 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 (interp, "ALPN p
bc80: 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f rotocol names to
bc90: 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a o long", (char *
bca0: 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 ) NULL);...Tcl_S
bcb0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
bcc0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
bcd0: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 RT", "ALPN", "FA
bce0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
bcf0: 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 NULL);...Tls_Fre
bd00: 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 e((tls_free_type
bd10: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
bd20: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
bd30: 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 R;.. }.. p
bd40: 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b rotos_len += 1 +
bd50: 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a (int) len;..}..
bd60: 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f ./* Build the co
bd70: 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d mplete protocol-
bd80: 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 list */..protos
bd90: 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 = ckalloc(protos
bda0: 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f _len);../* proto
bdb0: 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 col-lists consis
bdc0: 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 t of 8-bit lengt
bdd0: 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 h-prefixed, byte
bde0: 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 strings */..for
bdf0: 20 28 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f (j = 0, p = pro
be00: 74 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b tos; j < cnt; j+
be10: 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a +) {.. char *
be20: 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 str = Tcl_GetStr
be30: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b ingFromObj(list[
be40: 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 j], &len);..
be50: 2a 70 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 *p++ = (unsigned
be60: 20 63 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20 char) len;..
be70: 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 memcpy(p, str,
be80: 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 (size_t) len);..
be90: 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d p += len;..}
bea0: 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c .../* SSL_set_al
beb0: 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 pn_protos makes
bec0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 a copy of the pr
bed0: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 otocol-list */..
bee0: 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 /* Note: This fu
bef0: 6e 63 74 69 6f 6e 20 72 65 76 65 72 73 65 73 20 nction reverses
bf00: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 the return value
bf10: 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 convention */..
bf20: 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e if (SSL_set_alpn
bf30: 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 _protos(statePtr
bf40: 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 ->ssl, protos, p
bf50: 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 rotos_len)) {..
bf60: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
bf70: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 ult(interp, "Set
bf80: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 ALPN protocols
bf90: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 failed: ", GET_E
bfa0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
bfb0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
bfc0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
bfd0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
bfe0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 , "IMPORT", "ALP
bff0: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 N", "FAILED", (c
c000: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
c010: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 Tls_Free((tls
c020: 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 _free_type *) st
c030: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b atePtr);.. ck
c040: 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 free(protos);..
c050: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
c060: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f ROR;..}.../* Sto
c070: 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 re protocols lis
c080: 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e t */..statePtr->
c090: 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b protos = protos;
c0a0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
c0b0: 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f os_len = protos_
c0c0: 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 len;. } else
c0d0: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f {..statePtr->pro
c0e0: 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 tos = NULL;..sta
c0f0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 tePtr->protos_le
c100: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 n = 0;. }..
c110: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 /*. * SSL
c120: 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a Callbacks. *
c130: 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 /. SSL_set_ap
c140: 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d p_data(statePtr-
c150: 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 >ssl, (void *)st
c160: 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e atePtr);./* poin
c170: 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a t back to us */.
c180: 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 SSL_set_veri
c190: 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c fy(statePtr->ssl
c1a0: 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 , verify, Verify
c1b0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 2f Callback);. /
c1c0: 2a 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 5f *SSL_set_verify_
c1d0: 64 65 70 74 68 28 53 53 4c 5f 73 65 74 5f 76 65 depth(SSL_set_ve
c1e0: 72 69 66 79 5f 64 65 70 74 68 2c 20 30 29 3b 2a rify_depth, 0);*
c1f0: 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e /. SSL_set_in
c200: 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 fo_callback(stat
c210: 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 ePtr->ssl, InfoC
c220: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f allback);.. /
c230: 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f * Callback for o
c240: 62 73 65 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f bserving protoco
c250: 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 l messages */.#i
c260: 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f fndef OPENSSL_NO
c270: 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f _SSL_TRACE. /
c280: 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 * void SSL_CTX_s
c290: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f et_msg_callback_
c2a0: 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 arg(statePtr->ct
c2b0: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 x, (void *)state
c2c0: 50 74 72 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 Ptr);. void S
c2d0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 SL_CTX_set_msg_c
c2e0: 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 allback(statePtr
c2f0: 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67 65 43 61 ->ctx, MessageCa
c300: 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 llback); */.
c310: 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c SSL_set_msg_call
c320: 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 back_arg(statePt
c330: 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 r->ssl, (void *)
c340: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 53 statePtr);. S
c350: 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 SL_set_msg_callb
c360: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ack(statePtr->ss
c370: 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 l, MessageCallba
c380: 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 ck);.#endif..
c390: 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 /* Create Tcl_C
c3a0: 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c hannel BIO Handl
c3b0: 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 er */. stateP
c3c0: 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f tr->p_bio.= BIO_
c3d0: 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 new_tcl(statePtr
c3e0: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a , BIO_NOCLOSE);.
c3f0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 statePtr->bi
c400: 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f o.= BIO_new(BIO_
c410: 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 f_ssl());.. i
c420: 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a f (server) {../*
c430: 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b Server callback
c440: 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 s */..SSL_CTX_se
c450: 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e t_tlsext_servern
c460: 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 ame_arg(statePtr
c470: 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 ->ctx, (void *)s
c480: 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 tatePtr);..SSL_C
c490: 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 TX_set_tlsext_se
c4a0: 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 rvername_callbac
c4b0: 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c k(statePtr->ctx,
c4c0: 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 SNICallback);..
c4d0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 SSL_CTX_set_clie
c4e0: 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 nt_hello_cb(stat
c4f0: 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f ePtr->ctx, Hello
c500: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 Callback, (void
c510: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 69 66 *)statePtr);..if
c520: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 (statePtr->prot
c530: 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 os != NULL) {..
c540: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 SSL_CTX_set_a
c550: 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 lpn_select_cb(st
c560: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 atePtr->ctx, ALP
c570: 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 NCallback, (void
c580: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 23 69 *)statePtr);.#i
c590: 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 fdef USE_NPN..
c5a0: 20 20 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 if (tls1_2 ==
c5b0: 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 0 && tls1_3 == 0
c5c0: 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 ) {...SSL_CTX_se
c5d0: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 t_next_protos_ad
c5e0: 76 65 72 74 69 73 65 64 5f 63 62 28 73 74 61 74 vertised_cb(stat
c5f0: 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 ePtr->ctx, NPNCa
c600: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
c610: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
c620: 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a }.#endif..}.../*
c630: 20 45 6e 61 62 6c 65 20 73 65 72 76 65 72 20 74 Enable server t
c640: 6f 20 73 65 6e 64 20 63 65 72 74 20 72 65 71 75 o send cert requ
c650: 65 73 74 20 61 66 74 65 72 20 68 61 6e 64 73 68 est after handsh
c660: 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c ake (TLS 1.3 onl
c670: 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 y) */../* A writ
c680: 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 e operation must
c690: 20 74 61 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 take place for
c6a0: 74 68 65 20 43 65 72 74 69 66 69 63 61 74 65 20 the Certificate
c6b0: 52 65 71 75 65 73 74 20 74 6f 20 62 65 0a 09 20 Request to be..
c6c0: 20 20 73 65 6e 74 20 74 6f 20 74 68 65 20 63 6c sent to the cl
c6d0: 69 65 6e 74 2c 20 74 68 69 73 20 63 61 6e 20 62 ient, this can b
c6e0: 65 20 64 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f e done with SSL_
c6f0: 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 do_handshake().
c700: 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 */..if (request
c710: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b && post_handshak
c720: 65 20 26 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 e && tls1_3) {..
c730: 20 20 20 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 SSL_verify_c
c740: 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 lient_post_hands
c750: 68 61 6b 65 28 73 74 61 74 65 50 74 72 2d 3e 73 hake(statePtr->s
c760: 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 sl);..}.../* set
c770: 20 61 75 74 6f 6d 61 74 69 63 20 63 75 72 76 65 automatic curve
c780: 20 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 selection */..S
c790: 53 4c 5f 73 65 74 5f 65 63 64 68 5f 61 75 74 6f SL_set_ecdh_auto
c7a0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c7b0: 31 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 1);.../* Set ser
c7c0: 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 ver mode */..sta
c7d0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 tePtr->flags |=
c7e0: 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a TLS_TCL_SERVER;.
c7f0: 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f .SSL_set_accept_
c800: 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e state(statePtr->
c810: 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ssl);. } else
c820: 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 {../* Client ca
c830: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 llbacks */.#ifde
c840: 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 f USE_NPN..if (s
c850: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
c860: 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f != NULL && tls1_
c870: 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 2 == 0 && tls1_3
c880: 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 53 53 == 0) {.. SS
c890: 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 L_CTX_set_next_p
c8a0: 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 roto_select_cb(s
c8b0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c tatePtr->ctx, AL
c8c0: 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 PNCallback, (voi
c8d0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 d *)statePtr);..
c8e0: 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 }.#endif.../* Se
c8f0: 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f ssion caching */
c900: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 ..SSL_CTX_set_se
c910: 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 ssion_cache_mode
c920: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c930: 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 SSL_SESS_CACHE_C
c940: 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 LIENT | SSL_SESS
c950: 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e _CACHE_NO_INTERN
c960: 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f AL_STORE);..SSL_
c970: 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 CTX_sess_set_new
c980: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
c990: 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 x, SessionCallba
c9a0: 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 ck);.../* Enable
c9b0: 20 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 20 post handshake
c9c0: 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 Authentication e
c9d0: 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e xtension. TLS 1.
c9e0: 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 3 only, not http
c9f0: 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 /2. */..if (requ
ca00: 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 est && post_hand
ca10: 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 shake) {.. SS
ca20: 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 L_set_post_hands
ca30: 68 61 6b 65 5f 61 75 74 68 28 73 74 61 74 65 50 hake_auth(stateP
ca40: 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a tr->ssl, 1);..}.
ca50: 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 ../* Set client
ca60: 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 mode */..SSL_set
ca70: 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 _connect_state(s
ca80: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
ca90: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 }. SSL_set
caa0: 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 _bio(statePtr->s
cab0: 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f sl, statePtr->p_
cac0: 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 bio, statePtr->p
cad0: 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 _bio);. BIO_s
cae0: 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d et_ssl(statePtr-
caf0: 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e >bio, statePtr->
cb00: 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 ssl, BIO_NOCLOSE
cb10: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 );.. /*.
cb20: 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 * End of SSL Ini
cb30: 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 t. */. dp
cb40: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
cb50: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 %s", Tcl_GetCha
cb60: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
cb70: 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 r->self));. T
cb80: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
cb90: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 erp, (char *) Tc
cba0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
cbb0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
cbc0: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b , TCL_VOLATILE);
cbd0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
cbe0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
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 2d 2d ----------------
cc30: 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 -. *. * Unimport
cc40: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
cc50: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
cc60: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d s invoked to rem
cc70: 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 ove the topmost
cc80: 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a channel filter..
cc90: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
cca0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
ccb0: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
ccc0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
ccd0: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 May modify the b
cce0: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f ehavior of an IO
ccf0: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
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 2d ----------------
cd40: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
cd50: 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 t.UnimportObjCmd
cd60: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
cd70: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
cd80: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
cd90: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
cda0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
cdb0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
cdc0: 68 61 6e 2c 20 63 68 69 6c 64 3b 09 2f 2a 20 54 han, child;./* T
cdd0: 68 65 20 73 74 61 63 6b 65 64 20 61 6e 64 20 75 he stacked and u
cde0: 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 nderlying channe
cdf0: 6c 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 ls */. Tcl_DS
ce00: 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e tring upperChann
ce10: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 elTranslation, u
ce20: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
ce30: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ing, upperChanne
ce40: 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 lEncoding, upper
ce50: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a ChannelEOFChar;.
ce60: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 54 43 int res = TC
ce70: 4c 5f 4f 4b 3b 0a 20 20 20 20 28 76 6f 69 64 29 L_OK;. (void)
ce80: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 clientData;..
ce90: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
cea0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
ceb0: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f jc != 2) {..Tcl_
cec0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
ced0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
cee0: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 hannel");..retur
cef0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
cf00: 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 }.. /* Valid
cf10: 61 74 65 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 ate channel name
cf20: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 */. chan = T
cf30: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
cf40: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
cf50: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 ing(objv[1]), NU
cf60: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
cf70: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
cf80: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
cf90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
cfa0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
cfb0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
cfc0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
cfd0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
cfe0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
cff0: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 Channel(chan);.
d000: 20 20 20 63 68 69 6c 64 20 3d 20 54 63 6c 5f 47 child = Tcl_G
d010: 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c etStackedChannel
d020: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 (chan);.. /*
d030: 56 65 72 69 66 79 20 69 73 20 61 20 73 74 61 63 Verify is a stac
d040: 6b 65 64 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ked channel */.
d050: 20 20 20 69 66 20 28 63 68 69 6c 64 20 3d 3d 20 if (child ==
d060: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
d070: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
d080: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
d090: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
d0a0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 elName(chan),...
d0b0: 22 5c 22 3a 20 6e 6f 74 20 61 20 73 74 61 63 6b "\": not a stack
d0c0: 65 64 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 ed channel", (ch
d0d0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
d0e0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
d0f0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
d100: 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 , "UNIMPORT", "C
d110: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
d120: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
d130: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
d140: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
d150: 20 20 2f 2a 20 46 6c 75 73 68 20 61 6e 79 20 70 /* Flush any p
d160: 65 6e 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 ending data */.
d170: 20 20 20 69 66 20 28 54 63 6c 5f 46 6c 75 73 68 if (Tcl_Flush
d180: 28 63 68 61 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b (chan) != TCL_OK
d190: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
d1a0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
d1b0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
d1c0: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 t(&upperChannelT
d1d0: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 ranslation);.
d1e0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
d1f0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c (&upperChannelBl
d200: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c ocking);. Tcl
d210: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 _DStringInit(&up
d220: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 perChannelEOFCha
d230: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 r);. Tcl_DStr
d240: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
d250: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a annelEncoding);.
d260: 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 75 72 72 . /* Get curr
d270: 65 6e 74 20 63 6f 6e 66 69 67 20 2d 20 45 4f 4c ent config - EOL
d280: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 65 6e translation, en
d290: 63 6f 64 69 6e 67 20 61 6e 64 20 62 75 66 66 65 coding and buffe
d2a0: 72 69 6e 67 20 6f 70 74 69 6f 6e 73 20 61 72 65 ring options are
d2b0: 20 73 68 61 72 65 64 20 62 65 74 77 65 65 6e 20 shared between
d2c0: 61 6c 6c 20 63 68 61 6e 6e 65 6c 73 20 69 6e 20 all channels in
d2d0: 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 20 20 20 the stack */.
d2e0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
d2f0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
d300: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c an, "-blocking",
d310: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c &upperChannelBl
d320: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c ocking);. Tcl
d330: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
d340: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
d350: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 "-encoding", &up
d360: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
d370: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ng);. Tcl_Get
d380: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
d390: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f terp, chan, "-eo
d3a0: 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 fchar", &upperCh
d3b0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 annelEOFChar);.
d3c0: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
d3d0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
d3e0: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 chan, "-translat
d3f0: 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e ion", &upperChan
d400: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b nelTranslation);
d410: 0a 0a 20 20 20 20 2f 2a 20 55 6e 73 74 61 63 6b .. /* Unstack
d420: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 61 6e 64 the channel and
d430: 20 72 65 73 74 6f 72 65 20 75 6e 64 65 72 6c 79 restore underly
d440: 69 6e 67 20 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 ing channel conf
d450: 69 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 ig */. if (Tc
d460: 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c l_UnstackChannel
d470: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d (interp, chan) =
d480: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c = TCL_OK) {..Tcl
d490: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
d4a0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c n(interp, child,
d4b0: 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 "-encoding", Tc
d4c0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
d4d0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
d4e0: 64 69 6e 67 29 29 3b 0a 09 54 63 6c 5f 53 65 74 ding));..Tcl_Set
d4f0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
d500: 74 65 72 70 2c 20 63 68 69 6c 64 2c 20 22 2d 65 terp, child, "-e
d510: 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 ofchar", Tcl_DSt
d520: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
d530: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 ChannelEOFChar))
d540: 3b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 ;..Tcl_SetChanne
d550: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
d560: 63 68 69 6c 64 2c 20 22 2d 74 72 61 6e 73 6c 61 child, "-transla
d570: 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 tion", Tcl_DStri
d580: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
d590: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
d5a0: 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e ));..Tcl_SetChan
d5b0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
d5c0: 2c 20 63 68 69 6c 64 2c 20 22 2d 62 6c 6f 63 6b , child, "-block
d5d0: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e ing", Tcl_DStrin
d5e0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
d5f0: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a nnelBlocking));.
d600: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 } else {..re
d610: 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 s = TCL_ERROR;.
d620: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 }.. /* Cle
d630: 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 54 63 6c an-up */. Tcl
d640: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 _DStringFree(&up
d650: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
d660: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f ation);. Tcl_
d670: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 DStringFree(&upp
d680: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
d690: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 g);. Tcl_DStr
d6a0: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 ingFree(&upperCh
d6b0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 annelEOFChar);.
d6c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
d6d0: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ee(&upperChannel
d6e0: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 72 Blocking);. r
d6f0: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f eturn res;.}.../
d700: 2a 0a 20 2a 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 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 -------. *. * CT
d750: 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 X_Init -- constr
d760: 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e uct a SSL_CTX in
d770: 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 stance. *. * Res
d780: 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 ults:. *.A valid
d790: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 SSL_CTX instanc
d7a0: 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a e or NULL.. *. *
d7b0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
d7c0: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c *.constructs SSL
d7d0: 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 context (CTX).
d7e0: 2a 0a 20 2a 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 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
d830: 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 ic SSL_CTX *.CTX
d840: 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 _Init(State *sta
d850: 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 tePtr, int isSer
d860: 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 ver, int proto,
d870: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 char *keyfile, c
d880: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 har *certfile,.
d890: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
d8a0: 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 *key, unsigned
d8b0: 63 68 61 72 20 2a 63 65 72 74 2c 20 54 63 6c 5f char *cert, Tcl_
d8c0: 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 2c 20 54 63 Size key_len, Tc
d8d0: 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e 2c l_Size cert_len,
d8e0: 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c 0a 20 char *CApath,.
d8f0: 20 20 20 63 68 61 72 20 2a 43 41 73 74 6f 72 65 char *CAstore
d900: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 , char *CAfile,
d910: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 char *ciphers, c
d920: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 har *ciphersuite
d930: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 s, int level, ch
d940: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a ar *DHparams) {.
d950: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
d960: 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 interp = statePt
d970: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 r->interp;. S
d980: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 SL_CTX *ctx = NU
d990: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 LL;. Tcl_DStr
d9a0: 69 6e 67 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 ing ds;. int
d9b0: 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d off = 0, abort =
d9c0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 0;. int load
d9d0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 _private_key;.
d9e0: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 const SSL_METH
d9f0: 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 OD *method;..
da00: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
da10: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 ");.. if (!pr
da20: 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 oto) {..Tcl_Appe
da30: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
da40: 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f "no valid proto
da50: 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 28 col selected", (
da60: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
da70: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
da80: 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 }.. /* creat
da90: 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f e SSL context */
daa0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
dab0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 SION_NUMBER >= 0
dac0: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 x10100000L || de
dad0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c fined(NO_SSL2) |
dae0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
daf0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 L_NO_SSL2). i
db00: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
db10: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 , TLS_PROTO_SSL2
db20: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
db30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
db40: 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f SSL2 protocol no
db50: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 t supported", (c
db60: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
db70: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
db80: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 }.#endif.#if def
db90: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c ined(NO_SSL3) ||
dba0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
dbb0: 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 _NO_SSL3). if
dbc0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
dbd0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 TLS_PROTO_SSL3)
dbe0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
dbf0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
dc00: 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 SL3 protocol not
dc10: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
dc20: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
dc30: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
dc40: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
dc50: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 ned(NO_TLS1) ||
dc60: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
dc70: 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 NO_TLS1). if
dc80: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
dc90: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 TLS_PROTO_TLS1))
dca0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
dcb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
dcc0: 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.0 protocol n
dcd0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
dce0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
dcf0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
dd00: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
dd10: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
dd20: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
dd30: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 SSL_NO_TLS1_1).
dd40: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
dd50: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
dd60: 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f TLS1_1)) {..Tcl_
dd70: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
dd80: 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 erp, "TLS 1.1 pr
dd90: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
dda0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
ddb0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
ddc0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
ddd0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
dde0: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
ddf0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
de00: 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 LS1_2). if (E
de10: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
de20: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 S_PROTO_TLS1_2))
de30: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
de40: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
de50: 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.2 protocol n
de60: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
de70: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
de80: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
de90: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
dea0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
deb0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
dec0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
ded0: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
dee0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
def0: 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f TLS1_3)) {..Tcl_
df00: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
df10: 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 erp, "TLS 1.3 pr
df20: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
df30: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
df40: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
df50: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
df60: 66 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 f. if (proto
df70: 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 == 0) {../* Use
df80: 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 full range */..S
df90: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 SL_CTX_set_min_p
dfa0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
dfb0: 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 , 0);..SSL_CTX_s
dfc0: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 et_max_proto_ver
dfd0: 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 sion(ctx, 0);.
dfe0: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 }.. switch
dff0: 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 (proto) {.#if OP
e000: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
e010: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
e020: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
e030: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
e040: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
e050: 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c SL2). case TL
e060: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d S_PROTO_SSL2:..m
e070: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
e080: 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 65 72 5f ? SSLv2_server_
e090: 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 method() : SSLv2
e0a0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
e0b0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
e0c0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
e0d0: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
e0e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
e0f0: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
e100: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f OPENSSL_NO_SSL3_
e110: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 METHOD). case
e120: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a TLS_PROTO_SSL3:
e130: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
e140: 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 ver ? SSLv3_serv
e150: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 er_method() : SS
e160: 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f Lv3_client_metho
e170: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
e180: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
e190: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 (NO_TLS1) && !de
e1a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e1b0: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e _TLS1) && !defin
e1c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e1d0: 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 S1_METHOD). c
e1e0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
e1f0: 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 S1:..method = is
e200: 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 Server ? TLSv1_s
e210: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
e220: 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 TLSv1_client_me
e230: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
e240: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
e250: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 ned(NO_TLS1_1) &
e260: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
e270: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 SL_NO_TLS1_1) &&
e280: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
e290: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 L_NO_TLS1_1_METH
e2a0: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 OD). case TLS
e2b0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 _PROTO_TLS1_1:..
e2c0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
e2d0: 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 r ? TLSv1_1_serv
e2e0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c er_method() : TL
e2f0: 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 Sv1_1_client_met
e300: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 hod();..break;.#
e310: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
e320: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 ed(NO_TLS1_2) &&
e330: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
e340: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 L_NO_TLS1_2) &&
e350: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e360: 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f _NO_TLS1_2_METHO
e370: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
e380: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d PROTO_TLS1_2:..m
e390: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
e3a0: 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 ? TLSv1_2_serve
e3b0: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 r_method() : TLS
e3c0: 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 v1_2_client_meth
e3d0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
e3e0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
e3f0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 d(NO_TLS1_3) &&
e400: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e410: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
e420: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
e430: 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 LS1_3:../* Use t
e440: 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f he generic metho
e450: 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 d and constraint
e460: 20 72 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e range after con
e470: 74 65 78 74 20 69 73 20 63 72 65 61 74 65 64 20 text is created
e480: 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 */..method = isS
e490: 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 erver ? TLS_serv
e4a0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c er_method() : TL
e4b0: 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 S_client_method(
e4c0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
e4d0: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 f. default:..
e4e0: 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 /* Negotiate hig
e4f0: 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 hest available S
e500: 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a SL/TLS version *
e510: 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 /..method = isSe
e520: 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 rver ? TLS_serve
e530: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 r_method() : TLS
e540: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
e550: 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
e560: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
e570: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
e580: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
e590: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e5a0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 SSL_NO_SSL2)..of
e5b0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
e5c0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 oto, TLS_PROTO_S
e5d0: 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c SL2) ? 0 : SSL
e5e0: 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 _OP_NO_SSLv2);.#
e5f0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
e600: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 ed(NO_SSL3) && !
e610: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e620: 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d NO_SSL3)..off |=
e630: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
e640: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 TLS_PROTO_SSL3)
e650: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f ? 0 : SSL_OP_
e660: 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 NO_SSLv3);.#endi
e670: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
e680: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
e690: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
e6a0: 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e LS1)..off |= (EN
e6b0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
e6c0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f _PROTO_TLS1) ?
e6d0: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
e6e0: 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 LSv1);.#endif.#i
e6f0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
e700: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
e710: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
e720: 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 1_1)..off |= (EN
e730: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
e740: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f _PROTO_TLS1_1) ?
e750: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
e760: 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a LSv1_1);.#endif.
e770: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
e780: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
e790: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
e7a0: 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 LS1_2)..off |= (
e7b0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
e7c0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 LS_PROTO_TLS1_2)
e7d0: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
e7e0: 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 _TLSv1_2);.#endi
e7f0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
e800: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 O_TLS1_3) && !de
e810: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e820: 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d _TLS1_3)..off |=
e830: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
e840: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
e850: 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 3) ? 0 : SSL_OP_
e860: 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e NO_TLSv1_3);.#en
e870: 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 dif..break;.
e880: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
e890: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 _error();.. c
e8a0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
e8b0: 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 (method);. if
e8c0: 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 (!ctx) {..retur
e8d0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 n NULL;. }..
e8e0: 20 20 20 69 66 20 28 67 65 74 65 6e 76 28 53 53 if (getenv(SS
e8f0: 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a LKEYLOGFILE)) {.
e900: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 .SSL_CTX_set_key
e910: 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 log_callback(ctx
e920: 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b , KeyLogCallback
e930: 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 );. }..#if !d
e940: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
e950: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
e960: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
e970: 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d . if (proto =
e980: 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 = TLS_PROTO_TLS1
e990: 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 _3) {..SSL_CTX_s
e9a0: 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 et_min_proto_ver
e9b0: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 sion(ctx, TLS1_3
e9c0: 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f _VERSION);..SSL_
e9d0: 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 CTX_set_max_prot
e9e0: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 o_version(ctx, T
e9f0: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a LS1_3_VERSION);.
ea00: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 }.#endif..
ea10: 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65 /* Force ciphe
ea20: 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 r selection orde
ea30: 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 r by server */.
ea40: 20 20 20 69 66 20 28 21 69 73 53 65 72 76 65 72 if (!isServer
ea50: 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 ) {..SSL_CTX_set
ea60: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 _options(ctx, SS
ea70: 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 L_OP_CIPHER_SERV
ea80: 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a ER_PREFERENCE);.
ea90: 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 }..#if OPENS
eaa0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
eab0: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 0a R < 0x10100000L.
eac0: 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f OpenSSL_add_
ead0: 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 all_algorithms()
eae0: 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 ; /* Load cipher
eaf0: 73 20 61 6e 64 20 64 69 67 65 73 74 73 20 2a 2f s and digests */
eb00: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c .#endif.. SSL
eb10: 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 _CTX_set_app_dat
eb20: 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e a(ctx, (void*)in
eb30: 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 terp);./* rememb
eb40: 65 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 er the interpret
eb50: 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 er */. SSL_CT
eb60: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
eb70: 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 x, SSL_OP_ALL);.
eb80: 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20 53 53 /* Enable all SS
eb90: 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 L bug workaround
eba0: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 s */. SSL_CTX
ebb0: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 _set_options(ctx
ebc0: 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 , SSL_OP_NO_COMP
ebd0: 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 44 69 73 RESSION);./* Dis
ebe0: 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e able compression
ebf0: 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72 74 even if support
ec00: 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 ed */. SSL_CT
ec10: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
ec20: 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 44 69 73 x, off);../* Dis
ec30: 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 20 70 able specified p
ec40: 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 rotocol versions
ec50: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f */.. /* Allo
ec60: 77 20 77 72 69 74 65 73 20 74 6f 20 72 65 70 6f w writes to repo
ec70: 72 74 20 73 75 63 63 65 73 73 20 77 68 65 6e 20 rt success when
ec80: 6c 65 73 73 20 74 68 61 6e 20 61 6c 6c 20 72 65 less than all re
ec90: 63 6f 72 64 73 20 68 61 76 65 20 62 65 65 6e 20 cords have been
eca0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 53 written */. S
ecb0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 SL_CTX_set_mode(
ecc0: 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 45 4e ctx, SSL_MODE_EN
ecd0: 41 42 4c 45 5f 50 41 52 54 49 41 4c 5f 57 52 49 ABLE_PARTIAL_WRI
ece0: 54 45 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 69 73 TE);.. /* Dis
ecf0: 61 62 6c 65 20 61 74 74 65 6d 70 74 73 20 74 6f able attempts to
ed00: 20 74 72 79 20 74 6f 20 70 72 6f 63 65 73 73 20 try to process
ed10: 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20 the next record
ed20: 69 6e 73 74 65 61 64 20 6f 66 20 72 65 74 75 72 instead of retur
ed30: 6e 69 6e 67 20 61 66 74 65 72 20 61 0a 20 20 20 ning after a.
ed40: 20 20 20 20 6e 6f 6e 2d 61 70 70 20 72 65 63 6f non-app reco
ed50: 72 64 2e 20 41 76 6f 69 64 73 20 68 61 6e 67 73 rd. Avoids hangs
ed60: 20 69 6e 20 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 in blocking mod
ed70: 65 2c 20 77 68 65 6e 20 75 73 69 6e 67 20 53 53 e, when using SS
ed80: 4c 5f 72 65 61 64 28 29 20 61 6e 64 20 61 0a 20 L_read() and a.
ed90: 20 20 20 20 20 20 6e 6f 6e 2d 61 70 70 6c 69 63 non-applic
eda0: 61 74 69 6f 6e 20 72 65 63 6f 72 64 20 77 61 73 ation record was
edb0: 20 73 65 6e 74 20 61 6e 64 20 6e 6f 20 61 70 70 sent and no app
edc0: 6c 69 63 61 74 69 6f 6e 20 64 61 74 61 20 77 61 lication data wa
edd0: 73 20 73 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 53 s sent. */. S
ede0: 53 4c 5f 43 54 58 5f 63 6c 65 61 72 5f 6d 6f 64 SL_CTX_clear_mod
edf0: 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f e(ctx, SSL_MODE_
ee00: 41 55 54 4f 5f 52 45 54 52 59 29 3b 0a 0a 20 20 AUTO_RETRY);..
ee10: 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 SSL_CTX_sess_s
ee20: 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 et_cache_size(ct
ee30: 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a x, 128);.. /*
ee40: 20 53 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 Set user define
ee50: 64 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 d ciphers, ciphe
ee60: 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 r suites, and se
ee70: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a curity level */.
ee80: 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 if ((ciphers
ee90: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 != NULL) && !SS
eea0: 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 L_CTX_set_cipher
eeb0: 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68 65 _list(ctx, ciphe
eec0: 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 rs)) {..Tcl_Appe
eed0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
eee0: 20 22 53 65 74 20 63 69 70 68 65 72 73 20 66 61 "Set ciphers fa
eef0: 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 iled: No valid c
ef00: 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a iphers", (char *
ef10: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 ) NULL);..SSL_CT
ef20: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
ef30: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
ef40: 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 . if ((cipher
ef50: 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 suites != NULL)
ef60: 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f && !SSL_CTX_set_
ef70: 63 69 70 68 65 72 73 75 69 74 65 73 28 63 74 78 ciphersuites(ctx
ef80: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29 29 , ciphersuites))
ef90: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
efa0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 sult(interp, "Se
efb0: 74 20 63 69 70 68 65 72 20 73 75 69 74 65 73 20 t cipher suites
efc0: 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 failed: No valid
efd0: 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 ciphers", (char
efe0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f *) NULL);..SSL_
eff0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
f000: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
f010: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 }.. /* Set s
f020: 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f ecurity level */
f030: 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e . if (level >
f040: 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 -1 && level < 6
f050: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f ) {../* SSL_set_
f060: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a security_level *
f070: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 /..SSL_CTX_set_s
f080: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 ecurity_level(ct
f090: 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d x, level);. }
f0a0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d .. /* set som
f0b0: 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 e callbacks */.
f0c0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 SSL_CTX_set_d
f0d0: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 efault_passwd_cb
f0e0: 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 (ctx, PasswordCa
f0f0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c llback);. SSL
f100: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 _CTX_set_default
f110: 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 _passwd_cb_userd
f120: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a ata(ctx, (void *
f130: 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 )statePtr);..
f140: 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 /* read a Diffi
f150: 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 e-Hellman parame
f160: 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 ters file, or us
f170: 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f e the built-in o
f180: 6e 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 ne */. Tcl_DS
f190: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a tringInit(&ds);.
f1a0: 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e #ifdef OPENSSL_N
f1b0: 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 O_DH. if (DHp
f1c0: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b arams != NULL) {
f1d0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
f1e0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 lt(interp, "DH p
f1f0: 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 arameter support
f200: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c not available",
f210: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
f220: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
f230: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
f240: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 L;. }.#else.
f250: 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 {..DH* dh;..i
f260: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e f (DHparams != N
f270: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 ULL) {.. BIO
f280: 2a 62 69 6f 3b 0a 0a 09 20 20 20 20 62 69 6f 20 *bio;... bio
f290: 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 = BIO_new_file(F
f2a0: 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 2N(DHparams, &ds
f2b0: 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 ), "r");.. if
f2c0: 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f (!bio) {...Tcl_
f2d0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
f2e0: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 ;...Tcl_AppendRe
f2f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f sult(interp, "Co
f300: 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 uld not find DH
f310: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 parameters file"
f320: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
f330: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
f340: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
f350: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 NULL;.. }...
f360: 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 dh = PEM_read
f370: 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 _bio_DHparams(bi
f380: 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e o, NULL, NULL, N
f390: 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 ULL);.. BIO_f
f3a0: 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 ree(bio);.. T
f3b0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
f3c0: 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 ds);.. if (!d
f3d0: 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e h) {...Tcl_Appen
f3e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
f3f0: 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 "Could not read
f400: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 DH parameters fr
f410: 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 om file", (char
f420: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f *) NULL);...SSL_
f430: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
f440: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 .return NULL;..
f450: 20 20 20 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 }.. SSL_CT
f460: 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 X_set_tmp_dh(ctx
f470: 2c 20 64 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 , dh);.. DH_f
f480: 72 65 65 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 ree(dh);...} els
f490: 65 20 7b 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 e {.. /* Use
f4a0: 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 well known DH pa
f4b0: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 68 61 rameters that ha
f4c0: 76 65 20 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 ve built-in supp
f4d0: 6f 72 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a ort in OpenSSL *
f4e0: 2f 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f /.. if (!SSL_
f4f0: 43 54 58 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 CTX_set_dh_auto(
f500: 63 74 78 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c ctx, 1)) {...Tcl
f510: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
f520: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 terp, "Could not
f530: 20 65 6e 61 62 6c 65 20 73 65 74 20 44 48 20 61 enable set DH a
f540: 75 74 6f 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f uto: ", GET_ERR_
f550: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
f560: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f *) NULL);...SSL_
f570: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
f580: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 .return NULL;..
f590: 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 }..}. }.#e
f5a0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 ndif.. /* set
f5b0: 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65 our certificate
f5c0: 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 */. load_pri
f5d0: 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 vate_key = 0;.
f5e0: 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 if (certfile !
f5f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f = NULL) {..load_
f600: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b private_key = 1;
f610: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 ...if (SSL_CTX_u
f620: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 se_certificate_f
f630: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 ile(ctx, F2N(cer
f640: 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c tfile, &ds), SSL
f650: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c _FILETYPE_PEM) <
f660: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f = 0) {.. Tcl_
f670: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
f680: 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ;.. Tcl_Appen
f690: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
f6a0: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 "unable to set c
f6b0: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 ertificate file
f6c0: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 ", certfile, ":
f6d0: 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 ",...GET_ERR_REA
f6e0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
f6f0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
f700: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
f710: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
f720: 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 ..}..Tcl_DString
f730: 46 72 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 Free(&ds);..
f740: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 } else if (cert
f750: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 != NULL) {..load
f760: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 _private_key = 1
f770: 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 ;..if (SSL_CTX_u
f780: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 se_certificate_A
f790: 53 4e 31 28 63 74 78 2c 20 28 69 6e 74 29 20 63 SN1(ctx, (int) c
f7a0: 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c ert_len, cert) <
f7b0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f = 0) {.. Tcl_
f7c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f7d0: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
f7e0: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a set certificate:
f7f0: 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 ",...GET_ERR_RE
f800: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
f810: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c NULL);.. SSL
f820: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
f830: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c . return NULL
f840: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
f850: 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 {..certfile = (c
f860: 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 har*)X509_get_de
f870: 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 fault_cert_file(
f880: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 );...if (SSL_CTX
f890: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 _use_certificate
f8a0: 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 _file(ctx, certf
f8b0: 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ile, SSL_FILETYP
f8c0: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 E_PEM) <= 0) {.#
f8d0: 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 41 70 if 0.. Tcl_Ap
f8e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f8f0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 p, "unable to us
f900: 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 e default certif
f910: 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 icate file ", ce
f920: 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 rtfile, ": ",...
f930: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
f940: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
f950: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
f960: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
f970: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 eturn NULL;.#end
f980: 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 if..}. }..
f990: 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76 /* set our priv
f9a0: 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 ate key */. i
f9b0: 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f f (load_private_
f9c0: 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 key) {..if (keyf
f9d0: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b ile == NULL && k
f9e0: 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 ey == NULL) {..
f9f0: 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 keyfile = cer
fa00: 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 tfile;..}...if (
fa10: 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 keyfile != NULL)
fa20: 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74 {.. /* get t
fa30: 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 he private key a
fa40: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 ssociated with t
fa50: 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 his certificate
fa60: 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66 */.. if (keyf
fa70: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ile == NULL) {..
fa80: 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 .keyfile = certf
fa90: 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ile;.. }...
faa0: 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 if (SSL_CTX_us
fab0: 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c e_PrivateKey_fil
fac0: 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 e(ctx, F2N(keyfi
fad0: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 le, &ds), SSL_FI
fae0: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 LETYPE_PEM) <= 0
faf0: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
fb00: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a gFree(&ds);.../*
fb10: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 flush the passp
fb20: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 hrase which migh
fb30: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 t be left in the
fb40: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c result */...Tcl
fb50: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
fb60: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 p, NULL, TCL_STA
fb70: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 TIC);...Tcl_Appe
fb80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
fb90: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
fba0: 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 public key file
fbb0: 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c ", keyfile, " ",
fbc0: 0a 09 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52 ... GET_ERR_R
fbd0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
fbe0: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
fbf0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
fc00: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 return NULL;..
fc10: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
fc20: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a ringFree(&ds);..
fc30: 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 .} else if (key
fc40: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
fc50: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f if (SSL_CTX_use_
fc60: 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 PrivateKey_ASN1(
fc70: 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 EVP_PKEY_RSA, ct
fc80: 78 2c 20 6b 65 79 2c 20 28 69 6e 74 29 20 6b 65 x, key, (int) ke
fc90: 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 y_len) <= 0) {..
fca0: 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 ./* flush the pa
fcb0: 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d ssphrase which m
fcc0: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 ight be left in
fcd0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 the result */...
fce0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
fcf0: 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f terp, NULL, TCL_
fd00: 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 STATIC);...Tcl_A
fd10: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
fd20: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
fd30: 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 et public key: "
fd40: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
fd50: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
fd60: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
fd70: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
fd80: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 n NULL;.. }..
fd90: 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f }../* Now we kno
fda0: 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 w that a key and
fdb0: 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 cert have been
fdc0: 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 set against.. *
fdd0: 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 the SSL context
fde0: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 */..if (!SSL_CTX
fdf0: 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b _check_private_k
fe00: 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 ey(ctx)) {..
fe10: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
fe20: 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 (interp, "privat
fe30: 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d e key does not m
fe40: 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69 atch the certifi
fe50: 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 cate public key"
fe60: 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 20 ,.... (char
fe70: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
fe80: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
fe90: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
fea0: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 LL;..}. }..
feb0: 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 65 20 /* Set to use
fec0: 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 the default loca
fed0: 74 69 6f 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f tion and file fo
fee0: 72 20 43 65 72 74 69 66 69 63 61 74 65 20 41 75 r Certificate Au
fef0: 74 68 6f 72 69 74 79 20 28 43 41 29 20 63 65 72 thority (CA) cer
ff00: 74 69 66 69 63 61 74 65 73 2e 0a 20 20 20 20 20 tificates..
ff10: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 43 41 * The default CA
ff20: 20 63 65 72 74 69 66 69 63 61 74 65 73 20 64 69 certificates di
ff30: 72 65 63 74 6f 72 79 20 69 73 20 63 61 6c 6c 65 rectory is calle
ff40: 64 20 63 65 72 74 73 20 69 6e 20 74 68 65 20 64 d certs in the d
ff50: 65 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 20 efault OpenSSL.
ff60: 20 20 20 20 2a 20 64 69 72 65 63 74 6f 72 79 2e * directory.
ff70: 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 It contains the
ff80: 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65 73 CA certificates
ff90: 20 69 6e 20 50 45 4d 20 66 6f 72 6d 61 74 2c 20 in PEM format,
ffa0: 77 69 74 68 20 6f 6e 65 20 63 65 72 74 69 66 69 with one certifi
ffb0: 63 61 74 65 20 70 65 72 0a 20 20 20 20 20 2a 20 cate per. *
ffc0: 66 69 6c 65 2e 20 54 68 65 20 76 65 72 69 66 79 file. The verify
ffd0: 20 70 61 74 68 20 61 6e 64 20 73 74 6f 72 65 20 path and store
ffe0: 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 can be overridde
fff0: 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 n by the SSL_CER
10000 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54 T_DIR env var. T
10010 68 65 0a 20 20 20 20 20 2a 20 64 65 66 61 75 6c he. * defaul
10020 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65 t CA certificate
10030 73 20 66 69 6c 65 20 69 73 20 63 61 6c 6c 65 64 s file is called
10040 20 63 65 72 74 2e 70 65 6d 20 69 6e 20 74 68 65 cert.pem in the
10050 20 64 65 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c default OpenSSL
10060 20 64 69 72 65 63 74 6f 72 79 2e 0a 20 20 20 20 directory..
10070 20 2a 20 54 68 65 20 76 65 72 69 66 79 20 66 69 * The verify fi
10080 6c 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 le can be overri
10090 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f dden by the SSL_
100a0 43 45 52 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 CERT_FILE env va
100b0 72 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 r. */. if (!S
100c0 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 SL_CTX_set_defau
100d0 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 lt_verify_paths(
100e0 63 74 78 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b ctx)) {..abort++
100f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
10100 4f 76 65 72 72 69 64 65 73 20 66 6f 72 20 74 68 Overrides for th
10110 65 20 43 41 20 76 65 72 69 66 79 20 70 61 74 68 e CA verify path
10120 20 61 6e 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 and file */.
10130 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 {.#if OPENSSL_V
10140 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
10150 30 78 33 30 30 30 30 30 30 30 4c 0a 09 69 66 20 0x30000000L..if
10160 28 43 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20 (CApath != NULL
10170 7c 7c 20 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c || CAfile != NUL
10180 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 L) {.. Tcl_DS
10190 74 72 69 6e 67 20 64 73 31 3b 0a 09 20 20 20 20 tring ds1;..
101a0 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
101b0 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 69 66 20 &ds1);... if
101c0 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 (!SSL_CTX_load_v
101d0 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 erify_locations(
101e0 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c ctx, F2N(CAfile,
101f0 20 26 64 73 29 2c 20 46 32 4e 28 43 41 70 61 74 &ds), F2N(CApat
10200 68 2c 20 26 64 73 31 29 29 29 20 7b 0a 09 09 54 h, &ds1))) {...T
10210 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
10220 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52 5f interp, GET_ERR_
10230 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
10240 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f *) NULL);...SSL_
10250 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
10260 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
10270 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 44 53 74 (&ds);...Tcl_DSt
10280 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a ringFree(&ds1);.
10290 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
102a0 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 }.. Tcl_D
102b0 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
102c0 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
102d0 67 46 72 65 65 28 26 64 73 31 29 3b 0a 0a 09 20 gFree(&ds1);...
102e0 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f /* Set list o
102f0 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f f CAs to send to
10300 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 client when req
10310 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 uesting a client
10320 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a certificate */.
10330 09 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f . /* https://
10340 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f sourceforge.net/
10350 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a p/tls/bugs/57/ *
10360 2f 0a 09 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f /.. /* XXX:TO
10370 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 DO: Let the user
10380 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 supply values h
10390 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 ere instead of s
103a0 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 omething that ex
103b0 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 ists on the file
103c0 73 79 73 74 65 6d 20 2a 2f 0a 09 20 20 20 20 53 system */.. S
103d0 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d TACK_OF(X509_NAM
103e0 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 E) *certNames =
103f0 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f SSL_load_client_
10400 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 CA_file(F2N(CAfi
10410 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 20 20 le, &ds));..
10420 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d if (certNames !=
10430 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 NULL) {...SSL_C
10440 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 TX_set_client_CA
10450 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e _list(ctx, certN
10460 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 ames);.. }..
10470 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
10480 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 23 65 6c ee(&ds);..}..#el
10490 73 65 0a 09 2f 2a 20 53 65 74 20 64 69 72 65 63 se../* Set direc
104a0 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 tory containing
104b0 43 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20 CA certificates
104c0 69 6e 20 50 45 4d 20 66 6f 72 6d 61 74 2e 20 2a in PEM format. *
104d0 2f 0a 09 69 66 20 28 43 41 70 61 74 68 20 21 3d /..if (CApath !=
104e0 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 NULL) {.. if
104f0 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f (!SSL_CTX_load_
10500 76 65 72 69 66 79 5f 64 69 72 28 63 74 78 2c 20 verify_dir(ctx,
10510 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73 29 F2N(CApath, &ds)
10520 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e )) {...Tcl_Appen
10530 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
10540 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
10550 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
10560 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
10570 28 63 74 78 29 3b 0a 09 09 54 63 6c 5f 44 53 74 (ctx);...Tcl_DSt
10580 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
10590 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 .return NULL;..
105a0 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 }.. Tcl_DS
105b0 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
105c0 09 7d 0a 09 0a 09 2f 2a 20 53 65 74 20 55 52 49 .}..../* Set URI
105d0 20 66 6f 72 20 74 6f 20 61 20 73 74 6f 72 65 2c for to a store,
105e0 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 61 20 which may be a
105f0 73 69 6e 67 6c 65 20 63 6f 6e 74 61 69 6e 65 72 single container
10600 20 6f 72 20 61 20 63 61 74 61 6c 6f 67 20 6f 66 or a catalog of
10610 20 63 6f 6e 74 61 69 6e 65 72 73 2e 20 2a 2f 0a containers. */.
10620 09 69 66 20 28 43 41 73 74 6f 72 65 20 21 3d 20 .if (CAstore !=
10630 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 NULL) {.. if
10640 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 (!SSL_CTX_load_v
10650 65 72 69 66 79 5f 73 74 6f 72 65 28 63 74 78 2c erify_store(ctx,
10660 20 46 32 4e 28 43 41 73 74 6f 72 65 2c 20 26 64 F2N(CAstore, &d
10670 73 29 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 s))) {...Tcl_App
10680 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
10690 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
106a0 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
106b0 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
106c0 65 65 28 63 74 78 29 3b 0a 09 09 54 63 6c 5f 44 ee(ctx);...Tcl_D
106d0 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
106e0 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
106f0 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f . }.. Tcl_
10700 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
10710 3b 0a 09 7d 0a 09 0a 09 2f 2a 20 53 65 74 20 66 ;..}..../* Set f
10720 69 6c 65 20 6f 66 20 43 41 20 63 65 72 74 69 66 ile of CA certif
10730 69 63 61 74 65 73 20 69 6e 20 50 45 4d 20 66 6f icates in PEM fo
10740 72 6d 61 74 2e 20 20 2a 2f 0a 09 69 66 20 28 43 rmat. */..if (C
10750 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b Afile != NULL) {
10760 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 .. if (!SSL_C
10770 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 TX_load_verify_f
10780 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66 ile(ctx, F2N(CAf
10790 69 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 ile, &ds))) {...
107a0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
107b0 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52 (interp, GET_ERR
107c0 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 _REASON(), (char
107d0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
107e0 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
107f0 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
10800 65 28 26 64 73 29 3b 0a 09 09 72 65 74 75 72 6e e(&ds);...return
10810 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 NULL;.. }..
10820 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
10830 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 20 2f ee(&ds);... /
10840 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41 * Set list of CA
10850 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 s to send to cli
10860 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74 ent when request
10870 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72 ing a client cer
10880 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 tificate */..
10890 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e STACK_OF(X509_N
108a0 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 AME) *certNames
108b0 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e = SSL_load_clien
108c0 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 t_CA_file(F2N(CA
108d0 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 file, &ds));..
108e0 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 if (certNames
108f0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c != NULL) {...SSL
10900 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
10910 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 CA_list(ctx, cer
10920 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a tNames);.. }.
10930 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
10940 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65 Free(&ds);..}.#e
10950 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ndif. }..
10960 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a return ctx;.}...
10970 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
10980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
109a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
109b0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 --------. *. * S
109c0 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 tatusObjCmd -- r
109d0 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 eturn certificat
109e0 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 e for connected
109f0 70 65 65 72 20 69 6e 66 6f 2e 0a 20 2a 0a 20 2a peer info.. *. *
10a00 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
10a10 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
10a20 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
10a30 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
10a40 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
10a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
10a90 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f atic int.StatusO
10aa0 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
10ab0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
10ac0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
10ad0 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
10ae0 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
10af0 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
10b00 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 tatePtr;. X50
10b10 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 9 *peer;. Tcl
10b20 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 _Obj *objPtr;.
10b30 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
10b40 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 an;. char *ch
10b50 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 annelName, *ciph
10b60 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 ers;. int mod
10b70 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
10b80 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 igned char *prot
10b90 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 o;. unsigned
10ba0 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 int len;. int
10bb0 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20 20 28 nid, res;. (
10bc0 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
10bd0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
10be0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
10bf0 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f f (objc < 2 || o
10c00 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 bjc > 3 || (objc
10c10 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70 == 3 && !strcmp
10c20 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f (Tcl_GetString(o
10c30 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c bjv[1]), "-local
10c40 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e "))) {..Tcl_Wron
10c50 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
10c60 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 1, objv, "?-loc
10c70 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 al? channel");..
10c80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
10c90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
10ca0 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a Get channel Id *
10cb0 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d /. channelNam
10cc0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e e = Tcl_GetStrin
10cd0 67 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 g(objv[(objc ==
10ce0 32 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 2 ? 1 : 2)]);.
10cf0 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
10d00 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
10d10 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f channelName, &mo
10d20 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 de);. if (cha
10d30 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
10d40 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
10d50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
10d60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
10d70 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
10d80 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
10d90 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
10da0 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
10db0 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 Channel(chan);.
10dc0 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
10dd0 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
10de0 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
10df0 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
10e00 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
10e10 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
10e20 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
10e30 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 elName(chan),...
10e40 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
10e50 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a hannel", (char *
10e60 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 ) NULL);..Tcl_Se
10e70 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
10e80 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 p, "TLS", "STATU
10e90 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 S", "CHANNEL", "
10ea0 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
10eb0 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
10ec0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
10ed0 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 }. statePtr
10ee0 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f = (State *) Tcl_
10ef0 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
10f00 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 ceData(chan);..
10f10 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66 /* Get certif
10f20 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f icate for peer o
10f30 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 r self */. if
10f40 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
10f50 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 peer = SSL_get_p
10f60 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 eer_certificate(
10f70 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
10f80 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 } else {..pe
10f90 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 er = SSL_get_cer
10fa0 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 tificate(statePt
10fb0 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 r->ssl);. }.
10fc0 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63 /* Get X509 c
10fd0 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20 ertificate info
10fe0 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 */. if (peer)
10ff0 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 {..objPtr = Tls
11000 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 _NewX509Obj(inte
11010 72 70 2c 20 70 65 65 72 2c 20 31 29 3b 0a 09 69 rp, peer, 1);..i
11020 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a f (objc == 2) {.
11030 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70 . X509_free(p
11040 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20 eer);.. peer
11050 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d = NULL;..}. }
11060 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 else {..objPtr
11070 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
11080 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d (0, NULL);. }
11090 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 .. /* Peer na
110a0 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e me */. LAPPEN
110b0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
110c0 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 jPtr, "peername"
110d0 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e , SSL_get0_peern
110e0 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ame(statePtr->ss
110f0 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 l), -1);. LAP
11100 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
11110 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22 objPtr, "sbits"
11120 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 , SSL_get_cipher
11130 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e _bits(statePtr->
11140 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 ssl, NULL));..
11150 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 ciphers = (cha
11160 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 r*)SSL_get_ciphe
11170 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 r(statePtr->ssl)
11180 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 ;. LAPPEND_ST
11190 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
111a0 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 68 , "cipher", ciph
111b0 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f ers, -1);.. /
111c0 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 * Verify the X50
111d0 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 9 certificate pr
111e0 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 esented by the p
111f0 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 eer */. LAPPE
11200 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11210 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 65 bjPtr, "verifyRe
11220 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 sult",..X509_ver
11230 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 ify_cert_error_s
11240 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 tring(SSL_get_ve
11250 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 rify_result(stat
11260 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 ePtr->ssl)), -1)
11270 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 ;.. /* Verify
11280 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 mode */. mod
11290 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 e = SSL_get_veri
112a0 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 fy_mode(statePtr
112b0 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 ->ssl);. if (
112c0 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
112d0 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 FY_NONE) {..LAPP
112e0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
112f0 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d objPtr, "verifyM
11300 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 ode", "none", -1
11310 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
11320 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 .Tcl_Obj *listOb
11330 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
11340 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
11350 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c .if (mode && SSL
11360 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a _VERIFY_PEER) {.
11370 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
11380 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
11390 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 terp, listObjPtr
113a0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
113b0 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b bj("peer", -1));
113c0 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 ..}..if (mode &&
113d0 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
113e0 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
113f0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
11400 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
11410 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 t(interp, listOb
11420 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
11430 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 ingObj("fail if
11440 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d no peer cert", -
11450 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 1));..}..if (mod
11460 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f e && SSL_VERIFY_
11470 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 CLIENT_ONCE) {..
11480 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
11490 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
114a0 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c erp, listObjPtr,
114b0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
114c0 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c j("client once",
114d0 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d -1));..}..if (m
114e0 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
114f0 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 Y_POST_HANDSHAKE
11500 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
11510 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
11520 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 t(interp, listOb
11530 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
11540 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e ingObj("post han
11550 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 dshake", -1));..
11560 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 }..LAPPEND_OBJ(i
11570 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11580 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 verifyMode", lis
11590 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a tObjPtr). }..
115a0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f /* Verify mo
115b0 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 de depth */.
115c0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
115d0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 rp, objPtr, "ver
115e0 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 ifyDepth", SSL_g
115f0 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 et_verify_depth(
11600 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b statePtr->ssl));
11610 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 .. /* Report
11620 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f the selected pro
11630 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c tocol as a resul
11640 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 t of the negotia
11650 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f tion */. SSL_
11660 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 get0_alpn_select
11670 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ed(statePtr->ssl
11680 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b , &proto, &len);
11690 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
116a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
116b0 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a "alpn", (char *
116c0 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a )proto, (Tcl_Siz
116d0 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 e) len);. LAP
116e0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
116f0 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 objPtr, "protoc
11700 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 ol", SSL_get_ver
11710 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 sion(statePtr->s
11720 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f sl), -1);.. /
11730 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d * Valid for non-
11740 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e RSA signature an
11750 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 d TLS 1.3 */.
11760 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 if (objc == 2)
11770 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 {..res = SSL_get
11780 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f _peer_signature_
11790 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
117a0 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 l, &nid);. }
117b0 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 else {..res = SS
117c0 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f L_get_signature_
117d0 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
117e0 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a l, &nid);. }.
117f0 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e if (!res) {n
11800 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 id = 0;}. LAP
11810 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11820 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 objPtr, "signat
11830 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d ureHashAlgorithm
11840 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 ", OBJ_nid2ln(ni
11850 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a d), -1);.. /*
11860 20 41 64 64 65 64 20 69 6e 20 4f 70 65 6e 53 53 Added in OpenSS
11870 4c 20 31 2e 31 2e 31 61 20 2a 2f 0a 23 69 66 20 L 1.1.1a */.#if
11880 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
11890 4e 55 4d 42 45 52 20 3e 20 30 78 31 30 31 30 31 NUMBER > 0x10101
118a0 30 30 30 4c 0a 20 20 20 20 69 66 20 28 6f 62 6a 000L. if (obj
118b0 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d c == 2) {..res =
118c0 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 SSL_get_peer_si
118d0 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 gnature_type_nid
118e0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
118f0 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 &nid);. } els
11900 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 e {..res = SSL_g
11910 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 et_signature_typ
11920 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
11930 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 ssl, &nid);.
11940 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 }. if (!res)
11950 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c {nid = 0;}. L
11960 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11970 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e p, objPtr, "sign
11980 61 74 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f atureType", OBJ_
11990 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 nid2ln(nid), -1)
119a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 ;.#endif.. Tc
119b0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
119c0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
119d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
119e0 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
119f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
11a30 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e *. * Connection
11a40 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 InfoObjCmd -- re
11a50 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 turn connection
11a60 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 info from OpenSS
11a70 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 L.. *. * Results
11a80 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 :. *.A list of c
11a90 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 onnection info.
11aa0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
11ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ae0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
11af0 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 atic int Connect
11b00 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c ionInfoObjCmd(Cl
11b10 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
11b20 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
11b30 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
11b40 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
11b50 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
11b60 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
11b70 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 ;../* The channe
11b80 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
11b90 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 on */. State
11ba0 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 *statePtr;../* c
11bb0 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 lient state for
11bc0 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 ssl socket */.
11bd0 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
11be0 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 r, *listPtr;.
11bf0 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b const SSL *ssl;
11c00 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 . const SSL_C
11c10 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 IPHER *cipher;.
11c20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 const SSL_SES
11c30 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 SION *session;.
11c40 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 const EVP_MD
11c50 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 *md;. (void)
11c60 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
11c70 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 if (objc != 2)
11c80 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
11c90 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
11ca0 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b bjv, "channel");
11cb0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
11cc0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 OR;. }.. c
11cd0 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
11ce0 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c nnel(interp, Tcl
11cf0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
11d00 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 1]), NULL);.
11d10 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
11d20 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
11d30 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
11d40 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
11d50 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
11d60 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
11d70 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
11d80 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
11d90 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
11da0 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 han);. if (Tc
11db0 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
11dc0 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
11dd0 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
11de0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
11df0 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
11e00 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
11e10 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
11e20 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e an),.. "\": n
11e30 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
11e40 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
11e50 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
11e60 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
11e70 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 S", "CONNECTION"
11e80 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e , "CHANNEL", "IN
11e90 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 VALID", (char *)
11ea0 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
11eb0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
11ec0 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
11ed0 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
11ee0 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 NULL);.. /*
11ef0 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 Connection info
11f00 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 */. statePtr
11f10 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 = (State *)Tcl_G
11f20 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 etChannelInstanc
11f30 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 eData(chan);.
11f40 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 72 2d ssl = statePtr-
11f50 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 >ssl;. if (ss
11f60 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f l != NULL) {..co
11f70 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
11f80 72 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 r *proto;..unsig
11f90 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 09 ned int ulen;...
11fa0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f /* Initializatio
11fb0 6e 20 66 69 6e 69 73 68 65 64 20 2a 2f 0a 09 4c n finished */..L
11fc0 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
11fd0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 6e 69 rp, objPtr, "ini
11fe0 74 5f 66 69 6e 69 73 68 65 64 22 2c 20 53 53 4c t_finished", SSL
11ff0 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 _is_init_finishe
12000 64 28 73 73 6c 29 29 3b 0a 09 0a 09 2f 2a 20 63 d(ssl));..../* c
12010 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 onnection state
12020 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
12030 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12040 22 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 "state", SSL_sta
12050 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 te_string_long(s
12060 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 sl), -1);.../* G
12070 65 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 et SNI requested
12080 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a server name */.
12090 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
120a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
120b0 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 rvername", SSL_g
120c0 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 et_servername(ss
120d0 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 l, TLSEXT_NAMETY
120e0 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d PE_host_name), -
120f0 31 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 1);.../* Report
12100 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f the selected pro
12110 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c tocol as a resul
12120 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 t of the negotia
12130 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 67 65 74 tion */..SSL_get
12140 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 0_alpn_selected(
12150 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
12160 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 proto, &ulen);..
12170 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12180 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 rp, objPtr, "alp
12190 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 n", (char *)prot
121a0 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c o, (Tcl_Size) ul
121b0 65 6e 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 en);.../* Get pr
121c0 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 otocol */..LAPPE
121d0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
121e0 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c bjPtr, "protocol
121f0 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 ", SSL_get_versi
12200 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 on(ssl), -1);...
12210 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e /* Renegotiation
12220 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 allowed */..LAP
12230 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 PEND_BOOL(interp
12240 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 , objPtr, "reneg
12250 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 otiation_allowed
12260 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 ", SSL_get_secur
12270 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f e_renegotiation_
12280 73 75 70 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 support((SSL *)
12290 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 ssl));.../* Get
122a0 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a security level *
122b0 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 /..LAPPEND_INT(i
122c0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
122d0 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c security_level",
122e0 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 SSL_get_securit
122f0 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a y_level(ssl));..
12300 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f ./* Session info
12310 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f */..LAPPEND_BOO
12320 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 L(interp, objPtr
12330 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 , "session_reuse
12340 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f d", SSL_session_
12350 72 65 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 reused(ssl));...
12360 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 /* Is server inf
12370 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f o */..LAPPEND_BO
12380 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 OL(interp, objPt
12390 72 2c 20 22 69 73 5f 73 65 72 76 65 72 22 2c 20 r, "is_server",
123a0 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 SSL_is_server(ss
123b0 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c l));.../* Is DTL
123c0 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f S */..LAPPEND_BO
123d0 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 OL(interp, objPt
123e0 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 r, "is_dtls", SS
123f0 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b L_is_dtls(ssl));
12400 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
12410 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 RSION_NUMBER >=
12420 30 78 33 30 32 30 30 30 30 30 4c 0a 09 2f 2a 20 0x30200000L../*
12430 49 73 20 51 55 49 43 20 2a 2f 0a 09 4c 41 50 50 Is QUIC */..LAPP
12440 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
12450 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 71 75 69 objPtr, "is_qui
12460 63 22 2c 20 53 53 4c 5f 69 73 5f 71 75 69 63 28 c", SSL_is_quic(
12470 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 54 ssl));.../* Is T
12480 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 LS */..LAPPEND_B
12490 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
124a0 74 72 2c 20 22 69 73 5f 74 6c 73 22 2c 20 53 53 tr, "is_tls", SS
124b0 4c 5f 69 73 5f 74 6c 73 28 73 73 6c 29 29 3b 0a L_is_tls(ssl));.
124c0 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 44 41 4e 45 #endif.../* DANE
124d0 20 54 4c 53 20 61 75 74 68 65 6e 74 69 63 61 74 TLS authenticat
124e0 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ion */..LAPPEND_
124f0 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
12500 50 74 72 2c 20 22 64 61 6e 65 5f 61 75 74 68 22 Ptr, "dane_auth"
12510 2c 20 53 53 4c 5f 67 65 74 30 5f 64 61 6e 65 28 , SSL_get0_dane(
12520 73 73 6c 29 20 21 3d 20 4e 55 4c 4c 29 3b 0a 0a ssl) != NULL);..
12530 09 2f 2a 20 57 61 69 74 69 6e 67 20 66 6f 72 20 ./* Waiting for
12540 61 73 79 6e 63 20 2a 2f 0a 09 4c 41 50 50 45 4e async */..LAPPEN
12550 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
12560 62 6a 50 74 72 2c 20 22 77 61 69 74 69 6e 67 5f bjPtr, "waiting_
12570 66 6f 72 5f 61 73 79 6e 63 22 2c 20 53 53 4c 5f for_async", SSL_
12580 77 61 69 74 69 6e 67 5f 66 6f 72 5f 61 73 79 6e waiting_for_asyn
12590 63 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 54 69 c(ssl));.../* Ti
125a0 6d 65 2d 6f 75 74 20 2a 2f 0a 09 4c 41 50 50 45 me-out */..LAPPE
125b0 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
125c0 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 2d 6f 75 objPtr, "time-ou
125d0 74 22 2c 20 53 53 4c 5f 67 65 74 5f 64 65 66 61 t", SSL_get_defa
125e0 75 6c 74 5f 74 69 6d 65 6f 75 74 28 73 73 6c 29 ult_timeout(ssl)
125f0 29 3b 0a 0a 09 2f 2a 20 49 73 20 43 65 72 74 69 );.../* Is Certi
12600 66 69 63 61 74 65 20 54 72 61 6e 73 70 61 72 65 ficate Transpare
12610 6e 63 79 20 76 61 6c 69 64 61 74 69 6f 6e 20 65 ncy validation e
12620 6e 61 62 6c 65 64 20 2a 2f 0a 09 4c 41 50 50 45 nabled */..LAPPE
12630 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
12640 6f 62 6a 50 74 72 2c 20 22 63 74 5f 65 6e 61 62 objPtr, "ct_enab
12650 6c 65 64 22 2c 20 53 53 4c 5f 63 74 5f 69 73 5f led", SSL_ct_is_
12660 65 6e 61 62 6c 65 64 28 73 73 6c 29 29 3b 0a 20 enabled(ssl));.
12670 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 }.. /* Cip
12680 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 her info */.
12690 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 cipher = SSL_get
126a0 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 _current_cipher(
126b0 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 ssl);. if (ci
126c0 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a pher != NULL) {.
126d0 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a .char buf[BUFSIZ
126e0 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 ] = {0};..int bi
126f0 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 ts, alg_bits;...
12700 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a /* Cipher name *
12710 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
12720 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12730 63 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 cipher", SSL_CIP
12740 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 HER_get_name(cip
12750 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 her), -1);.../*
12760 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 RFC name of ciph
12770 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 er */..LAPPEND_S
12780 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12790 72 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d r, "standard_nam
127a0 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 e", SSL_CIPHER_s
127b0 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 tandard_name(cip
127c0 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 her), -1);.../*
127d0 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 OpenSSL name of
127e0 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 cipher */..LAPPE
127f0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
12800 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f bjPtr, "openssl_
12810 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 name", OPENSSL_c
12820 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 ipher_name(SSL_C
12830 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e IPHER_standard_n
12840 61 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31 ame(cipher)), -1
12850 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f );.../* number o
12860 66 20 73 65 63 72 65 74 20 62 69 74 73 20 75 73 f secret bits us
12870 65 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f ed for cipher */
12880 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 ..bits = SSL_CIP
12890 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 HER_get_bits(cip
128a0 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b her, &alg_bits);
128b0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
128c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
128d0 65 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74 ecret_bits", bit
128e0 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 s);..LAPPEND_INT
128f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12900 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 "algorithm_bits
12910 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f ", alg_bits);../
12920 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 * alg_bits is ac
12930 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 tual key secret
12940 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 bits. If use bit
12950 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c s and secret (al
12960 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 gorithm) bits di
12970 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 ffer,.. the re
12980 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 st of the bits a
12990 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 re fixed, i.e. f
129a0 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 or limited expor
129b0 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20 t ciphers (bits
129c0 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e < 56) */.../* In
129d0 64 69 63 61 74 65 73 20 77 68 69 63 68 20 53 53 dicates which SS
129e0 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 L/TLS protocol v
129f0 65 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66 ersion first def
12a00 69 6e 65 64 20 74 68 65 20 63 69 70 68 65 72 20 ined the cipher
12a10 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
12a20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12a30 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 "min_version", S
12a40 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 SL_CIPHER_get_ve
12a50 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d rsion(cipher), -
12a60 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 1);.../* Cipher
12a70 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f NID */..LAPPEND_
12a80 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12a90 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c tr, "cipherNID",
12aa0 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 (char *)OBJ_nid
12ab0 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 2ln(SSL_CIPHER_g
12ac0 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69 et_cipher_nid(ci
12ad0 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 pher)), -1);..LA
12ae0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12af0 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73 , objPtr, "diges
12b00 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f tNID", (char *)O
12b10 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
12b20 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f PHER_get_digest_
12b30 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
12b40 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
12b50 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12b60 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22 "keyExchangeNID"
12b70 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 , (char *)OBJ_ni
12b80 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f d2ln(SSL_CIPHER_
12b90 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 get_kx_nid(ciphe
12ba0 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 r)), -1);..LAPPE
12bb0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
12bc0 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69 bjPtr, "authenti
12bd0 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 cationNID", (cha
12be0 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 r *)OBJ_nid2ln(S
12bf0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75 SL_CIPHER_get_au
12c00 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c th_nid(cipher)),
12c10 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 -1);.../* messa
12c20 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f ge authenticatio
12c30 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20 n code - Cipher
12c40 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43 is AEAD (e.g. GC
12c50 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f M or ChaCha20/Po
12c60 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a ly1305) or not *
12c70 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 /../* Authentica
12c80 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 ted Encryption w
12c90 69 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 64 ith associated d
12ca0 61 74 61 20 28 41 45 41 44 29 20 63 68 65 63 6b ata (AEAD) check
12cb0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f */..LAPPEND_BOO
12cc0 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 L(interp, objPtr
12cd0 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61 , "cipher_is_aea
12ce0 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 d", SSL_CIPHER_i
12cf0 73 5f 61 65 61 64 28 63 69 70 68 65 72 29 29 3b s_aead(cipher));
12d00 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65 .../* Digest use
12d10 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c d during the SSL
12d20 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77 /TLS handshake w
12d30 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69 hen using the ci
12d40 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 pher. */..md = S
12d50 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61 SL_CIPHER_get_ha
12d60 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63 ndshake_digest(c
12d70 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 ipher);..LAPPEND
12d80 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12d90 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f Ptr, "handshake_
12da0 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a digest", (char *
12db0 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 )EVP_MD_name(md)
12dc0 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 , -1);.../* Get
12dd0 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 OpenSSL-specific
12de0 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 ID, not IANA ID
12df0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 */..LAPPEND_INT
12e00 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12e10 20 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69 "cipher_id", (i
12e20 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 nt) SSL_CIPHER_g
12e30 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a et_id(cipher));.
12e40 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 ../* Two-byte ID
12e50 20 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53 used in the TLS
12e60 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 protocol of the
12e70 20 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f given cipher */
12e80 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
12e90 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 terp, objPtr, "p
12ea0 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e rotocol_id", (in
12eb0 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 t) SSL_CIPHER_ge
12ec0 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 t_protocol_id(ci
12ed0 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 pher));.../* Tex
12ee0 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e tual description
12ef0 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a of the cipher *
12f00 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 /..if (SSL_CIPHE
12f10 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 R_description(ci
12f20 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f pher, buf, sizeo
12f30 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 f(buf)) != NULL)
12f40 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f {.. LAPPEND_
12f50 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12f60 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e tr, "description
12f70 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a ", buf, -1);..}.
12f80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
12f90 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 ssion info */.
12fa0 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f session = SSL_
12fb0 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 get_session(ssl)
12fc0 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f ;. if (sessio
12fd0 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f n != NULL) {..co
12fe0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
12ff0 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 r *ticket;..size
13000 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e _t len2;..unsign
13010 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f ed int ulen;..co
13020 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
13030 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a r *session_id, *
13040 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 proto;..unsigned
13050 20 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c char buffer[SSL
13060 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f _MAX_MASTER_KEY_
13070 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 LENGTH];.../* Re
13080 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 port the selecte
13090 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 d protocol as a
130a0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c result of the AL
130b0 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a PN negotiation *
130c0 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 /..SSL_SESSION_g
130d0 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 et0_alpn_selecte
130e0 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 d(session, &prot
130f0 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 o, &len2);..LAPP
13100 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
13110 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 objPtr, "alpn",
13120 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 (char *) proto,
13130 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 (Tcl_Size) len2)
13140 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 ;.../* Report th
13150 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
13160 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
13170 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 of the NPN negot
13180 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 iation */.#ifdef
13190 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 USE_NPN..SSL_ge
131a0 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 t0_next_proto_ne
131b0 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 gotiated(ssl, &p
131c0 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c roto, &ulen);..L
131d0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
131e0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 p, objPtr, "npn"
131f0 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f , (char *) proto
13200 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 , (Tcl_Size) ule
13210 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 n);.#endif.../*
13220 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f Resumable sessio
13230 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f n */..LAPPEND_BO
13240 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 OL(interp, objPt
13250 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 r, "resumable",
13260 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 SSL_SESSION_is_r
13270 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e esumable(session
13280 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e ));.../* Session
13290 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63 start time (sec
132a0 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68 onds since epoch
132b0 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f ) */..LAPPEND_LO
132c0 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NG(interp, objPt
132d0 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c r, "start_time",
132e0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
132f0 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b _time(session));
13300 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 .../* Timeout va
13310 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 lue - SSL_CTX_ge
13320 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 t_timeout (in se
13330 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 conds) */..LAPPE
13340 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
13350 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 objPtr, "timeout
13360 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 ", SSL_SESSION_g
13370 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 et_timeout(sessi
13380 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 on));.../* Sessi
13390 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 on id - TLSv1.2
133a0 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a and below only *
133b0 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 /..session_id =
133c0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
133d0 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 id(session, &ule
133e0 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 n);..LAPPEND_BAR
133f0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 RAY(interp, objP
13400 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 tr, "session_id"
13410 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 , session_id, (T
13420 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a cl_Size) ulen);.
13430 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e ../* Session con
13440 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e text */..session
13450 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f _id = SSL_SESSIO
13460 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 N_get0_id_contex
13470 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e t(session, &ulen
13480 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
13490 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
134a0 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 r, "session_cont
134b0 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 ext", session_id
134c0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 , (Tcl_Size) ule
134d0 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e n);.../* Session
134e0 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 ticket - client
134f0 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 only */..SSL_SE
13500 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 SSION_get0_ticke
13510 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b t(session, &tick
13520 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 et, &len2);..LAP
13530 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 PEND_BARRAY(inte
13540 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 rp, objPtr, "ses
13550 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 sion_ticket", ti
13560 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 cket, (Tcl_Size)
13570 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 len2);.../* Ses
13580 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 sion ticket life
13590 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 time hint (in se
135a0 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 conds) */..LAPPE
135b0 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
135c0 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d objPtr, "lifetim
135d0 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f e", SSL_SESSION_
135e0 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 get_ticket_lifet
135f0 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e ime_hint(session
13600 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 ));.../* Ticket
13610 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 app data */.#if
13620 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
13630 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
13640 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 000L..SSL_SESSIO
13650 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 N_get0_ticket_ap
13660 70 64 61 74 61 28 28 53 53 4c 5f 53 45 53 53 49 pdata((SSL_SESSI
13670 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 ON *) session, &
13680 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a ticket, &len2);.
13690 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
136a0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
136b0 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 "ticket_app_data
136c0 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f ", ticket, (Tcl_
136d0 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e Size) len2);.#en
136e0 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 dif.../* Get mas
136f0 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 ter key */..len2
13700 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
13710 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 et_master_key(se
13720 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 ssion, buffer, S
13730 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 SL_MAX_MASTER_KE
13740 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 Y_LENGTH);..LAPP
13750 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 END_BARRAY(inter
13760 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 p, objPtr, "mast
13770 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c er_key", buffer,
13780 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
13790 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 );.../* Compress
137a0 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 ion id */..unsig
137b0 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c ned int id = SSL
137c0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d _SESSION_get_com
137d0 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e press_id(session
137e0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
137f0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
13800 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 "compression_id"
13810 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 , id == 1 ? "zli
13820 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 b" : "none", -1)
13830 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
13840 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f Compression info
13850 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 */. if (ssl
13860 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 != NULL) {.#ifde
13870 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 f HAVE_SSL_COMPR
13880 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f ESSION..const CO
13890 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c MP_METHOD *comp,
138a0 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 *expn;..comp =
138b0 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f SSL_get_current_
138c0 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 compression(ssl)
138d0 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 ;..expn = SSL_ge
138e0 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 t_current_expans
138f0 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 ion(ssl);...LAPP
13900 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
13910 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 objPtr, "compres
13920 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 sion", comp ? SS
13930 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 L_COMP_get_name(
13940 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 comp) : "none",
13950 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 -1);..LAPPEND_ST
13960 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
13970 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 , "expansion", e
13980 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 xpn ? SSL_COMP_g
13990 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 et_name(expn) :
139a0 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c "none", -1);.#el
139b0 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 se..LAPPEND_STR(
139c0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
139d0 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 "compression", "
139e0 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 none", -1);..LAP
139f0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
13a00 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 objPtr, "expans
13a10 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 ion", "none", -1
13a20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
13a30 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 . /* Server i
13a40 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f nfo */. {..lo
13a50 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 ng mode = SSL_CT
13a60 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 X_get_session_ca
13a70 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 che_mode(statePt
13a80 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a r->ctx);..char *
13a90 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 msg;...if (mode
13aa0 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
13ab0 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 _OFF) {.. msg
13ac0 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 = "off";..} els
13ad0 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c e if (mode & SSL
13ae0 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 _SESS_CACHE_CLIE
13af0 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d NT) {.. msg =
13b00 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c "client";..} el
13b10 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 se if (mode & SS
13b20 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 L_SESS_CACHE_SER
13b30 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 VER) {.. msg
13b40 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 = "server";..} e
13b50 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 lse if (mode & S
13b60 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f SL_SESS_CACHE_BO
13b70 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d TH) {.. msg =
13b80 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 "both";..} else
13b90 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75 {.. msg = "u
13ba0 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 nknown";..}..LAP
13bb0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
13bc0 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
13bd0 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d n_cache_mode", m
13be0 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a sg, -1);. }..
13bf0 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a /* CA List *
13c00 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 /. /* IF not
13c10 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61 a server, same a
13c20 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f s SSL_get0_peer_
13c30 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76 CA_list. If serv
13c40 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 er same as SSL_C
13c50 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 TX_get_client_CA
13c60 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 _list */. lis
13c70 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 tPtr = Tcl_NewLi
13c80 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
13c90 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 STACK_OF(X50
13ca0 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 9_NAME) *ca_list
13cb0 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69 ;. if ((ca_li
13cc0 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 st = SSL_get_cli
13cd0 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 ent_CA_list(ssl)
13ce0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 ) != NULL) {..ch
13cf0 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a ar buffer[BUFSIZ
13d00 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d ];..for (int i =
13d10 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 0; i < sk_X509_
13d20 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 NAME_num(ca_list
13d30 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 ); i++) {.. X
13d40 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 509_NAME *name =
13d50 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 sk_X509_NAME_va
13d60 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b lue(ca_list, i);
13d70 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 .. if (name)
13d80 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e {...X509_NAME_on
13d90 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 eline(name, buff
13da0 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 er, BUFSIZ);...T
13db0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
13dc0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
13dd0 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 listPtr, Tcl_New
13de0 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 StringObj(buffer
13df0 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 , -1));.. }..
13e00 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 }. }. LAPP
13e10 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 END_OBJ(interp,
13e20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22 objPtr, "caList"
13e30 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 , listPtr);.
13e40 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
13e50 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c rp, objPtr, "caL
13e60 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 istCount", sk_X5
13e70 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 09_NAME_num(ca_l
13e80 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ist));.. Tcl_
13e90 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
13ea0 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
13eb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
13ec0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
13ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
13f10 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d . * VersionObjCm
13f20 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 d -- return vers
13f30 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 ion string from
13f40 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 OpenSSL.. *. * R
13f50 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
13f60 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
13f70 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
13f80 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
13f90 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
13fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fd0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
13fe0 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 ic int.VersionOb
13ff0 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
14000 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
14010 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
14020 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
14030 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
14040 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
14050 6f 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 objPtr;. (voi
14060 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 d) clientData;.
14070 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 63 3b 0a (void) objc;.
14080 20 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 76 3b (void) objv;
14090 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
140a0 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 alled");.. ob
140b0 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 jPtr = Tcl_NewSt
140c0 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f ringObj(OPENSSL_
140d0 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 VERSION_TEXT, -1
140e0 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 );. Tcl_SetOb
140f0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
14100 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 objPtr);.. re
14110 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
14120 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
14130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14160 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
14170 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 MiscObjCmd -- mi
14180 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 sc commands. *.
14190 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
141a0 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
141b0 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
141c0 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
141d0 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
141e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
141f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
14220 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 tatic int.MiscOb
14230 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
14240 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
14250 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
14260 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
14270 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
14280 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f {. static co
14290 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e nst char *comman
142a0 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c ds [] = { "req",
142b0 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 "strreq", NULL
142c0 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d };. enum comm
142d0 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 and { C_REQ, C_S
142e0 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d TRREQ, C_DUMMY }
142f0 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 ;. Tcl_Size c
14300 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 74 md;. int isSt
14310 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 r;. char buff
14320 65 72 5b 31 36 33 38 34 5d 3b 0a 20 20 20 20 28 er[16384];. (
14330 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
14340 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
14350 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
14360 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 f (objc < 2) {..
14370 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
14380 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
14390 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 , "subcommand ?a
143a0 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 rgs?");..return
143b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
143c0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
143d0 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 IndexFromObj(int
143e0 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f erp, objv[1], co
143f0 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 mmands, "command
14400 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 ", 0, &cmd) != T
14410 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
14420 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
14430 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
14440 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 _error();.. i
14450 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 sStr = (cmd == C
14460 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 _STRREQ);. sw
14470 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d itch ((enum comm
14480 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 and) cmd) {..cas
14490 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 e C_REQ:..case C
144a0 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 _STRREQ: {..
144b0 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e EVP_PKEY *pkey=N
144c0 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a ULL;.. X509 *
144d0 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 cert=NULL;..
144e0 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d X509_NAME *name=
144f0 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f NULL;.. Tcl_O
14500 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 bj **listv;..
14510 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b Tcl_Size listc;
14520 0a 09 20 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20 .. int i;...
14530 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c BIO *out=NULL
14540 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f ;... char *k_
14550 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b C="",*k_ST="",*k
14560 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b _L="",*k_O="",*k
14570 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c _OU="",*k_CN="",
14580 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 *k_Email="";..
14590 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a char *keyout,*
145a0 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 pemout,*str;..
145b0 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 int keysize,se
145c0 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b rial=0,days=365;
145d0 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
145e0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
145f0 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 x30000000L..
14600 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 BIGNUM *bne = NU
14610 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 LL;.. RSA *rs
14620 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a a = NULL;.#else.
14630 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 . EVP_PKEY_CT
14640 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 X *ctx = NULL;.#
14650 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 endif... if (
14660 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a (objc<5) || (obj
14670 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 c>6)) {...Tcl_Wr
14680 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
14690 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 p, 2, objv, "key
146a0 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 size keyfile cer
146b0 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a tfile ?info?");.
146c0 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
146d0 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 OR;.. }...
146e0 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 if (Tcl_GetIntF
146f0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
14700 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 bjv[2], &keysize
14710 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
14720 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
14730 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b R;.. }.. k
14740 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 eyout=Tcl_GetStr
14750 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 ing(objv[3]);..
14760 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 pemout=Tcl_Ge
14770 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 tString(objv[4])
14780 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72 ;.. if (isStr
14790 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 ) {...Tcl_SetVar
147a0 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 (interp,keyout,"
147b0 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 ",0);...Tcl_SetV
147c0 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 ar(interp,pemout
147d0 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a ,"",0);.. }..
147e0 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 . if (objc>=6
147f0 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 ) {...if (Tcl_Li
14800 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 stObjGetElements
14810 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d (interp, objv[5]
14820 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 , &listc, &listv
14830 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
14840 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
14850 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 ERROR;...}....if
14860 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 ((listc%2) != 0
14870 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 ) {... Tcl_Se
14880 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
14890 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 Information list
148a0 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 must have even
148b0 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 number of argume
148c0 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 nts",NULL);...
148d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
148e0 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 OR;...}...for (i
148f0 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d =0; i<listc; i+=
14900 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 2) {... str=T
14910 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
14920 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 tv[i]);... if
14930 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 (strcmp(str,"da
14940 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 ys")==0) {....if
14950 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
14960 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
14970 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 [i+1],&days)!=TC
14980 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 L_OK).... ret
14990 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
149a0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
149b0 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 strcmp(str,"seri
149c0 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 al")==0) {....if
149d0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
149e0 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
149f0 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d [i+1],&serial)!=
14a00 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 TCL_OK).... r
14a10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
14a20 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
14a30 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 (strcmp(str,"C"
14a40 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 )==0) {....k_C=T
14a50 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
14a60 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
14a70 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
14a80 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 p(str,"ST")==0)
14a90 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 {....k_ST=Tcl_Ge
14aa0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
14ab0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
14ac0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
14ad0 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ,"L")==0) {....k
14ae0 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 _L=Tcl_GetString
14af0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
14b00 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
14b10 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d trcmp(str,"O")==
14b20 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 0) {....k_O=Tcl_
14b30 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
14b40 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
14b50 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
14b60 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 tr,"OU")==0) {..
14b70 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 ..k_OU=Tcl_GetSt
14b80 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
14b90 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
14ba0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 f (strcmp(str,"C
14bb0 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 N")==0) {....k_C
14bc0 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 N=Tcl_GetString(
14bd0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
14be0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
14bf0 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 rcmp(str,"Email"
14c00 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 )==0) {....k_Ema
14c10 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 il=Tcl_GetString
14c20 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
14c30 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 } else {....
14c40 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
14c50 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 terp,"Unknown pa
14c60 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a rameter",NULL);.
14c70 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
14c80 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d ROR;... }...}
14c90 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 .. }..#if OPE
14ca0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
14cb0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
14cc0 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f L.. bne = BN_
14cd0 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 new();.. rsa
14ce0 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 = RSA_new();..
14cf0 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 pkey = EVP_PKE
14d00 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 Y_new();.. if
14d10 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (bne == NULL ||
14d20 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 rsa == NULL ||
14d30 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 pkey == NULL ||
14d40 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 !BN_set_word(bne
14d50 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 ,RSA_F4) ||...!R
14d60 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f SA_generate_key_
14d70 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c ex(rsa, keysize,
14d80 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 bne, NULL) || !
14d90 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f EVP_PKEY_assign_
14da0 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 RSA(pkey, rsa))
14db0 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 {...EVP_PKEY_fre
14dc0 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 e(pkey);.../* RS
14dd0 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 A_free(rsa); fre
14de0 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 ed by EVP_PKEY_f
14df0 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 ree */...BN_free
14e00 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 (bne);.#else..
14e10 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 pkey = EVP_RSA
14e20 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 _gen((unsigned i
14e30 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 nt) keysize);..
14e40 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 ctx = EVP_PKE
14e50 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e Y_CTX_new(pkey,N
14e60 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 ULL);.. if (p
14e70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 key == NULL || c
14e80 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 tx == NULL || !E
14e90 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 VP_PKEY_keygen_i
14ea0 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 nit(ctx) ||...!E
14eb0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f VP_PKEY_CTX_set_
14ec0 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 rsa_keygen_bits(
14ed0 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c ctx, keysize) ||
14ee0 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 !EVP_PKEY_keyge
14ef0 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b n(ctx, &pkey)) {
14f00 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
14f10 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b (pkey);...EVP_PK
14f20 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 EY_CTX_free(ctx)
14f30 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 ;.#endif...Tcl_S
14f40 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
14f50 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e "Error generatin
14f60 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e g private key",N
14f70 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 ULL);...return T
14f80 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
14f90 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 else {...if (is
14fa0 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 Str) {... out
14fb0 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d =BIO_new(BIO_s_m
14fc0 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d em());... PEM
14fd0 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 _write_bio_Priva
14fe0 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e teKey(out,pkey,N
14ff0 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c ULL,NULL,0,NULL,
15000 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 NULL);... i=B
15010 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 IO_read(out,buff
15020 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 er,sizeof(buffer
15030 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 )-1);... i=(i
15040 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 <0) ? 0 : i;...
15050 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 buffer[i]='\0
15060 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 ';... Tcl_Set
15070 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
15080 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 t,buffer,0);...
15090 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 BIO_flush(out
150a0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
150b0 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 e(out);...} else
150c0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
150d0 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 _new(BIO_s_file(
150e0 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 ));... BIO_wr
150f0 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 ite_filename(out
15100 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 ,keyout);...
15110 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 PEM_write_bio_Pr
15120 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 ivateKey(out,pke
15130 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 y,NULL,NULL,0,NU
15140 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 LL,NULL);...
15150 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f /* PEM_write_bio
15160 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f _RSAPrivateKey(o
15170 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e ut, rsa, NULL, N
15180 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 ULL, 0, NULL, NU
15190 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 LL); */... BI
151a0 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b O_free_all(out);
151b0 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 .. .}....if ((ce
151c0 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d rt=X509_new())==
151d0 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 NULL) {... Tc
151e0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
151f0 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 rp,"Error genera
15200 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 ting certificate
15210 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b request",NULL);
15220 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f ... EVP_PKEY_
15230 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
15240 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
15250 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
15260 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 000L... BN_fr
15270 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
15280 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
15290 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58 _ERROR;...}....X
152a0 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 509_set_version(
152b0 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f cert,2);...ASN1_
152c0 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 INTEGER_set(X509
152d0 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 _get_serialNumbe
152e0 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b r(cert),serial);
152f0 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 ...X509_gmtime_a
15300 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 dj(X509_getm_not
15310 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b Before(cert),0);
15320 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 ...X509_gmtime_a
15330 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 dj(X509_getm_not
15340 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e After(cert),(lon
15350 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 g)60*60*24*days)
15360 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 ;...X509_set_pub
15370 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a key(cert,pkey);.
15380 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 ...name=X509_get
15390 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 _subject_name(ce
153a0 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d rt);....X509_NAM
153b0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
153c0 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 xt(name,"C", MBS
153d0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
153e0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
153f0 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 *) k_C, -1, -1,
15400 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
15410 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
15420 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 (name,"ST", MBST
15430 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
15440 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
15450 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 ) k_ST, -1, -1,
15460 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
15470 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
15480 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 (name,"L", MBSTR
15490 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
154a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
154b0 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_L, -1, -1, 0)
154c0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
154d0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
154e0 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e ame,"O", MBSTRIN
154f0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
15500 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
15510 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a _O, -1, -1, 0);.
15520 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
15530 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
15540 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 e,"OU", MBSTRING
15550 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
15560 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
15570 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a OU, -1, -1, 0);.
15580 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
15590 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
155a0 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 e,"CN", MBSTRING
155b0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
155c0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
155d0 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a CN, -1, -1, 0);.
155e0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
155f0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
15600 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 e,"Email", MBSTR
15610 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
15620 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
15630 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 k_Email, -1, -1
15640 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 , 0);....X509_se
15650 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 t_subject_name(c
15660 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 ert,name);....if
15670 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 (!X509_sign(cer
15680 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 t,pkey,EVP_sha25
15690 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 6())) {... X5
156a0 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09_free(cert);..
156b0 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 . EVP_PKEY_fr
156c0 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 ee(pkey);.#if OP
156d0 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
156e0 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
156f0 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 0L... BN_free
15700 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 (bne);.#endif...
15710 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
15720 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
15730 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 signing certific
15740 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 ate",NULL);...
15750 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
15760 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 OR;...}....if (i
15770 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 sStr) {... ou
15780 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
15790 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 mem());... PE
157a0 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 M_write_bio_X509
157b0 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 (out,cert);...
157c0 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 i=BIO_read(out
157d0 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 ,buffer,sizeof(b
157e0 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 uffer)-1);...
157f0 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 i=(i<0) ? 0 : i
15800 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 ;... buffer[i
15810 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 ]='\0';... Tc
15820 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
15830 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 pemout,buffer,0)
15840 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 ;... BIO_flus
15850 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 h(out);... BI
15860 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d O_free(out);...}
15870 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 else {... ou
15880 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
15890 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 file());... B
158a0 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d IO_write_filenam
158b0 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 e(out,pemout);..
158c0 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
158d0 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
158e0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
158f0 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a e_all(out);...}.
15900 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 ...X509_free(cer
15910 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 t);...EVP_PKEY_f
15920 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f ree(pkey);.#if O
15930 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
15940 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
15950 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 00L...BN_free(bn
15960 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 e);.#endif..
15970 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 }..}..break;.
15980 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b default:..break
15990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
159a0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
159b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
159c0 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 ****/./* Init
159d0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a */./**
159e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
159f0 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d **/../*. *------
15a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a10 2d 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 0a 20 2a -------------. *
15a40 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a . * Tls_Free --.
15a50 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
15a60 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 dure cleans up w
15a70 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 hen a SSL socket
15a80 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 based channel.
15a90 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 *.is closed and
15aa0 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f its reference co
15ab0 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 unt falls below
15ac0 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 1. *. * Results:
15ad0 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.none. *. * S
15ae0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
15af0 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 Frees all the st
15b00 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ate. *. *-------
15b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
15b50 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 74 .void.Tls_Free(t
15b60 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 62 6c ls_free_type *bl
15b70 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74 ockPtr) {. St
15b80 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
15b90 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 (State *)blockPt
15ba0 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 r;.. dprintf(
15bb0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
15bc0 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 Tls_Clean(stateP
15bd0 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 tr);. ckfree(
15be0 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f blockPtr);.}.../
15bf0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
15c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c30 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
15c40 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a s_Clean --. *. *
15c50 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
15c60 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 cleans up when a
15c70 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
15c80 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 d channel. *.is
15c90 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 closed and its r
15ca0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 eference count f
15cb0 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 alls below 1. T
15cc0 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 his should. *.be
15cd0 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e called synchron
15ce0 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f ously by the Clo
15cf0 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 seProc, not in t
15d00 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 he. *.Eventually
15d10 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 Free callback..
15d20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
15d30 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .none. *. * Side
15d40 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 effects:. *.Fre
15d50 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 es all the state
15d60 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
15d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
15db0 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 id Tls_Clean(Sta
15dc0 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a te *statePtr) {.
15dd0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
15de0 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
15df0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b statePtr->ssl) {
15e00 0a 09 2f 2a 20 53 65 6e 64 20 63 6c 6f 73 65 5f ../* Send close_
15e10 6e 6f 74 69 66 79 20 6d 65 73 73 61 67 65 20 2a notify message *
15e20 2f 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f /..dprintf("SSL_
15e30 73 68 75 74 64 6f 77 6e 28 25 70 29 22 2c 20 73 shutdown(%p)", s
15e40 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 tatePtr->ssl);..
15e50 2f 2a 20 57 69 6c 6c 20 72 65 74 75 72 6e 20 72 /* Will return r
15e60 65 74 75 72 6e 20 30 20 77 68 69 6c 65 20 73 68 eturn 0 while sh
15e70 75 74 64 6f 77 6e 20 69 6e 20 70 72 6f 63 65 73 utdown in proces
15e80 73 2c 20 74 68 65 6e 20 31 20 77 68 65 6e 20 63 s, then 1 when c
15e90 6f 6d 70 6c 65 74 65 20 2a 2f 0a 09 2f 2a 20 63 omplete */../* c
15ea0 6c 6f 73 65 73 20 74 68 65 20 77 72 69 74 65 20 loses the write
15eb0 64 69 72 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 direction of the
15ec0 20 63 6f 6e 6e 65 63 74 69 6f 6e 3b 20 74 68 65 connection; the
15ed0 20 72 65 61 64 20 64 69 72 65 63 74 69 6f 6e 20 read direction
15ee0 69 73 20 63 6c 6f 73 65 64 20 62 79 20 74 68 65 is closed by the
15ef0 20 70 65 65 72 2e 20 2a 2f 0a 09 2f 2a 20 44 6f peer. */../* Do
15f00 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20 73 6f es not affect so
15f10 63 6b 65 74 20 2a 2f 0a 09 53 53 4c 5f 73 68 75 cket */..SSL_shu
15f20 74 64 6f 77 6e 28 73 74 61 74 65 50 74 72 2d 3e tdown(statePtr->
15f30 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ssl);. }..
15f40 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 /*. * we're
15f50 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 assuming here t
15f60 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 hat we're single
15f70 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a -threaded. *
15f80 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 /. if (stateP
15f90 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 tr->timer != (Tc
15fa0 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 l_TimerToken) NU
15fb0 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 LL) {..Tcl_Delet
15fc0 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 eTimerHandler(st
15fd0 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a atePtr->timer);.
15fe0 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 .statePtr->timer
15ff0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a = NULL;. }..
16000 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 61 /* Remove ca
16010 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 69 llbacks */. i
16020 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
16030 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 lback) {..Tcl_De
16040 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
16050 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
16060 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 .statePtr->callb
16070 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ack = NULL;.
16080 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
16090 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a tr->password) {.
160a0 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
160b0 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 t(statePtr->pass
160c0 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 word);..statePtr
160d0 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c ->password = NUL
160e0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
160f0 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
16100 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 {..Tcl_DecrRefC
16110 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 ount(statePtr->v
16120 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d cmd);..statePtr-
16130 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 >vcmd = NULL;.
16140 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 }.. if (sta
16150 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b tePtr->protos) {
16160 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 ..ckfree(statePt
16170 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 r->protos);..sta
16180 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 tePtr->protos =
16190 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
161a0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 if (statePtr->b
161b0 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 io) {../* This w
161c0 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 ill call SSL_shu
161d0 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 tdown. Bug 14140
161e0 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 45 */..dprintf("
161f0 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 BIO_free_all(%p)
16200 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ", statePtr->bio
16210 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c );..BIO_free_all
16220 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b (statePtr->bio);
16230 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 ..statePtr->bio
16240 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 = NULL;. }..
16250 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
16260 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 >ssl) {..dprintf
16270 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c ("SSL_free(%p)",
16280 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b statePtr->ssl);
16290 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 ..SSL_free(state
162a0 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 Ptr->ssl);..stat
162b0 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c ePtr->ssl = NULL
162c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
162d0 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 (statePtr->ctx)
162e0 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 {..SSL_CTX_free(
162f0 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a statePtr->ctx);.
16300 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d .statePtr->ctx =
16310 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
16320 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 dprintf("Retur
16330 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ning");.}.../*.
16340 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
16350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16380 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 75 -------. *. * Bu
16390 69 6c 64 20 49 6e 66 6f 20 43 6f 6d 6d 61 6e 64 ild Info Command
163a0 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 --. *. *.Create
163b0 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 72 65 74 75 command to retu
163c0 72 6e 20 62 75 69 6c 64 20 69 6e 66 6f 20 66 6f rn build info fo
163d0 72 20 70 61 63 6b 61 67 65 2e 0a 20 2a 0a 20 2a r package.. *. *
163e0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
163f0 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
16400 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 lt. *. * Side ef
16410 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 fects:. *.Create
16420 64 20 62 75 69 6c 64 2d 69 6e 66 6f 20 63 6f 6d d build-info com
16430 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d mand.. *. *-----
16440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16480 2d 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 -. */..#ifndef S
16490 54 52 49 4e 47 49 46 59 0a 23 20 20 64 65 66 69 TRINGIFY.# defi
164a0 6e 65 20 53 54 52 49 4e 47 49 46 59 28 78 29 20 ne STRINGIFY(x)
164b0 53 54 52 49 4e 47 49 46 59 31 28 78 29 0a 23 20 STRINGIFY1(x).#
164c0 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49 46 define STRINGIF
164d0 59 31 28 78 29 20 23 78 0a 23 65 6e 64 69 66 0a Y1(x) #x.#endif.
164e0 0a 69 6e 74 0a 42 75 69 6c 64 49 6e 66 6f 43 6f .int.BuildInfoCo
164f0 6d 6d 61 6e 64 28 54 63 6c 5f 49 6e 74 65 72 70 mmand(Tcl_Interp
16500 2a 20 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 * interp) {.
16510 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 69 6e 66 6f Tcl_CmdInfo info
16520 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 ;.. if (Tcl_G
16530 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e etCommandInfo(in
16540 74 65 72 70 2c 20 22 3a 3a 74 63 6c 3a 3a 62 75 terp, "::tcl::bu
16550 69 6c 64 2d 69 6e 66 6f 22 2c 20 26 69 6e 66 6f ild-info", &info
16560 29 29 20 7b 0a 09 54 63 6c 5f 43 72 65 61 74 65 )) {..Tcl_Create
16570 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
16580 70 2c 20 22 3a 3a 74 6c 73 3a 3a 62 75 69 6c 64 p, "::tls::build
16590 2d 69 6e 66 6f 22 2c 20 69 6e 66 6f 2e 6f 62 6a -info", info.obj
165a0 50 72 6f 63 2c 20 28 76 6f 69 64 20 2a 29 28 0a Proc, (void *)(.
165b0 09 09 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f ..PACKAGE_VERSIO
165c0 4e 20 22 2b 22 20 53 54 52 49 4e 47 49 46 59 28 N "+" STRINGIFY(
165d0 54 4c 53 5f 56 45 52 53 49 4f 4e 5f 55 55 49 44 TLS_VERSION_UUID
165e0 29 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f ).#if defined(__
165f0 63 6c 61 6e 67 5f 5f 29 20 26 26 20 64 65 66 69 clang__) && defi
16600 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f ned(__clang_majo
16610 72 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 63 6c r__).... ".cl
16620 61 6e 67 2d 22 20 53 54 52 49 4e 47 49 46 59 28 ang-" STRINGIFY(
16630 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 __clang_major__)
16640 0a 23 69 66 20 5f 5f 63 6c 61 6e 67 5f 6d 69 6e .#if __clang_min
16650 6f 72 5f 5f 20 3c 20 31 30 0a 09 09 09 20 20 20 or__ < 10....
16660 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 09 09 20 "0".#endif....
16670 20 20 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 STRINGIFY(__c
16680 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 29 0a 23 65 lang_minor__).#e
16690 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
166a0 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 20 26 26 (__cplusplus) &&
166b0 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f 42 4a 43 !defined(__OBJC
166c0 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 63 70 6c __).... ".cpl
166d0 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 usplus".#endif.#
166e0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 09 09 ifndef NDEBUG...
166f0 09 20 20 20 20 22 2e 64 65 62 75 67 22 0a 23 65 . ".debug".#e
16700 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
16710 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20 d(__clang__) &&
16720 21 64 65 66 69 6e 65 64 28 5f 5f 49 4e 54 45 4c !defined(__INTEL
16730 5f 43 4f 4d 50 49 4c 45 52 29 20 26 26 20 64 65 _COMPILER) && de
16740 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a fined(__GNUC__).
16750 09 09 09 20 20 20 20 22 2e 67 63 63 2d 22 20 53 ... ".gcc-" S
16760 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f TRINGIFY(__GNUC_
16770 5f 29 0a 23 69 66 20 5f 5f 47 4e 55 43 5f 4d 49 _).#if __GNUC_MI
16780 4e 4f 52 5f 5f 20 3c 20 31 30 0a 09 09 09 20 20 NOR__ < 10....
16790 20 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 09 09 "0".#endif....
167a0 20 20 20 20 53 54 52 49 4e 47 49 46 59 28 5f 5f STRINGIFY(__
167b0 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 29 0a 23 65 GNUC_MINOR__).#e
167c0 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 49 4e ndif.#ifdef __IN
167d0 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 0a 09 09 09 TEL_COMPILER....
167e0 20 20 20 20 22 2e 69 63 63 2d 22 20 53 54 52 49 ".icc-" STRI
167f0 4e 47 49 46 59 28 5f 5f 49 4e 54 45 4c 5f 43 4f NGIFY(__INTEL_CO
16800 4d 50 49 4c 45 52 29 0a 23 65 6e 64 69 66 0a 23 MPILER).#endif.#
16810 69 66 64 65 66 20 54 43 4c 5f 4d 45 4d 5f 44 45 ifdef TCL_MEM_DE
16820 42 55 47 0a 09 09 09 20 20 20 20 22 2e 6d 65 6d BUG.... ".mem
16830 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 debug".#endif.#i
16840 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 f defined(_MSC_V
16850 45 52 29 0a 09 09 09 20 20 20 20 22 2e 6d 73 76 ER).... ".msv
16860 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 4d c-" STRINGIFY(_M
16870 53 43 5f 56 45 52 29 0a 23 65 6e 64 69 66 0a 23 SC_VER).#endif.#
16880 69 66 64 65 66 20 55 53 45 5f 4e 4d 41 4b 45 0a ifdef USE_NMAKE.
16890 09 09 09 20 20 20 20 22 2e 6e 6d 61 6b 65 22 0a ... ".nmake".
168a0 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 54 #endif.#ifndef T
168b0 43 4c 5f 43 46 47 5f 4f 50 54 49 4d 49 5a 45 44 CL_CFG_OPTIMIZED
168c0 0a 09 09 09 20 20 20 20 22 2e 6e 6f 2d 6f 70 74 .... ".no-opt
168d0 69 6d 69 7a 65 22 0a 23 65 6e 64 69 66 0a 23 69 imize".#endif.#i
168e0 66 64 65 66 20 5f 5f 4f 42 4a 43 5f 5f 0a 09 09 fdef __OBJC__...
168f0 09 20 20 20 20 22 2e 6f 62 6a 65 63 74 69 76 65 . ".objective
16900 2d 63 22 0a 23 69 66 20 64 65 66 69 6e 65 64 28 -c".#if defined(
16910 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a 09 09 09 __cplusplus)....
16920 20 20 20 20 22 70 6c 75 73 70 6c 75 73 22 0a 23 "plusplus".#
16930 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 endif.#endif.#if
16940 64 65 66 20 54 43 4c 5f 43 46 47 5f 50 52 4f 46 def TCL_CFG_PROF
16950 49 4c 45 44 0a 09 09 09 20 20 20 20 22 2e 70 72 ILED.... ".pr
16960 6f 66 69 6c 65 22 0a 23 65 6e 64 69 66 0a 23 69 ofile".#endif.#i
16970 66 64 65 66 20 50 55 52 49 46 59 0a 09 09 09 20 fdef PURIFY....
16980 20 20 20 22 2e 70 75 72 69 66 79 22 0a 23 65 6e ".purify".#en
16990 64 69 66 0a 23 69 66 64 65 66 20 53 54 41 54 49 dif.#ifdef STATI
169a0 43 5f 42 55 49 4c 44 0a 09 09 09 20 20 20 20 22 C_BUILD.... "
169b0 2e 73 74 61 74 69 63 22 0a 23 65 6e 64 69 66 0a .static".#endif.
169c0 09 09 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 ..), NULL);.
169d0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c }. return TCL
169e0 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
169f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a20 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 54 6c 73 4c ----*. *. * TlsL
16a30 69 62 53 68 75 74 64 6f 77 6e 20 2d 2d 0a 20 2a ibShutdown --. *
16a40 0a 20 2a 09 53 68 75 74 64 6f 77 6e 20 53 53 4c . *.Shutdown SSL
16a50 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 library once pe
16a60 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a r application. *
16a70 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
16a80 41 20 73 74 61 6e 64 61 72 64 20 54 43 4c 20 72 A standard TCL r
16a90 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 esult. *. * Side
16aa0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 68 75 effects:. *.Shu
16ab0 74 64 6f 77 6e 20 53 53 4c 20 6c 69 62 72 61 72 tdown SSL librar
16ac0 79 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d y. *. *---------
16ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
16b00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c */.static int Tl
16b10 73 4c 69 62 53 68 75 74 64 6f 77 6e 28 43 6c 69 sLibShutdown(Cli
16b20 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
16b30 74 61 29 20 7b 0a 20 20 20 20 42 49 4f 5f 63 6c ta) {. BIO_cl
16b40 65 61 6e 75 70 28 29 3b 0a 20 20 20 20 72 65 74 eanup();. ret
16b50 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f urn TCL_OK;.}../
16b60 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
16b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
16ba0 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a *.TlsLibInit --.
16bb0 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 *. *.Initialize
16bc0 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e s SSL library on
16bd0 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 ce per applicati
16be0 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 on. *. * Results
16bf0 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
16c00 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a Tcl result. *. *
16c10 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
16c20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 *.Initializes SS
16c30 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 2d L library. *. *-
16c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c70 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 -----*. */.stati
16c80 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 c int TlsLibInit
16c90 28 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 () {. static
16ca0 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 int initialized
16cb0 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 = 0;.. dprint
16cc0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
16cd0 20 20 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a if (!initializ
16ce0 65 64 29 20 7b 0a 09 2f 2a 20 49 6e 69 74 69 61 ed) {../* Initia
16cf0 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79 lize BOTH libcry
16d00 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 pto and libssl.
16d10 2a 2f 0a 09 69 66 20 28 21 4f 50 45 4e 53 53 4c */..if (!OPENSSL
16d20 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 _init_ssl(OPENSS
16d30 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f L_INIT_LOAD_SSL_
16d40 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 STRINGS | OPENSS
16d50 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 L_INIT_LOAD_CRYP
16d60 54 4f 5f 53 54 52 49 4e 47 53 0a 09 20 20 20 20 TO_STRINGS..
16d70 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 | OPENSSL_INIT_A
16d80 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c DD_ALL_CIPHERS |
16d90 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 OPENSSL_INIT_AD
16da0 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 0a 09 20 D_ALL_DIGESTS..
16db0 20 20 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 | OPENSSL_INI
16dc0 54 5f 4c 4f 41 44 5f 43 4f 4e 46 49 47 20 7c 20 T_LOAD_CONFIG |
16dd0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 53 59 OPENSSL_INIT_ASY
16de0 4e 43 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09 20 20 NC, NULL)) {..
16df0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
16e00 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 OR;..}.../* Crea
16e10 74 65 20 42 49 4f 20 68 61 6e 64 6c 65 72 73 20 te BIO handlers
16e20 2a 2f 0a 09 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 */..BIO_new_tcl(
16e30 4e 55 4c 4c 2c 20 30 29 3b 0a 09 0a 09 2f 2a 20 NULL, 0);..../*
16e40 43 72 65 61 74 65 20 65 78 69 74 20 68 61 6e 64 Create exit hand
16e50 6c 65 72 20 2a 2f 0a 09 54 63 6c 5f 43 72 65 61 ler */..Tcl_Crea
16e60 74 65 45 78 69 74 48 61 6e 64 6c 65 72 28 54 6c teExitHandler(Tl
16e70 73 4c 69 62 53 68 75 74 64 6f 77 6e 2c 20 4e 55 sLibShutdown, NU
16e80 4c 4c 29 3b 0a 09 69 6e 69 74 69 61 6c 69 7a 65 LL);..initialize
16e90 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 d = 1;. }.
16ea0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
16eb0 7d 0a 0c 0a 2f 2a 20 49 6e 69 74 20 73 63 72 69 }.../* Init scri
16ec0 70 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e pt */.static con
16ed0 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e st char tlsTclIn
16ee0 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 itScript[] = {.#
16ef0 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c include "tls.tcl
16f00 2e 68 22 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d .h".};../*. *---
16f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f50 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 . *. * Tls_Init
16f60 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 --. *. *.This is
16f70 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 a package initi
16f80 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 alization proced
16f90 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 ure, which is ca
16fa0 6c 6c 65 64 0a 20 2a 09 62 79 20 54 43 4c 20 77 lled. *.by TCL w
16fb0 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 hen this package
16fc0 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 is to be added
16fd0 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 to an interprete
16fe0 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 r.. *. * Results
16ff0 3a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 :. *.Initializes
17000 20 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 structures and
17010 63 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73 creates commands
17020 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
17030 65 63 74 73 3a 0a 20 2a 09 20 43 72 65 61 74 65 ects:. *. Create
17040 20 74 68 65 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a the commands. *
17050 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
17060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17090 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 20 ------. */..#if
170a0 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
170b0 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 N > 8.#define MI
170c0 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a N_VERSION "9.0".
170d0 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 #else.#define MI
170e0 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a N_VERSION "8.5".
170f0 23 65 6e 64 69 66 0a 0a 44 4c 4c 45 58 50 4f 52 #endif..DLLEXPOR
17100 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 T int Tls_Init(T
17110 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
17120 70 29 20 7b 0a 0a 20 20 20 20 64 70 72 69 6e 74 p) {.. dprint
17130 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 f("Called");..#i
17140 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 fdef USE_TCL_STU
17150 42 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 BS. if (Tcl_I
17160 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c nitStubs(interp,
17170 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 MIN_VERSION, 0)
17180 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
17190 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
171a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 }.#endif.
171b0 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 if (Tcl_PkgRequi
171c0 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 re(interp, "Tcl"
171d0 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 , MIN_VERSION, 0
171e0 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 ) == NULL) {..re
171f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
17200 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 }.. if (T
17210 6c 73 4c 69 62 49 6e 69 74 28 29 20 21 3d 20 54 lsLibInit() != T
17220 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 CL_OK) {..Tcl_Ap
17230 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
17240 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e p, "could not in
17250 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 itialize SSL lib
17260 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29 20 rary", (char *)
17270 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
17280 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
17290 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
172a0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
172b0 2c 20 22 3a 3a 74 6c 73 3a 3a 63 69 70 68 65 72 , "::tls::cipher
172c0 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d s", CiphersObjCm
172d0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
172e0 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
172f0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
17300 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
17310 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
17320 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e rp, "::tls::conn
17330 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 ection", Connect
17340 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 ionInfoObjCmd, (
17350 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
17360 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
17370 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
17380 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
17390 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
173a0 22 3a 3a 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b "::tls::handshak
173b0 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a e", HandshakeObj
173c0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
173d0 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 ) NULL, (Tcl_Cmd
173e0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
173f0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
17400 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
17410 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 69 6d terp, "::tls::im
17420 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a port", ImportObj
17430 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
17440 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 ) NULL, (Tcl_Cmd
17450 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
17460 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
17470 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
17480 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e terp, "::tls::un
17490 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 import", Unimpor
174a0 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 tObjCmd, (Client
174b0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c Data) NULL, (Tcl
174c0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
174d0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
174e0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
174f0 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 d(interp, "::tls
17500 3a 3a 75 6e 73 74 61 63 6b 22 2c 20 55 6e 69 6d ::unstack", Unim
17510 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 portObjCmd, (Cli
17520 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 entData) NULL, (
17530 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
17540 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
17550 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
17560 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a mand(interp, "::
17570 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 tls::status", St
17580 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 atusObjCmd, (Cli
17590 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 entData) NULL, (
175a0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
175b0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
175c0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
175d0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a mand(interp, "::
175e0 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 tls::version", V
175f0 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 ersionObjCmd, (C
17600 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c lientData) NULL,
17610 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
17620 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
17630 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
17640 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
17650 3a 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 ::tls::misc", Mi
17660 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e scObjCmd, (Clien
17670 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 tData) NULL, (Tc
17680 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
17690 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
176a0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
176b0 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c nd(interp, "::tl
176c0 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 s::protocols", P
176d0 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 rotocolsObjCmd,
176e0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c (ClientData) NUL
176f0 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 L, (Tcl_CmdDelet
17700 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
17710 0a 20 20 20 20 42 75 69 6c 64 49 6e 66 6f 43 6f . BuildInfoCo
17720 6d 6d 61 6e 64 28 69 6e 74 65 72 70 29 3b 0a 0a mmand(interp);..
17730 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 20 26 if (interp &
17740 26 20 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 & Tcl_Eval(inter
17750 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 p, tlsTclInitScr
17760 69 70 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ipt) != TCL_OK)
17770 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
17780 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
17790 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 return Tcl_PkgPr
177a0 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50 41 ovide(interp, PA
177b0 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b CKAGE_NAME, PACK
177c0 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a AGE_VERSION);.}.
177d0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
177e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
177f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17810 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 09 ---------. *. *.
17820 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a Tls_SafeInit --.
17830 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 *. *.This is a
17840 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 package initiali
17850 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 zation procedure
17860 20 66 6f 72 20 73 61 66 65 20 69 6e 74 65 72 70 for safe interp
17870 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 s.. *. * Results
17880 3a 0a 20 2a 09 53 61 6d 65 20 61 73 20 6f 66 20 :. *.Same as of
17890 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 'Tls_Init'. *. *
178a0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
178b0 2a 09 53 61 6d 65 20 61 73 20 6f 66 20 27 54 6c *.Same as of 'Tl
178c0 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 2d 2d 2d s_Init'. *. *---
178d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
178e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
178f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17910 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 . */.DLLEXPORT i
17920 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 nt Tls_SafeInit(
17930 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
17940 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 rp) {. dprint
17950 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 f("Called");.
17960 20 72 65 74 75 72 6e 20 54 6c 73 5f 49 6e 69 74 return Tls_Init
17970 28 69 6e 74 65 72 70 29 3b 0a 7d 0a (interp);.}.