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 63 72 65 ifyCallback: cre
2a80: 61 74 65 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d ate callback com
2a90: 6d 61 6e 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 mand");.. /*
2aa0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
2ab0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
2ac0: 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 chan, depth, cer
2ad0: 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 t info list, sta
2ae0: 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 tus, and error a
2af0: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 rgs */. cmdPt
2b00: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
2b10: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
2b20: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
2b30: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2b40: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2b50: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2b60: 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 Obj("verify", -1
2b70: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2b80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2b90: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2ba0: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f ..Tcl_NewStringO
2bb0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
2bc0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
2bd0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
2be0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2bf0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2c00: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
2c10: 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b wIntObj(depth));
2c20: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2c30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2c40: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c terp, cmdPtr, Tl
2c50: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 s_NewX509Obj(int
2c60: 65 72 70 2c 20 63 65 72 74 2c 20 30 29 29 3b 0a erp, cert, 0));.
2c70: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2c80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2c90: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
2ca0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b _NewIntObj(ok));
2cb0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2cc0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2cd0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 terp, cmdPtr,..T
2ce0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2cf0: 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69 (char*)X509_veri
2d00: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 fy_cert_error_st
2d10: 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b ring(err), -1));
2d20: 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 .. /* Prevent
2d30: 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 I/O while callb
2d40: 61 63 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65 ack is in progre
2d50: 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 ss */. /* sta
2d60: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 tePtr->flags |=
2d70: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b TLS_TCL_CALLBACK
2d80: 3b 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 ; */.. dprint
2d90: 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 f("VerifyCallbac
2da0: 6b 3a 20 65 76 61 6c 20 63 61 6c 6c 62 61 63 6b k: eval callback
2db0: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c ");.. /* Eval
2dc0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
2dd0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
2de0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
2df0: 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c );. ok = Eval
2e00: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c Callback(interp,
2e10: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 statePtr, cmdPt
2e20: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 r);. Tcl_Decr
2e30: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
2e40: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
2e50: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 VerifyCallback:
2e60: 63 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74 20 3d command result =
2e70: 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 %d", ok);..
2e80: 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 /* statePtr->fla
2e90: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f gs &= ~(TLS_TCL_
2ea0: 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 CALLBACK); */.
2eb0: 20 20 72 65 74 75 72 6e 20 6f 6b 3b 09 2f 2a 20 return ok;./*
2ec0: 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61 76 By default, leav
2ed0: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75 e verification u
2ee0: 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c nchanged. */.}..
2ef0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2f40: 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a Tls_Error --. *.
2f50: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
2f60: 6b 20 77 69 74 68 20 65 72 72 6f 72 20 6d 65 73 k with error mes
2f70: 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sage.. *. * Side
2f80: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 effects:. *.The
2f90: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 err field of th
2fa0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 e currently oper
2fb0: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 ative State is s
2fc0: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 et. *. to a str
2fd0: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 ing describing t
2fe0: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 he SSL negotiati
2ff0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f on failure reaso
3000: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d n. *. *---------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 ----------. */.v
3050: 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 oid.Tls_Error(St
3060: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 ate *statePtr, c
3070: 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73 67 29 20 onst char *msg)
3080: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 {. Tcl_Interp
3090: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
30a0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
30b0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
30c0: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 , *listPtr;.
30d0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72 unsigned long er
30e0: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d r;. statePtr-
30f0: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 >err = msg;..
3100: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
3110: 20 77 69 74 68 20 6d 65 73 73 61 67 65 20 25 73 with message %s
3120: 22 2c 20 6d 73 67 29 3b 0a 0a 20 20 20 20 69 66 ", msg);.. if
3130: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
3140: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
3150: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
3160: 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 n;. }.. dp
3170: 72 69 6e 74 66 28 22 54 6c 73 5f 45 72 72 6f 72 rintf("Tls_Error
3180: 3a 20 63 72 65 61 74 65 20 63 61 6c 6c 62 61 63 : create callbac
3190: 6b 20 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 20 20 k command");..
31a0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
31b0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 and to eval with
31c0: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d fn, chan, and m
31d0: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 essage args */.
31e0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
31f0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
3200: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
3210: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3220: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3230: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3240: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
3250: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 "error", -1));.
3260: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3270: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3280: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
3290: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
32a0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
32b0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
32c0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
32d0: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 if (msg != NULL)
32e0: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
32f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3300: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
3310: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 _NewStringObj(ms
3320: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 g, -1));.. }
3330: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 else if ((msg =
3340: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63 Tcl_GetString(Tc
3350: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
3360: 6e 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c nterp))) != NULL
3370: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ) {..Tcl_ListObj
3380: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3390: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
33a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
33b0: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d sg, -1));.. }
33c0: 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72 else {..listPtr
33d0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
33e0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 j(0, NULL);..whi
33f0: 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67 le ((err = ERR_g
3400: 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30 et_error()) != 0
3410: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
3420: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3430: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 t(interp, listPt
3440: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
3450: 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65 Obj(ERR_reason_e
3460: 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 rror_string(err)
3470: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f , -1));..}..Tcl_
3480: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3490: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
34a0: 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 Ptr, listPtr);.
34b0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
34c0: 66 28 22 54 6c 73 5f 45 72 72 6f 72 3a 20 65 76 f("Tls_Error: ev
34d0: 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a al callback");..
34e0: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
34f0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
3500: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
3510: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
3520: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 EvalCallback(i
3530: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
3540: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 cmdPtr);. Tc
3550: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
3560: 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 mdPtr);.}.../*.
3570: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35b0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f ----. *. * KeyLo
35c0: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a gCallback --. *.
35d0: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 *.Write receive
35e0: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f d key data to lo
35f0: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 g file.. *. * Si
3600: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
3610: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d one. *. *-------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3660: 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c .void KeyLogCall
3670: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a back(const SSL *
3680: 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 ssl, const char
3690: 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 *line) {. cha
36a0: 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 r *str = getenv(
36b0: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a SSLKEYLOGFILE);.
36c0: 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 FILE *fd;..
36d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
36e0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
36f0: 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 tr) {..fd = fope
3700: 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 n(str, "a");..fp
3710: 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 rintf(fd, "%s\n"
3720: 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 ,line);..fclose(
3730: 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f fd);. }.}.../
3740: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 -------. *. * Pa
3790: 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 ssword Callback
37a0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
37b0: 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 when a password
37c0: 69 73 20 6e 65 65 64 65 64 20 66 6f 72 20 61 20 is needed for a
37d0: 70 72 69 76 61 74 65 20 6b 65 79 20 77 68 65 6e private key when
37e0: 20 6c 6f 61 64 69 6e 67 0a 20 2a 09 6f 72 20 73 loading. *.or s
37f0: 74 6f 72 69 6e 67 20 61 20 50 45 4d 20 63 65 72 toring a PEM cer
3800: 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e tificate with en
3810: 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 cryption. Evals
3820: 63 61 6c 6c 62 61 63 6b 0a 20 2a 09 73 63 72 69 callback. *.scri
3830: 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 pt and returns t
3840: 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 he result as the
3850: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 password string
3860: 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 in buf.. *. * R
3870: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
3880: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
3890: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
38a0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
38b0: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 d). *. * Returns
38c0: 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 :. *.Password si
38d0: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d ze in bytes or -
38e0: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 1 for an error..
38f0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
3940: 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 tic int.Password
3950: 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 Callback(char *b
3960: 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e uf, int size, in
3970: 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a t rwflag, void *
3980: 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 udata) {. Sta
3990: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 te *statePtr.= (
39a0: 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a State *) udata;.
39b0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
39c0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
39d0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
39e0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
39f0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 int code;.
3a00: 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a Tcl_Size len;.
3a10: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
3a20: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 lled");.. /*
3a30: 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 If no callback,
3a40: 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c use default call
3a50: 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 back */. if (
3a60: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
3a70: 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 rd == NULL) {..i
3a80: 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e f (Tcl_EvalEx(in
3a90: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 terp, "tls::pass
3aa0: 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 word", -1, TCL_E
3ab0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 VAL_GLOBAL) == T
3ac0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 CL_OK) {.. ch
3ad0: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 ar *ret = (char
3ae0: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 *) Tcl_GetString
3af0: 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f FromObj(Tcl_GetO
3b00: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 bjResult(interp)
3b10: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 , &len);.. if
3b20: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a (len > (Tcl_Siz
3b30: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 09 6c e) size-1) {...l
3b40: 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 en = (Tcl_Size)
3b50: 73 69 7a 65 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 size-1;.. }..
3b60: 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c strncpy(buf,
3b70: 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c ret, (size_t) l
3b80: 65 6e 29 3b 0a 09 20 20 20 20 62 75 66 5b 6c 65 en);.. buf[le
3b90: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 20 20 20 20 n] = '\0';..
3ba0: 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e return (int) len
3bb0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
3bc0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 return -1;..}.
3bd0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
3be0: 66 28 22 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 f("PasswordCallb
3bf0: 61 63 6b 3a 20 63 72 65 61 74 65 20 63 61 6c 6c ack: create call
3c00: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 22 29 3b 0a back command");.
3c10: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
3c20: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 ommand to eval w
3c30: 69 74 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c 20 ith fn, rwflag,
3c40: 61 6e 64 20 73 69 7a 65 20 61 72 67 73 20 2a 2f and size args */
3c50: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 . cmdPtr = Tc
3c60: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
3c70: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
3c80: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
3c90: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3ca0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3cb0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3cc0: 6a 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 j("password", -1
3cd0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
3ce0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3cf0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3d00: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 Tcl_NewIntObj(r
3d10: 77 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c wflag));. Tcl
3d20: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3d30: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3d40: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 dPtr, Tcl_NewInt
3d50: 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 Obj(size));..
3d60: 20 64 70 72 69 6e 74 66 28 22 50 61 73 73 77 6f dprintf("Passwo
3d70: 72 64 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61 6c rdCallback: eval
3d80: 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 callback");..
3d90: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
3da0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
3db0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 rp);. Tcl_Pre
3dc0: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 serve((ClientDat
3dd0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
3de0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
3df0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 ack command */.
3e00: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
3e10: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
3e20: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c code = Tcl_Eval
3e30: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d ObjEx(interp, cm
3e40: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 dPtr, TCL_EVAL_G
3e50: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 LOBAL);. if (
3e60: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 code != TCL_OK)
3e70: 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 {.#if (TCL_MAJOR
3e80: 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 _VERSION == 8) &
3e90: 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 & (TCL_MINOR_VER
3ea0: 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 SION < 6)..Tcl_B
3eb0: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 ackgroundError(i
3ec0: 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 nterp);.#else..T
3ed0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 cl_BackgroundExc
3ee0: 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 eption(interp, c
3ef0: 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 ode);.#endif.
3f00: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 }. Tcl_DecrR
3f10: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
3f20: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 .. Tcl_Releas
3f30: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
3f40: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f tatePtr);.. /
3f50: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c * If successful,
3f60: 20 70 61 73 73 20 62 61 63 6b 20 70 61 73 73 77 pass back passw
3f70: 6f 72 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74 ord string and t
3f80: 72 75 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c runcate if too l
3f90: 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 ong */. if (c
3fa0: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b ode == TCL_OK) {
3fb0: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 ..char *ret = (c
3fc0: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 har *) Tcl_GetSt
3fd0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f ringFromObj(Tcl_
3fe0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 GetObjResult(int
3ff0: 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 erp), &len);..if
4000: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a (len > (Tcl_Siz
4010: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20 e) size-1) {..
4020: 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a len = (Tcl_Siz
4030: 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 e) size-1;..}..s
4040: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c trncpy(buf, ret,
4050: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a (size_t) len);.
4060: 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 .buf[len] = '\0'
4070: 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 ;..Tcl_Release((
4080: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
4090: 72 70 29 3b 0a 09 72 65 74 75 72 6e 20 28 69 6e rp);..return (in
40a0: 74 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 t) len;. }.
40b0: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 Tcl_Release((C
40c0: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 lientData) inter
40d0: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d p);. return -
40e0: 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 1;.}.../*. *----
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4130: 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 *. * Session Ca
4140: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e llback for Clien
4150: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c ts --. *. *.Call
4160: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 73 65 ed when a new se
4170: 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 ssion is added t
4180: 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 6e 20 o the cache. In
4190: 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 TLS 1.3. *.this
41a0: 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 64 20 may be received
41b0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 multiple times a
41c0: 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 fter the handsha
41d0: 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 ke. For. *.earli
41e0: 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 er versions, thi
41f0: 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76 s will be receiv
4200: 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 61 ed during the ha
4210: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 ndshake.. *.This
4220: 20 69 73 20 74 68 65 20 70 72 65 66 65 72 72 65 is the preferre
4230: 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 d way to obtain
4240: 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 73 73 a resumable sess
4250: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ion.. *. * Resul
4260: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
4270: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
4280: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
4290: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
42a0: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 *. * Return code
42b0: 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 s:. *.0 = error
42c0: 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 77 69 where session wi
42d0: 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c ll be immediatel
42e0: 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 y removed from t
42f0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 he internal cach
4300: 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 65 73 e.. *.1 = succes
4310: 73 20 77 68 65 72 65 20 61 70 70 20 72 65 74 61 s where app reta
4320: 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 ins session in s
4330: 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e ession cache, an
4340: 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f d must call SSL_
4350: 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 SESSION_free() w
4360: 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d hen done.. *. *-
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43b0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
43c0: 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 t.SessionCallbac
43d0: 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f k(SSL *ssl, SSL_
43e0: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e SESSION *session
43f0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
4400: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
4410: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
4420: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a ta((SSL *)ssl);.
4430: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
4440: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
4450: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
4460: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
4470: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
4480: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
4490: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
44a0: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f ned char *sessio
44b0: 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 n_id;. size_t
44c0: 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 len2;. unsig
44d0: 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 ned int ulen;..
44e0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
44f0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
4500: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
4510: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e k == (Tcl_Obj*)N
4520: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
4530: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
4540: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
4550: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl == NULL) {.
4560: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4570: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
4580: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
4590: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
45a0: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e al with fn, chan
45b0: 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 73 65 , session id, se
45c0: 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61 6e ssion ticket, an
45d0: 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67 73 20 d lifetime args
45e0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
45f0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
4600: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
4610: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ack);. Tcl_Li
4620: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4630: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4640: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4650: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d Obj("session", -
4660: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
4670: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4680: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4690: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
46a0: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
46b0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
46c0: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
46d0: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f ;.. /* Sessio
46e0: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 n id */. sess
46f0: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 ion_id = SSL_SES
4700: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 SION_get_id(sess
4710: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 ion, &ulen);.
4720: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4730: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4740: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4750: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 wByteArrayObj(se
4760: 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 ssion_id, (Tcl_S
4770: 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 ize) ulen));..
4780: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 /* Session tic
4790: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 ket */. SSL_S
47a0: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b ESSION_get0_tick
47b0: 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 et(session, &tic
47c0: 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 ket, &len2);.
47d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
47e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
47f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4800: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 wByteArrayObj(ti
4810: 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 cket, (Tcl_Size)
4820: 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a len2));.. /*
4830: 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 Lifetime - numb
4840: 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f er of seconds */
4850: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4860: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4870: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 terp, cmdPtr,..T
4880: 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c cl_NewLongObj((l
4890: 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e ong) SSL_SESSION
48a0: 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 _get_ticket_life
48b0: 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f time_hint(sessio
48c0: 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 n)));.. /* Ev
48d0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
48e0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
48f0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
4900: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c tr);. EvalCal
4910: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
4920: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b atePtr, cmdPtr);
4930: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
4940: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a Count(cmdPtr);..
4950: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 30 20 /* Return 0
4960: 66 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 73 65 for now until se
4970: 73 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 69 ssion handling i
4980: 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 s complete */.
4990: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a return 0;.}...
49a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 --------. *. * A
49f0: 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 LPN Callback for
4a00: 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e Servers and NPN
4a10: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c Callback for Cl
4a20: 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 ients --. *. *.P
4a30: 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 erform protocol
4a40: 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 (http/1.1, h2, h
4a50: 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 3, etc.) selecti
4a60: 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e on for the. *.in
4a70: 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f coming connectio
4a80: 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 n. Called after
4a90: 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 Hello and server
4aa0: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 callbacks.. *.W
4ab0: 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65 here 'out' is se
4ac0: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
4ad0: 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20 and 'in' is the
4ae0: 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20 peer advertised
4af0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 list.. *. * Resu
4b00: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
4b10: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
4b20: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
4b30: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
4b40: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
4b50: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
4b60: 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 T_ERR_OK: ALPN p
4b70: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
4b80: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
4b90: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
4ba0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
4bb0: 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 ERT_FATAL: There
4bc0: 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 was no overlap
4bd0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 between the clie
4be0: 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 nt's. *. supp
4bf0: 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 lied list and th
4c00: 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 e server configu
4c10: 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e ration. The conn
4c20: 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 ection will be a
4c30: 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 borted.. *.SSL_T
4c40: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a LSEXT_ERR_NOACK:
4c50: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e ALPN protocol n
4c60: 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 ot selected, e.g
4c70: 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c ., because no AL
4c80: 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 PN. *. protoc
4c90: 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 ols are configur
4ca0: 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e ed for this conn
4cb0: 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e ection. The conn
4cc0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
4cd0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
4d20: 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 tatic int.ALPNCa
4d30: 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c llback(SSL *ssl,
4d40: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
4d50: 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 char **out, unsi
4d60: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 gned char *outle
4d70: 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e n,..const unsign
4d80: 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 ed char *in, uns
4d90: 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c igned int inlen,
4da0: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 void *arg) {.
4db0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
4dc0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b r = (State*)arg;
4dd0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
4de0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
4df0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
4e00: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
4e10: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 . int code, r
4e20: 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 es;.. dprintf
4e30: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
4e40: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
4e50: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 || arg == NULL)
4e60: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
4e70: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
4e80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
4e90: 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a elect protocol *
4ea0: 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65 /. if (SSL_se
4eb0: 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 lect_next_proto(
4ec0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
4ed0: 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 *) out, outlen,
4ee0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
4ef0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 , statePtr->prot
4f00: 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c os_len,..in, inl
4f10: 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e en) == OPENSSL_N
4f20: 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b PN_NEGOTIATED) {
4f30: 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 ../* Match found
4f40: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 */..res = SSL_T
4f50: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 LSEXT_ERR_OK;.
4f60: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f } else {../* O
4f70: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 PENSSL_NPN_NO_OV
4f80: 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c ERLAP = No overl
4f90: 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 ap, so use first
4fa0: 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e item from clien
4fb0: 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 t protocol list
4fc0: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c */..res = SSL_TL
4fd0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4fe0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
4ff0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d tatePtr->vcmd ==
5000: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 (Tcl_Obj*)NULL)
5010: 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a {..return res;.
5020: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
5030: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
5040: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 eval with fn, ch
5050: 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20 an, depth, cert
5060: 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 info list, statu
5070: 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67 s, and error arg
5080: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 s */. cmdPtr
5090: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
50a0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d bj(statePtr->vcm
50b0: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
50c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
50d0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
50e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
50f0: 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a j("alpn", -1));.
5100: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
5110: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
5120: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
5130: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
5140: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
5150: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
5160: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
5170: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5180: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5190: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
51a0: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73 wStringObj((cons
51b0: 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c 20 t char *) *out,
51c0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
51d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
51e0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
51f0: 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 r, Tcl_NewBoolea
5200: 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f nObj(res == SSL_
5210: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b TLSEXT_ERR_OK));
5220: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
5230: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
5240: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
5250: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
5260: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 if ((code =
5270: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
5280: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
5290: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 mdPtr)) > 1) {..
52a0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
52b0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
52c0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 } else if (code
52d0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 1) {..res = S
52e0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
52f0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
5300: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
5310: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
5320: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
5330: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
5340: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
5350: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d res;.}.../*. *-
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53a0: 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 --. *. * Adverti
53b0: 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c se Protocols Cal
53c0: 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 lback for Next P
53d0: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 rotocol Negotiat
53e0: 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 ion (NPN) in Ser
53f0: 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 verHello --. *.
5400: 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 *.called when a
5410: 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73 TLS server needs
5420: 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f a list of suppo
5430: 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 rted protocols f
5440: 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f or Next. *.Proto
5450: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e col Negotiation.
5460: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
5470: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
5480: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 de effects:. *.
5490: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
54a0: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
54b0: 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 R_OK: NPN protoc
54c0: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 ol selected. The
54d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
54e0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c inues.. *.SSL_TL
54f0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 SEXT_ERR_NOACK:
5500: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 NPN protocol not
5510: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 selected. The c
5520: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
5530: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ues.. *. *------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
5580: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e /.#ifdef USE_NPN
5590: 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 .static int.NPNC
55a0: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
55b0: 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e L *ssl, const un
55c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 signed char **ou
55d0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 t, unsigned int
55e0: 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 *outlen, void *a
55f0: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 rg) {. State
5600: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
5610: 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 te*)arg;.. dp
5620: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
5630: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d .. if (ssl ==
5640: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 NULL || arg ==
5650: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
5660: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
5670: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 OACK;. }..
5680: 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c /* Set protocol
5690: 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 s list */. if
56a0: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 (statePtr->prot
56b0: 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a os != NULL) {..*
56c0: 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e out = statePtr->
56d0: 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e protos;..*outlen
56e0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f = statePtr->pro
56f0: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 tos_len;. } e
5700: 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 lse {..*out = NU
5710: 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 LL;..*outlen = 0
5720: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c ;..return SSL_TL
5730: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
5740: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
5750: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5760: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f OK;.}.#endif.../
5770: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e -------. *. * SN
57c0: 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 I Callback for S
57d0: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 ervers --. *. *.
57e0: 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 Perform server-s
57f0: 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 ide SNI hostname
5800: 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 selection after
5810: 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65 receiving SNI e
5820: 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 xtension. *.in C
5830: 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c lient Hello. Cal
5840: 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 led after hello
5850: 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 callback but bef
5860: 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 ore ALPN callbac
5870: 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 k.. *. * Results
5880: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.None. *. *
5890: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
58a0: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 .Calls callback
58b0: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a (if defined). *.
58c0: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a * Return codes:
58d0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
58e0: 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e RR_OK: SNI hostn
58f0: 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e ame is accepted.
5900: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
5910: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
5920: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 L_TLSEXT_ERR_ALE
5930: 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f RT_FATAL: SNI ho
5940: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 stname is not ac
5950: 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e cepted. The conn
5960: 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 ection. *. is
5970: 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c aborted. Defaul
5980: 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 t for alert is S
5990: 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a SL_AD_UNRECOGNIZ
59a0: 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f ED_NAME.. *.SSL_
59b0: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 TLSEXT_ERR_ALERT
59c0: 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f _WARNING: SNI ho
59d0: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 stname is not ac
59e0: 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 cepted, warning
59f0: 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e alert. *. sen
5a00: 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 t (not supported
5a10: 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 in TLSv1.3). Th
5a20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
5a30: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 tinues.. *.SSL_T
5a40: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a LSEXT_ERR_NOACK:
5a50: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 SNI hostname is
5a60: 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e not accepted an
5a70: 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 d not acknowledg
5a80: 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 ed,. *. e.g.
5a90: 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 if SNI has not b
5aa0: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 een configured.
5ab0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
5ac0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d ontinues.. *. *-
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b10: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
5b20: 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f t.SNICallback(co
5b30: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e nst SSL *ssl, in
5b40: 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a t *alert, void *
5b50: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 arg) {. State
5b60: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
5b70: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 ate*)arg;. Tc
5b80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
5b90: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
5ba0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
5bb0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e *cmdPtr;. in
5bc0: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 t code, res;.
5bd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 const char *ser
5be0: 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a vername = NULL;.
5bf0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
5c00: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
5c10: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 (ssl == NULL ||
5c20: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 arg == NULL) {..
5c30: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
5c40: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
5c50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 }.. /* Only
5c60: 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e works for TLS 1.
5c70: 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 2 and earlier */
5c80: 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 . servername
5c90: 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 = SSL_get_server
5ca0: 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 name(ssl, TLSEXT
5cb0: 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e _NAMETYPE_host_n
5cc0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 ame);. if (!s
5cd0: 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 ervername || ser
5ce0: 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c vername[0] == '\
5cf0: 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 0') {..return SS
5d00: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
5d10: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 CK;. }.. i
5d20: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d f (statePtr->vcm
5d30: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e d == (Tcl_Obj*)N
5d40: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
5d50: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
5d60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
5d70: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
5d80: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
5d90: 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 chan, and server
5da0: 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 name args */.
5db0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
5dc0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
5dd0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
5de0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5df0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5e00: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
5e10: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 wStringObj("sni"
5e20: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
5e30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5e40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5e50: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
5e60: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
5e70: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
5e80: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
5e90: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
5ea0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
5eb0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
5ec0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
5ed0: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 bj(servername ,
5ee0: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 -1));.. /* Ev
5ef0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
5f00: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
5f10: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
5f20: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f tr);. if ((co
5f30: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 de = EvalCallbac
5f40: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
5f50: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 tr, cmdPtr)) > 1
5f60: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 ) {..res = SSL_T
5f70: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
5f80: 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 WARNING;..*alert
5f90: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f = SSL_AD_UNRECO
5fa0: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 GNIZED_NAME; /*
5fb0: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 Not supported by
5fc0: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 TLS 1.3 */.
5fd0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 } else if (code
5fe0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 1) {..res = S
5ff0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
6000: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
6010: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
6020: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
6030: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f ;..*alert = SSL_
6040: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f AD_UNRECOGNIZED_
6050: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 NAME; /* Not sup
6060: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e ported by TLS 1.
6070: 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 3 */. }. T
6080: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
6090: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 cmdPtr);. ret
60a0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a urn res;.}.../*.
60b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60f0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 -----. *. * Clie
6100: 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b ntHello Handshak
6110: 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 e Callback for S
6120: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 ervers --. *. *.
6130: 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74 Used by server t
6140: 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65 o examine the se
6150: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 rver name indica
6160: 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e tion (SNI) exten
6170: 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 sion. *.provided
6180: 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69 by the client i
6190: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63 n order to selec
61a0: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 t an appropriate
61b0: 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a certificate to.
61c0: 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 *.present, and
61d0: 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 make other confi
61e0: 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d guration adjustm
61f0: 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f ents relevant to
6200: 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09 that server. *.
6210: 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e name and its con
6220: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 figuration. This
6230: 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69 includes swappi
6240: 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63 ng out the assoc
6250: 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 iated. *.SSL_CTX
6260: 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 pointer, modify
6270: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 ing the server's
6280: 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74 list of permitt
6290: 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c ed TLS versions,
62a0: 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65 . *.changing the
62b0: 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72 server's cipher
62c0: 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 list in respons
62d0: 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 e to the client'
62e0: 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65 s cipher list, e
62f0: 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 tc.. *.Called be
6300: 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 fore SNI and ALP
6310: 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a N callbacks.. *.
6320: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
6330: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
6340: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
6350: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
6360: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
6370: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
6380: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 L_CLIENT_HELLO_R
6390: 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68 ETRY: suspend th
63a0: 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 e handshake, and
63b0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 the handshake f
63c0: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 unction will ret
63d0: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a urn immediately.
63e0: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 *.SSL_CLIENT_HE
63f0: 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 LLO_ERROR: failu
6400: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f re, terminate co
6410: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c nnection. Set al
6420: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 ert to error cod
6430: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 e.. *.SSL_CLIENT
6440: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 _HELLO_SUCCESS:
6450: 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d success. *. *---
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64a0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
64b0: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53 HelloCallback(SS
64c0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
64d0: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
64e0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
64f0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
6500: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
6510: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
6520: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
6530: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
6540: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
6550: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 , res;. const
6560: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
6570: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
6580: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 igned char *p;.
6590: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 size_t len, r
65a0: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 emaining;.. d
65b0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
65c0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
65d0: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 Ptr->vcmd == (Tc
65e0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
65f0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6600: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b T_HELLO_SUCCESS;
6610: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
6620: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 ssl == (const SS
6630: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 L *)NULL || arg
6640: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 == (void *)NULL)
6650: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 {..return SSL_C
6660: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6670: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6680: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 Get names */.
6690: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e if (!SSL_clien
66a0: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 t_hello_get0_ext
66b0: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 (ssl, TLSEXT_TYP
66c0: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 E_server_name, &
66d0: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c p, &remaining) |
66e0: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 | remaining <= 2
66f0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 ) {..*alert = SS
6700: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f L_R_SSLV3_ALERT_
6710: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 ILLEGAL_PARAMETE
6720: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 R;..return SSL_C
6730: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6740: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6750: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e Extract the len
6760: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c gth of the suppl
6770: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 ied list of name
6780: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 s. */. len =
6790: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 (*(p++) << 8);.
67a0: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 len += *(p++)
67b0: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 ;. if (len +
67c0: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 2 != remaining)
67d0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
67e0: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c R_SSLV3_ALERT_IL
67f0: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b LEGAL_PARAMETER;
6800: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
6810: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
6820: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 . }. remai
6830: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 ning = len;..
6840: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 /* The list in
6850: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 practice only ha
6860: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 s a single eleme
6870: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 nt, so we only c
6880: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 onsider the firs
6890: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 t one. */. if
68a0: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 (remaining == 0
68b0: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 || *p++ != TLSE
68c0: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 XT_NAMETYPE_host
68d0: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 _name) {..*alert
68e0: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
68f0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
6900: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c ROR;..return SSL
6910: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6920: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
6930: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 emaining--;..
6940: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 /* Now we can f
6950: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 inally pull out
6960: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 the byte array w
6970: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 ith the actual h
6980: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 ostname. */.
6990: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d if (remaining <=
69a0: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 2) {..*alert =
69b0: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
69c0: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 T_INTERNAL_ERROR
69d0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
69e0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
69f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 ;. }. len
6a00: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b = (*(p++) << 8);
6a10: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b . len += *(p+
6a20: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 +);. if (len
6a30: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 + 2 > remaining)
6a40: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
6a50: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
6a60: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 NTERNAL_ERROR;..
6a70: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6a80: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
6a90: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
6aa0: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 ng = len;. se
6ab0: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 rvername = (cons
6ac0: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 t char *)p;..
6ad0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
6ae0: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 nd to eval with
6af0: 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 fn, chan, and se
6b00: 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a rver name args *
6b10: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
6b20: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
6b30: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
6b40: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
6b50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
6b60: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
6b70: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
6b80: 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 hello", -1));.
6b90: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
6ba0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
6bb0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
6bc0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
6bd0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
6be0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
6bf0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lf), -1));. T
6c00: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6c10: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
6c20: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
6c30: 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e tringObj(servern
6c40: 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 ame, (Tcl_Size)
6c50: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 len));.. /* E
6c60: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d val callback com
6c70: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f mand */. Tcl_
6c80: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
6c90: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 Ptr);. if ((c
6ca0: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 ode = EvalCallba
6cb0: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ck(interp, state
6cc0: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 Ptr, cmdPtr)) >
6cd0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 1) {..res = SSL_
6ce0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 CLIENT_HELLO_RET
6cf0: 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 RY;..*alert = SS
6d00: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f L_R_TLSV1_ALERT_
6d10: 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a USER_CANCELLED;.
6d20: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
6d30: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 ode == 1) {..res
6d40: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 = SSL_CLIENT_HE
6d50: 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 LLO_SUCCESS;.
6d60: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
6d70: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6d80: 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 O_ERROR;..*alert
6d90: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
6da0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
6db0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 ROR;. }. T
6dc0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
6dd0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 cmdPtr);. ret
6de0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a urn res;.}.../**
6df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6e00: 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 **/./* Commands
6e10: 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a */./****
6e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6e30: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d /../*. *--------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
6e80: 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 * CiphersObjCmd
6e90: 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c -- list availabl
6ea0: 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 e ciphers. *. *.
6eb0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
6ec0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
6ed0: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 cess the "tls::c
6ee0: 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a iphers" command.
6ef0: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c *.to list avail
6f00: 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 able ciphers, ba
6f10: 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f sed upon protoco
6f20: 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 l selected.. *.
6f30: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
6f40: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
6f50: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 ult list.. *. *
6f60: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
6f70: 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 .constructs and
6f80: 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e destroys SSL con
6f90: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a text (CTX). *. *
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fe0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 ---. */.static c
6ff0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f onst char *proto
7000: 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c cols[] = {.."ssl
7010: 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 2", "ssl3", "tls
7020: 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 1", "tls1.1", "t
7030: 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 ls1.2", "tls1.3"
7040: 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 , NULL.};.enum p
7050: 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c rotocol {. TL
7060: 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 S_SSL2, TLS_SSL3
7070: 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f , TLS_TLS1, TLS_
7080: 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 TLS1_1, TLS_TLS1
7090: 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 _2, TLS_TLS1_3,
70a0: 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 TLS_NONE.};..sta
70b0: 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f tic int.CiphersO
70c0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
70d0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
70e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
70f0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
7100: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
7110: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ) {. Tcl_Obj
7120: 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a *objPtr = NULL;.
7130: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 SSL_CTX *ctx
7140: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c = NULL;. SSL
7150: 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *ssl = NULL;.
7160: 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 STACK_OF(SSL_C
7170: 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 IPHER) *sk;.
7180: 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d char buf[BUFSIZ]
7190: 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c ;. int index,
71a0: 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 verbose = 0, us
71b0: 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b e_supported = 0;
71c0: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d . const SSL_M
71d0: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 20 ETHOD *method;.
71e0: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 (void) client
71f0: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e Data;.. dprin
7200: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
7210: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 if ((objc < 2
7220: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 ) || (objc > 4))
7230: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
7240: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
7250: 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 objv, "protocol
7260: 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f ?verbose? ?suppo
7270: 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e rted?");..return
7280: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
7290: 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 }. if (Tcl_Ge
72a0: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e tIndexFromObj(in
72b0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 terp, objv[1], p
72c0: 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f rotocols, "proto
72d0: 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 col", 0, &index)
72e0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
72f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7300: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 . }. if ((
7310: 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c objc > 2) && Tcl
7320: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f _GetBooleanFromO
7330: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
7340: 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d 2], &verbose) !=
7350: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
7360: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7370: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a }. if ((obj
7380: 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65 c > 3) && Tcl_Ge
7390: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 tBooleanFromObj(
73a0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c interp, objv[3],
73b0: 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 &use_supported)
73c0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
73d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
73e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
73f0: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
7400: 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 switch ((enu
7410: 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 m protocol)index
7420: 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 ) {..case TLS_SS
7430: 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f L2:.#if OPENSSL_
7440: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e VERSION_NUMBER >
7450: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c = 0x10100000L ||
7460: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 defined(NO_SSL2
7470: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
7480: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 NSSL_NO_SSL2)..
7490: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
74a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
74b0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
74c0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
74d0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
74e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 *) NULL);.. r
74f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7500: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
7510: 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f od = SSLv2_metho
7520: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
7530: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c if..case TLS_SSL
7540: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 3:.#if defined(N
7550: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e O_SSL3) || defin
7560: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
7570: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f L3) || defined(O
7580: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d PENSSL_NO_SSL3_M
7590: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f ETHOD).. Tcl_
75a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
75b0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
75c0: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
75d0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
75e0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
75f0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
7600: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
7610: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 . method = SS
7620: 4c 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 Lv3_method(); br
7630: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 eak;.#endif..cas
7640: 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 e TLS_TLS1:.#if
7650: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
7660: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7670: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 SSL_NO_TLS1) ||
7680: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7690: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a NO_TLS1_METHOD).
76a0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
76b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
76c0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
76d0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
76e0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
76f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
7700: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
7710: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 R;.#else.. me
7720: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 thod = TLSv1_met
7730: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 hod(); break;.#e
7740: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
7750: 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e LS1_1:.#if defin
7760: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
7770: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
7780: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 _NO_TLS1_1) || d
7790: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
77a0: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 O_TLS1_1_METHOD)
77b0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
77c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
77d0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
77e0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
77f0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
7800: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
7810: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
7820: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
7830: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f ethod = TLSv1_1_
7840: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b method(); break;
7850: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c .#endif..case TL
7860: 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 S_TLS1_2:.#if de
7870: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
7880: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7890: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c SSL_NO_TLS1_2) |
78a0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
78b0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 L_NO_TLS1_2_METH
78c0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 OD).. Tcl_App
78d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
78e0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
78f0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
7900: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
7910: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
7920: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
7930: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
7940: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 method = TLSv1
7950: 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 _2_method(); bre
7960: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
7970: 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 TLS_TLS1_3:.#if
7980: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
7990: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _3) || defined(O
79a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
79b0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ).. Tcl_Appen
79c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
79d0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
79e0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
79f0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 t supported", (c
7a00: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
7a10: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
7a20: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
7a30: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 method = TLS_met
7a40: 68 6f 64 28 29 3b 0a 09 20 20 20 20 53 53 4c 5f hod();.. SSL_
7a50: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 CTX_set_min_prot
7a60: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 o_version(ctx, T
7a70: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a LS1_3_VERSION);.
7a80: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
7a90: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _max_proto_versi
7aa0: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 on(ctx, TLS1_3_V
7ab0: 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 ERSION);.. br
7ac0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 eak;.#endif..def
7ad0: 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65 74 68 6f ault:.. metho
7ae0: 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 d = TLS_method()
7af0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 ;.. break;.
7b00: 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 }.. ctx = S
7b10: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f SL_CTX_new(metho
7b20: 64 29 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20 d);. if (ctx
7b30: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f == NULL) {..Tcl_
7b40: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7b50: 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 erp, GET_ERR_REA
7b60: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
7b70: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
7b80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
7b90: 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e . ssl = SSL_n
7ba0: 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20 ew(ctx);. if
7bb0: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl == NULL) {.
7bc0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
7bd0: 74 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 t(interp, GET_ER
7be0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
7bf0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c r *) NULL);..SSL
7c00: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
7c10: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7c20: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
7c30: 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 Use list and or
7c40: 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20 der as would be
7c50: 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 sent in a Client
7c60: 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 Hello or all ava
7c70: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a ilable ciphers *
7c80: 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75 /. if (use_su
7c90: 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d pported) {..sk =
7ca0: 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 SSL_get1_suppor
7cb0: 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29 ted_ciphers(ssl)
7cc0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
7cd0: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 sk = SSL_get_cip
7ce0: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d hers(ssl);. }
7cf0: 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 .. if (sk !=
7d00: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 NULL) {..if (!ve
7d10: 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 63 6f rbose) {.. co
7d20: 6e 73 74 20 63 68 61 72 20 2a 63 70 3b 0a 09 20 nst char *cp;..
7d30: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
7d40: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
7d50: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 LL);.. for (i
7d60: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b nt i = 0; i < sk
7d70: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 _SSL_CIPHER_num(
7d80: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f sk); i++) {...co
7d90: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a nst SSL_CIPHER *
7da0: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 c = sk_SSL_CIPHE
7db0: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a R_value(sk, i);.
7dc0: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 ..if (c == NULL)
7dd0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a continue;..../*
7de0: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 cipher name or
7df0: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d (NONE) */...cp =
7e00: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
7e10: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 name(c);...if (c
7e20: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b p == NULL) break
7e30: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ;...Tcl_ListObjA
7e40: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
7e50: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
7e60: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 _NewStringObj((c
7e70: 68 61 72 20 2a 29 20 63 70 2c 20 2d 31 29 29 3b har *) cp, -1));
7e80: 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 .. }...} else
7e90: 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d {.. objPtr =
7ea0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
7eb0: 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f j("",0);.. fo
7ec0: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 r (int i = 0; i
7ed0: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f < sk_SSL_CIPHER_
7ee0: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a num(sk); i++) {.
7ef0: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 ..const SSL_CIPH
7f00: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 ER *c = sk_SSL_C
7f10: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 IPHER_value(sk,
7f20: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e i);...if (c == N
7f30: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a ULL) continue;..
7f40: 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73 ../* textual des
7f50: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 cription of the
7f60: 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 cipher */...if (
7f70: 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 SSL_CIPHER_descr
7f80: 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 iption(c, buf, s
7f90: 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e izeof(buf)) != N
7fa0: 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c ULL) {... Tcl
7fb0: 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a _AppendToObj(obj
7fc0: 50 74 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 Ptr, buf, (Tcl_S
7fd0: 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29 ize) strlen(buf)
7fe0: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
7ff0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f Tcl_AppendTo
8000: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b Obj(objPtr, "UNK
8010: 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d NOWN\n", 8);...}
8020: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 .. }..}..if (
8030: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b use_supported) {
8040: 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 .. sk_SSL_CIP
8050: 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d HER_free(sk);..}
8060: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 . }. SSL_f
8070: 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 ree(ssl);. SS
8080: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
8090: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
80a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
80b0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
80c0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
80d0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 50 72 -------. *. * Pr
8120: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d otocolsObjCmd --
8130: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 list available
8140: 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 protocols. *. *.
8150: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
8160: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
8170: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 cess the "tls::p
8180: 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e rotocols" comman
8190: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 d. *.to list ava
81a0: 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 ilable protocols
81b0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
81c0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
81d0: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a cl result list..
81e0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
81f0: 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 ts:. *.none. *.
8200: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8240: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
8250: 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a int.ProtocolsObj
8260: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
8270: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
8280: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
8290: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
82a0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
82b0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f {. Tcl_Obj *o
82c0: 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 bjPtr;. (void
82d0: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
82e0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
82f0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
8300: 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c bjc != 1) {..Tcl
8310: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
8320: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
8330: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
8340: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
8350: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
8360: 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 r();.. objPtr
8370: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
8380: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 j(0, NULL);..#if
8390: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
83a0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
83b0: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 0000L && !define
83c0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 d(NO_SSL2) && !d
83d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
83e0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f O_SSL2). Tcl_
83f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
8400: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
8410: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
8420: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
8430: 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b TLS_SSL2], -1));
8440: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
8450: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 ined(NO_SSL3) &&
8460: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
8470: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 L_NO_SSL3) && !d
8480: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
8490: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 O_SSL3_METHOD).
84a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
84b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
84c0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
84d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
84e0: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d tocols[TLS_SSL3]
84f0: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
8500: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
8510: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
8520: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
8530: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
8540: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 ENSSL_NO_TLS1_ME
8550: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 THOD). Tcl_Li
8560: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
8570: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
8580: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
8590: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
85a0: 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 S_TLS1], -1));.#
85b0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
85c0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
85d0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
85e0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 L_NO_TLS1_1) &&
85f0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
8600: 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f _NO_TLS1_1_METHO
8610: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f D). Tcl_ListO
8620: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
8630: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
8640: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
8650: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 (protocols[TLS_T
8660: 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 LS1_1], -1));.#e
8670: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
8680: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 d(NO_TLS1_2) &&
8690: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
86a0: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 _NO_TLS1_2) && !
86b0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
86c0: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 NO_TLS1_2_METHOD
86d0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
86e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
86f0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
8700: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
8710: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
8720: 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e S1_2], -1));.#en
8730: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
8740: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 (NO_TLS1_3) && !
8750: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8760: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 NO_TLS1_3). T
8770: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
8780: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
8790: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
87a0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
87b0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 ls[TLS_TLS1_3],
87c0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 -1));.#endif..
87d0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
87e0: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
87f0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
8800: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
8810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8850: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 ---. *. * Handsh
8860: 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a akeObjCmd --. *.
8870: 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 *.This command
8880: 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 is used to verif
8890: 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 y whether the ha
88a0: 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c ndshake is compl
88b0: 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 ete. *.or not..
88c0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
88d0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
88e0: 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 result. 1 means
88f0: 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 handshake comple
8900: 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 te, 0 means pend
8910: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ing.. *. * Side
8920: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
8930: 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 force SSL negoti
8940: 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c ation to take pl
8950: 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ace.. *. *------
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
89a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e /.static int Han
89b0: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 dshakeObjCmd(Cli
89c0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
89d0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
89e0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
89f0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
8a00: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
8a10: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
8a20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 /* The c
8a30: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 hannel to set a
8a40: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 mode on. */.
8a50: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
8a60: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e /* clien
8a70: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
8a80: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f socket */. co
8a90: 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 nst char *errStr
8aa0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 = NULL;. int
8ab0: 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e ret = 1;. in
8ac0: 74 20 65 72 72 20 3d 20 30 3b 0a 20 20 20 20 28 t err = 0;. (
8ad0: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
8ae0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
8af0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
8b00: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
8b10: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
8b20: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
8b30: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 v, "channel");..
8b40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
8b50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
8b60: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
8b70: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
8b80: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
8b90: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
8ba0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 (objv[1]), NULL)
8bb0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
8bc0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
8bd0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
8be0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
8bf0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
8c00: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
8c10: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
8c20: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
8c30: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
8c40: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
8c50: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
8c60: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
8c70: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
8c80: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
8c90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
8ca0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
8cb0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
8cc0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 ame(chan),..
8cd0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
8ce0: 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a hannel", (char *
8cf0: 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 ) NULL);..Tcl_Se
8d00: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
8d10: 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 p, "TLS", "HANDS
8d20: 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 HAKE", "CHANNEL"
8d30: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
8d40: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
8d50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
8d60: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 }. stateP
8d70: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 tr = (State *)Tc
8d80: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
8d90: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
8da0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
8db0: 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f lling Tls_WaitFo
8dc0: 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 rConnect");.
8dd0: 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f ret = Tls_WaitFo
8de0: 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 rConnect(statePt
8df0: 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 r, &err, 1);.
8e00: 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 dprintf("Tls_Wa
8e10: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 itForConnect ret
8e20: 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 urned: %i", ret)
8e30: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c ;.. if (ret <
8e40: 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 0 && ((statePtr
8e50: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 ->flags & TLS_TC
8e60: 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 L_ASYNC) && (err
8e70: 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a == EAGAIN))) {.
8e80: 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 .dprintf("Async
8e90: 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 set and err = EA
8ea0: 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 GAIN");..ret = 0
8eb0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
8ec0: 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e (ret < 0) {..lon
8ed0: 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 g result;..errSt
8ee0: 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 r = statePtr->er
8ef0: 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 r;..Tcl_ResetRes
8f00: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 ult(interp);..Tc
8f10: 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b l_SetErrno(err);
8f20: 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c ...if (!errStr |
8f30: 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 | (*errStr == 0)
8f40: 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 ) {.. errStr
8f50: 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 = Tcl_PosixError
8f60: 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 (interp);..}...T
8f70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8f80: 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 interp, "handsha
8f90: 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 ke failed: ", er
8fa0: 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e rStr, (char *) N
8fb0: 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75 ULL);..if ((resu
8fc0: 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 lt = SSL_get_ver
8fd0: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 ify_result(state
8fe0: 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 Ptr->ssl)) != X5
8ff0: 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 09_V_OK) {..
9000: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
9010: 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74 (interp, " due t
9020: 6f 20 5c 22 22 2c 20 58 35 30 39 5f 76 65 72 69 o \"", X509_veri
9030: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 fy_cert_error_st
9040: 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 22 5c ring(result), "\
9050: 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c "", (char *) NUL
9060: 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45 L);..}..Tcl_SetE
9070: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
9080: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 "TLS", "HANDSHA
9090: 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 KE", "FAILED", (
90a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
90b0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
90c0: 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 ng TCL_ERROR wit
90d0: 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c h handshake fail
90e0: 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 ed: %s", errStr)
90f0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
9100: 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ROR;. } else
9110: 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 {..if (err != 0)
9120: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
9130: 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 "Got an error wi
9140: 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 th a completed h
9150: 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 andshake: err =
9160: 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 %i", err);..}..r
9170: 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 et = 1;. }..
9180: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
9190: 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 rning TCL_OK wit
91a0: 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 h data \"%i\"",
91b0: 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ret);. Tcl_Se
91c0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
91d0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a p, Tcl_NewIntObj
91e0: 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75 (ret));. retu
91f0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a rn TCL_OK;.}../*
9200: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
9210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9240: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 ------. *. * Imp
9250: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a ortObjCmd --. *.
9260: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
9270: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
9280: 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c process the "ssl
9290: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 " command. *. *.
92a0: 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 The ssl command
92b0: 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20 pushes SSL over
92c0: 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 a (newly connect
92d0: 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 ed) tcp socket.
92e0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
92f0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
9300: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
9310: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d de effects:. *.M
9320: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 ay modify the be
9330: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 havior of an IO
9340: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d channel.. *. *--
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9390: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
93a0: 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c .ImportObjCmd(Cl
93b0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
93c0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
93d0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
93e0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
93f0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
9400: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
9410: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 ;../* The channe
9420: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
9430: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 on. */. State
9440: 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 *statePtr;../*
9450: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 client state for
9460: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 ssl socket */.
9470: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 SSL_CTX *ctx.
9480: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c .= NULL;. Tcl
9490: 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 09 3d 20 _Obj *script..=
94a0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
94b0: 6a 20 2a 70 61 73 73 77 6f 72 64 09 09 3d 20 4e j *password..= N
94c0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
94d0: 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a *vcmd..= NULL;.
94e0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
94f0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
9500: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 slation, upperCh
9510: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 annelBlocking, u
9520: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
9530: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ing, upperChanne
9540: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e lEOFChar;. in
9550: 74 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 t idx;. Tcl_S
9560: 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 ize len;. int
9570: 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f 54 flags...= TLS_T
9580: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 CL_INIT;. int
9590: 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09 2f server...= 0;./
95a0: 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 * is connection
95b0: 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 incoming or outg
95c0: 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 oing? */. cha
95d0: 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55 r *keyfile..= NU
95e0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 LL;. char *ce
95f0: 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a rtfile..= NULL;.
9600: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
9610: 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a r *key..= NULL;.
9620: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79 Tcl_Size key
9630: 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75 _len..= 0;. u
9640: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 nsigned char *ce
9650: 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 rt..= NULL;.
9660: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 Tcl_Size cert_le
9670: 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 n..= 0;. char
9680: 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55 4c *ciphers..= NUL
9690: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 L;. char *cip
96a0: 68 65 72 73 75 69 74 65 73 09 09 3d 20 4e 55 4c hersuites..= NUL
96b0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 L;. char *CAf
96c0: 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ile..= NULL;.
96d0: 20 63 68 61 72 20 2a 43 41 70 61 74 68 09 09 3d char *CApath..=
96e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
96f0: 2a 43 41 73 74 6f 72 65 09 09 3d 20 4e 55 4c 4c *CAstore..= NULL
9700: 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 ;. char *DHpa
9710: 72 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 rams..= NULL;.
9720: 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 char *model...
9730: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
9740: 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 *servername..=
9750: 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d NULL;./* hostnam
9760: 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d e for Server Nam
9770: 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a e Indication */.
9780: 20 20 20 20 63 68 61 72 20 2a 73 65 73 73 69 6f char *sessio
9790: 6e 5f 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 n_id..= NULL;.
97a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 Tcl_Obj *alpn.
97b0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 .= NULL;. int
97c0: 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 ssl2 = 0, ssl3
97d0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 = 0;. int tls
97e0: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 1 = 1, tls1_1 =
97f0: 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 1, tls1_2 = 1, t
9800: 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 ls1_3 = 1;. i
9810: 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 nt proto = 0, le
9820: 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e vel = -1;. in
9830: 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 t verify = 0, re
9840: 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 quire = 0, reque
9850: 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e st = 1, post_han
9860: 64 73 68 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 dshake = 0;.
9870: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 (void) clientDat
9880: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 a;.. dprintf(
9890: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 "Called");..#if
98a0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
98b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
98c0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 SSL_NO_TLS1).
98d0: 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 tls1 = 0;.#endi
98e0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
98f0: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
9900: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
9910: 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f LS1_1). tls1_
9920: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 1 = 0;.#endif.#i
9930: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
9940: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
9950: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
9960: 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 2). tls1_2 =
9970: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
9980: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
9990: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
99a0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
99b0: 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 tls1_3 = 0;.#
99c0: 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f endif.. if (o
99d0: 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f bjc < 2) {..Tcl_
99e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
99f0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
9a00: 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f hannel ?options?
9a10: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
9a20: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
9a30: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
9a40: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d r();.. chan =
9a50: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
9a60: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
9a70: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 tring(objv[1]),
9a80: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
9a90: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
9aa0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
9ab0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9ac0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
9ad0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
9ae0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
9af0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
9b00: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
9b10: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
9b20: 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d .. for (idx =
9b30: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 2; idx < objc;
9b40: 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a idx++) {..char *
9b50: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 opt = Tcl_GetStr
9b60: 69 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a ing(objv[idx]);.
9b70: 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 ..if (opt[0] !=
9b80: 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b '-').. break;
9b90: 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e ...OPTOBJ("-alpn
9ba0: 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 ", alpn);..OPTST
9bb0: 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 70 61 R("-cadir", CApa
9bc0: 74 68 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 th);..OPTSTR("-c
9bd0: 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b afile", CAfile);
9be0: 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 73 74 6f ..OPTSTR("-casto
9bf0: 72 65 22 2c 20 43 41 73 74 6f 72 65 29 3b 0a 09 re", CAstore);..
9c00: 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c OPTBYTE("-cert",
9c10: 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 cert, cert_len)
9c20: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 ;..OPTSTR("-cert
9c30: 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 file", certfile)
9c40: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 ;..OPTSTR("-ciph
9c50: 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 er", ciphers);..
9c60: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 OPTSTR("-ciphers
9c70: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 ", ciphers);..OP
9c80: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 TSTR("-ciphersui
9c90: 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 tes", ciphersuit
9ca0: 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 es);..OPTOBJ("-c
9cb0: 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 ommand", script)
9cc0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 ;..OPTSTR("-dhpa
9cd0: 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 rams", DHparams)
9ce0: 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 ;..OPTBYTE("-key
9cf0: 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 ", key, key_len)
9d00: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 ;..OPTSTR("-keyf
9d10: 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a ile", keyfile);.
9d20: 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 .OPTSTR("-model"
9d30: 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 , model);..OPTOB
9d40: 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 J("-password", p
9d50: 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f assword);..OPTBO
9d60: 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 OL("-post_handsh
9d70: 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 ake", post_hands
9d80: 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 hake);..OPTBOOL(
9d90: 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 "-request", requ
9da0: 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 est);..OPTBOOL("
9db0: 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 -require", requi
9dc0: 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 re);..OPTINT("-s
9dd0: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 ecurity_level",
9de0: 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c level);..OPTBOOL
9df0: 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 ("-server", serv
9e00: 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 er);..OPTSTR("-s
9e10: 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 ervername", serv
9e20: 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 ername);..OPTSTR
9e30: 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 ("-session_id",
9e40: 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 session_id);..OP
9e50: 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 TBOOL("-ssl2", s
9e60: 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 sl2);..OPTBOOL("
9e70: 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 -ssl3", ssl3);..
9e80: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c OPTBOOL("-tls1",
9e90: 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c tls1);..OPTBOOL
9ea0: 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 ("-tls1.1", tls1
9eb0: 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d _1);..OPTBOOL("-
9ec0: 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 tls1.2", tls1_2)
9ed0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
9ee0: 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 1.3", tls1_3);..
9ef0: 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 OPTOBJ("-validat
9f00: 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 ecommand", vcmd)
9f10: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 ;..OPTOBJ("-vcmd
9f20: 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 ", vcmd);...OPTB
9f30: 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 AD("option", "-a
9f40: 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 lpn, -cadir, -ca
9f50: 66 69 6c 65 2c 20 2d 63 61 73 74 6f 72 65 2c 20 file, -castore,
9f60: 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 -cert, -certfile
9f70: 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 , -cipher, -ciph
9f80: 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 ersuites, -comma
9f90: 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d nd, -dhparams, -
9fa0: 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d key, -keyfile, -
9fb0: 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 model, -password
9fc0: 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b , -post_handshak
9fd0: 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 e, -request, -re
9fe0: 71 75 69 72 65 2c 20 2d 73 65 63 75 72 69 74 79 quire, -security
9ff0: 5f 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c _level, -server,
a000: 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 -servername, -s
a010: 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 ession_id, -ssl2
a020: 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 , -ssl3, -tls1,
a030: 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 -tls1.1, -tls1.2
a040: 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 , -tls1.3, or -v
a050: 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 alidatecommand")
a060: 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;...return TCL_E
a070: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
a080: 69 66 20 28 72 65 71 75 65 73 74 29 09 09 76 65 if (request)..ve
a090: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 rify |= SSL_VERI
a0a0: 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c FY_CLIENT_ONCE |
a0b0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 SSL_VERIFY_PEER
a0c0: 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 ;. if (reques
a0d0: 74 20 26 26 20 72 65 71 75 69 72 65 29 09 76 65 t && require).ve
a0e0: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 rify |= SSL_VERI
a0f0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
a100: 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 ER_CERT;. if
a110: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 (request && post
a120: 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69 _handshake).veri
a130: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 fy |= SSL_VERIFY
a140: 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b _POST_HANDSHAKE;
a150: 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20 . if (verify
a160: 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20 3d 20 == 0)..verify =
a170: 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b SSL_VERIFY_NONE;
a180: 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 .. proto |= (
a190: 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f ssl2 ? TLS_PROTO
a1a0: 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 _SSL2 : 0);.
a1b0: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f proto |= (ssl3 ?
a1c0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 TLS_PROTO_SSL3
a1d0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
a1e0: 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 |= (tls1 ? TLS_P
a1f0: 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a ROTO_TLS1 : 0);.
a200: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
a210: 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f s1_1 ? TLS_PROTO
a220: 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 _TLS1_1 : 0);.
a230: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
a240: 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _2 ? TLS_PROTO_T
a250: 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 LS1_2 : 0);.
a260: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 proto |= (tls1_3
a270: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
a280: 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 1_3 : 0);.. /
a290: 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 * reset to NULL
a2a0: 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 if blank string
a2b0: 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 provided */.
a2c0: 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 if (cert && !*ce
a2d0: 72 74 29 09 09 20 20 20 20 20 20 20 20 63 65 72 rt).. cer
a2e0: 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c t. = NULL
a2f0: 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 ;. if (key &&
a300: 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 !*key)..
a310: 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e key. = N
a320: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 ULL;. if (cer
a330: 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 tfile && !*certf
a340: 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 65 72 ile) cer
a350: 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 tfile.= NULL;.
a360: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 if (keyfile &&
a370: 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 !*keyfile)..key
a380: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e file. = N
a390: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 ULL;. if (cip
a3a0: 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 hers && !*cipher
a3b0: 73 29 09 20 20 20 20 20 20 20 20 63 69 70 68 65 s). ciphe
a3c0: 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c rs. = NUL
a3d0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 L;. if (ciphe
a3e0: 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 rsuites && !*cip
a3f0: 68 65 72 73 75 69 74 65 73 29 20 63 69 70 68 65 hersuites) ciphe
a400: 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c rsuites = NUL
a410: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c L;. if (CAfil
a420: 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 e && !*CAfile).
a430: 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 CAfile.
a440: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
a450: 20 20 69 66 20 28 43 41 70 61 74 68 20 26 26 20 if (CApath &&
a460: 21 2a 43 41 70 61 74 68 29 09 20 20 20 20 20 20 !*CApath).
a470: 20 20 43 41 70 61 74 68 09 20 20 20 20 20 20 20 CApath.
a480: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
a490: 28 43 41 73 74 6f 72 65 20 26 26 20 21 2a 43 41 (CAstore && !*CA
a4a0: 73 74 6f 72 65 29 09 20 20 20 20 20 20 20 20 43 store). C
a4b0: 41 73 74 6f 72 65 09 20 20 20 20 20 20 20 20 3d Astore. =
a4c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 NULL;. if (D
a4d0: 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 Hparams && !*DHp
a4e0: 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 arams). D
a4f0: 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d Hparams =
a500: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e NULL;.. /* n
a510: 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a ew SSL state */.
a520: 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 statePtr..=
a530: 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f (State *) ckallo
a540: 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a c((unsigned) siz
a550: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 eof(State));.
a560: 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 memset(statePtr
a570: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 , 0, sizeof(Stat
a580: 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 e));.. stateP
a590: 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 tr->flags.= flag
a5a0: 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d s;. statePtr-
a5b0: 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 >interp.= interp
a5c0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
a5d0: 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b vflags.= verify;
a5e0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 . statePtr->e
a5f0: 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a rr.= "";.. /*
a600: 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 allocate script
a610: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 */. if (scri
a620: 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 pt) {..(void) Tc
a630: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
a640: 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 bj(script, &len)
a650: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 ;..if (len) {..
a660: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c statePtr->cal
a670: 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a lback = script;.
a680: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
a690: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
a6a0: 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 callback);..}.
a6b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f }.. /* allo
a6c0: 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f cate password */
a6d0: 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 . if (passwor
a6e0: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c d) {..(void) Tcl
a6f0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
a700: 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e j(password, &len
a710: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
a720: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 statePtr->pa
a730: 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 ssword = passwor
a740: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 d;.. Tcl_Incr
a750: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
a760: 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d r->password);..}
a770: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 . }.. /* a
a780: 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 llocate validate
a790: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
a7a0: 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f if (vcmd) {..(vo
a7b0: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e id) Tcl_GetStrin
a7c0: 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 gFromObj(vcmd, &
a7d0: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 len);..if (len)
a7e0: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d {.. statePtr-
a7f0: 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 >vcmd = vcmd;..
a800: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
a810: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 unt(statePtr->vc
a820: 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 md);..}. }..
a830: 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 if (model !=
a840: 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 NULL) {..int mod
a850: 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 e;../* Get the "
a860: 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a model" context *
a870: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 /..chan = Tcl_Ge
a880: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
a890: 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a model, &mode);.
a8a0: 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 .if (chan == (Tc
a8b0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
a8c0: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
a8d0: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 ((tls_free_type
a8e0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
a8f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
a900: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a ROR;..}.../*.. *
a910: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
a920: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
a930: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a most channel.. *
a940: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 /..chan = Tcl_Ge
a950: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
a960: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 );..if (Tcl_GetC
a970: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
a980: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
a990: 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 ype()) {.. Tc
a9a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
a9b0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
a9c0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
a9d0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
a9e0: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
a9f0: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 TLS channel", (c
aa00: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
aa10: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
aa20: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
aa30: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 ", "IMPORT", "CH
aa40: 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 ANNEL", "INVALID
aa50: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
aa60: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 );.. Tls_Free
aa70: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 ((tls_free_type
aa80: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
aa90: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
aaa0: 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 ROR;..}..ctx = (
aab0: 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 (State *)Tcl_Get
aac0: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
aad0: 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b ata(chan))->ctx;
aae0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 . } else {..i
aaf0: 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e f ((ctx = CTX_In
ab00: 69 74 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 it(statePtr, ser
ab10: 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 ver, proto, keyf
ab20: 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b ile, certfile, k
ab30: 65 79 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 ey, cert, key_le
ab40: 6e 2c 0a 09 20 20 20 20 63 65 72 74 5f 6c 65 6e n,.. cert_len
ab50: 2c 20 43 41 70 61 74 68 2c 20 43 41 73 74 6f 72 , CApath, CAstor
ab60: 65 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 e, CAfile, ciphe
ab70: 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 rs, ciphersuites
ab80: 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d , level, DHparam
ab90: 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 s)) == NULL) {..
aba0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c Tls_Free((tl
abb0: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 s_free_type *) s
abc0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
abd0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
abe0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 ..}. }.. s
abf0: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 tatePtr->ctx = c
ac00: 74 78 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 73 tx;.. /* Pres
ac10: 65 72 76 65 20 63 68 61 6e 6e 65 6c 20 63 6f 6e erve channel con
ac20: 66 69 67 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 fig */. Tcl_D
ac30: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
ac40: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
ac50: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ion);. Tcl_DS
ac60: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
ac70: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 ChannelBlocking)
ac80: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
ac90: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e gInit(&upperChan
aca0: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 nelEOFChar);.
acb0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
acc0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e (&upperChannelEn
acd0: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c coding);. Tcl
ace0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
acf0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
ad00: 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 "-eofchar", &upp
ad10: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
ad20: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
ad30: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
ad40: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f rp, chan, "-enco
ad50: 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 ding", &upperCha
ad60: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 nnelEncoding);.
ad70: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
ad80: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
ad90: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 chan, "-translat
ada0: 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e ion", &upperChan
adb0: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b nelTranslation);
adc0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
add0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
ade0: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 , chan, "-blocki
adf0: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e ng", &upperChann
ae00: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 elBlocking);..
ae10: 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 /* Ensure the
ae20: 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e channel works in
ae30: 20 62 69 6e 61 72 79 20 6d 6f 64 65 20 28 66 6f binary mode (fo
ae40: 72 20 74 68 65 20 65 6e 63 72 79 70 74 69 6f 6e r the encryption
ae50: 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 not to get goof
ae60: 65 64 20 75 70 29 2e 20 2a 2f 0a 20 20 20 20 54 ed up). */. T
ae70: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
ae80: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
ae90: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
aea0: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 , "binary");.
aeb0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
aec0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
aed0: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c an, "-blocking",
aee0: 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 0a 20 "true");. .
aef0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 73 74 61 /* Create sta
af00: 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a cked channel */.
af10: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e dprintf("Con
af20: 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e suming Tcl chann
af30: 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 el %s", Tcl_GetC
af40: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
af50: 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d );. statePtr-
af60: 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 >self = Tcl_Stac
af70: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c kChannel(interp,
af80: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
af90: 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 (), (ClientData)
afa0: 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54 43 4c statePtr,..(TCL
afb0: 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f _READABLE | TCL_
afc0: 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 WRITABLE), chan)
afd0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 ;. dprintf("C
afe0: 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e reated channel n
aff0: 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 amed %s", Tcl_Ge
b000: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
b010: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 tePtr->self));.
b020: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
b030: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 >self == (Tcl_Ch
b040: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
b050: 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 /*.. * No use of
b060: 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 Tcl_EventuallyF
b070: 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 ree because no p
b080: 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 ossible Tcl_Pres
b090: 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f erve... */..Tls_
b0a0: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 Free((tls_free_t
b0b0: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 ype *) statePtr)
b0c0: 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ;..Tcl_DStringFr
b0d0: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ee(&upperChannel
b0e0: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 09 54 Translation);..T
b0f0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
b100: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
b110: 64 69 6e 67 29 3b 0a 09 54 63 6c 5f 44 53 74 72 ding);..Tcl_DStr
b120: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 ingFree(&upperCh
b130: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 09 annelEOFChar);..
b140: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
b150: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f &upperChannelBlo
b160: 63 6b 69 6e 67 29 3b 0a 09 72 65 74 75 72 6e 20 cking);..return
b170: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
b180: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65 .. /* Restore
b190: 20 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 channel config
b1a0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 */. Tcl_SetCh
b1b0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
b1c0: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
b1d0: 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f lf, "-translatio
b1e0: 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 n", Tcl_DStringV
b1f0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
b200: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b elTranslation));
b210: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
b220: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
b230: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
b240: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 , "-encoding", T
b250: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
b260: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 &upperChannelEnc
b270: 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c oding));. Tcl
b280: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
b290: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
b2a0: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 tr->self, "-eofc
b2b0: 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e har", Tcl_DStrin
b2c0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
b2d0: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 nnelEOFChar));.
b2e0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
b2f0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
b300: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 statePtr->self,
b310: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c "-blocking", Tcl
b320: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
b330: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
b340: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 44 ing));. Tcl_D
b350: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 StringFree(&uppe
b360: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
b370: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ion);. Tcl_DS
b380: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
b390: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
b3a0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
b3b0: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e gFree(&upperChan
b3c0: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 nelEOFChar);.
b3d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
b3e0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c (&upperChannelBl
b3f0: 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a ocking);.. /*
b400: 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 . * SSL Init
b410: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 ialization.
b420: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
b430: 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 >ssl = SSL_new(s
b440: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 tatePtr->ctx);.
b450: 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72 if (!statePtr
b460: 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c ->ssl) {../* SSL
b470: 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a library error *
b480: 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 /..Tcl_AppendRes
b490: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 ult(interp, "cou
b4a0: 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 ldn't construct
b4b0: 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 ssl session: ",
b4c0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
b4d0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b4e0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
b4f0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
b500: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
b510: 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 "INIT", "FAILED
b520: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
b530: 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 74 6c );..Tls_Free((tl
b540: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 s_free_type *) s
b550: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 tatePtr);..retur
b560: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
b570: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 }.. /* Set h
b580: 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 ost server name
b590: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 */. if (serve
b5a0: 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 rname) {../* Set
b5b0: 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d s the server nam
b5c0: 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e e indication (SN
b5d0: 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c I) in ClientHell
b5e0: 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 o extension */..
b5f0: 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 2c /* Per RFC 6066,
b600: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 hostname is a A
b610: 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 SCII encoded str
b620: 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20 ing, though RFC
b630: 34 33 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e 4366 says UTF-8.
b640: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 */..if (!SSL_se
b650: 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 t_tlsext_host_na
b660: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c me(statePtr->ssl
b670: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 , servername) &&
b680: 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 require) {..
b690: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
b6a0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 53 t(interp, "Set S
b6b0: 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 NI extension fai
b6c0: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f led: ", GET_ERR_
b6d0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
b6e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b6f0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
b700: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
b710: 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 IMPORT", "SNI",
b720: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
b730: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b740: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 ls_Free((tls_fre
b750: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 e_type *) stateP
b760: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
b770: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a TCL_ERROR;..}..
b780: 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 ./* Set hostname
b790: 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 for peer certif
b7a0: 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 icate hostname v
b7b0: 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 erification in c
b7c0: 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 lients... Don'
b7d0: 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 t use SSL_set1_h
b7e0: 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68 61 73 ost since it has
b7f0: 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f limitations. */
b800: 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f ..if (!SSL_add1_
b810: 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 host(statePtr->s
b820: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 sl, servername))
b830: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
b840: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
b850: 20 22 53 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 "Set DNS hostna
b860: 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 me failed: ", GE
b870: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 T_ERR_REASON(),
b880: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
b890: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f . Tcl_SetErro
b8a0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
b8b0: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 LS", "IMPORT", "
b8c0: 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c HOSTNAME", "FAIL
b8d0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
b8e0: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
b8f0: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 ee((tls_free_typ
b900: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a e *) statePtr);.
b910: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
b920: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
b930: 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 . /* Resume s
b940: 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 ession id */.
b950: 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 if (session_id
b960: 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f && strlen(sessio
b970: 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 n_id) <= SSL_MAX
b980: 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 _SID_CTX_LENGTH)
b990: 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 {../* SSL_set_s
b9a0: 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 ession() */..if
b9b0: 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 (!SSL_SESSION_se
b9c0: 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 t1_id_context(SS
b9d0: 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 L_get_session(st
b9e0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 0a 09 09 atePtr->ssl),...
b9f0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
ba00: 63 68 61 72 20 2a 29 20 73 65 73 73 69 6f 6e 5f char *) session_
ba10: 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e id, (unsigned in
ba20: 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f t) strlen(sessio
ba30: 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20 54 n_id))) {.. T
ba40: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
ba50: 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20 interp, "Resume
ba60: 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 session failed:
ba70: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f ", GET_ERR_REASO
ba80: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
ba90: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
baa0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
bab0: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
bac0: 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 T", "SESSION", "
bad0: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
bae0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c ) NULL);.. Tl
baf0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 s_Free((tls_free
bb00: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 _type *) statePt
bb10: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
bb20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
bb30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 }.. /* Enab
bb40: 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c le Application-L
bb50: 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 ayer Protocol Ne
bb60: 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 gotiation. Examp
bb70: 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f 31 2e les are: http/1.
bb80: 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 0,..http/1.1, h2
bb90: 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c , h3, ftp, imap,
bba0: 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 pop3, xmpp-clie
bbb0: 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 2c nt, xmpp-server,
bbc0: 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 63 2e mqtt, irc, etc.
bbd0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 6e */. if (alpn
bbe0: 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 ) {../* Convert
bbf0: 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 a TCL list into
bc00: 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 a protocol-list
bc10: 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a in wire-format *
bc20: 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 /..unsigned char
bc30: 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 *protos, *p;..u
bc40: 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 nsigned int prot
bc50: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c os_len = 0;..Tcl
bc60: 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 _Size cnt, i;..i
bc70: 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a nt j;..Tcl_Obj *
bc80: 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c *list;...if (Tcl
bc90: 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 _ListObjGetEleme
bca0: 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e nts(interp, alpn
bcb0: 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 , &cnt, &list) !
bcc0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
bcd0: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 Tls_Free((tls_f
bce0: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 ree_type *) stat
bcf0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
bd00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
bd10: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 .../* Determine
bd20: 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 the memory requi
bd30: 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 red for the prot
bd40: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f ocol-list */..fo
bd50: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e r (i = 0; i < cn
bd60: 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 t; i++) {.. T
bd70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
bd80: 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 Obj(list[i], &le
bd90: 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e n);.. if (len
bda0: 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f > 255) {...Tcl_
bdb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
bdc0: 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f erp, "ALPN proto
bdd0: 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 6c 6f col names too lo
bde0: 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ng", (char *) NU
bdf0: 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 LL);...Tcl_SetEr
be00: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
be10: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
be20: 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 "ALPN", "FAILED
be30: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
be40: 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 74 );...Tls_Free((t
be50: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 ls_free_type *)
be60: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 statePtr);...ret
be70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
be80: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f }.. proto
be90: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e s_len += 1 + (in
bea0: 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 t) len;..}.../*
beb0: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 Build the comple
bec0: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 te protocol-list
bed0: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b */..protos = ck
bee0: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e alloc(protos_len
bef0: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d );../* protocol-
bf00: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 lists consist of
bf10: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 8-bit length-pr
bf20: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 efixed, byte str
bf30: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 ings */..for (j
bf40: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b = 0, p = protos;
bf50: 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b j < cnt; j++) {
bf60: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 .. char *str
bf70: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
bf80: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 romObj(list[j],
bf90: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b &len);.. *p++
bfa0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 = (unsigned cha
bfb0: 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d r) len;.. mem
bfc0: 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a cpy(p, str, (siz
bfd0: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 e_t) len);..
bfe0: 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f p += len;..}.../
bff0: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 * SSL_set_alpn_p
c000: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f rotos makes a co
c010: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 py of the protoc
c020: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e ol-list */../* N
c030: 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 ote: This functi
c040: 6f 6e 20 72 65 76 65 72 73 65 73 20 74 68 65 20 on reverses the
c050: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e return value con
c060: 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 vention */..if (
c070: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f SSL_set_alpn_pro
c080: 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 tos(statePtr->ss
c090: 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f l, protos, proto
c0a0: 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 s_len)) {.. T
c0b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
c0c0: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c 50 interp, "Set ALP
c0d0: 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c N protocols fail
c0e0: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 ed: ", GET_ERR_R
c0f0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
c100: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 ) NULL);.. Tc
c110: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
c120: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
c130: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 MPORT", "ALPN",
c140: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
c150: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
c160: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 ls_Free((tls_fre
c170: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 e_type *) stateP
c180: 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 tr);.. ckfree
c190: 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 (protos);.. r
c1a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
c1b0: 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 ..}.../* Store p
c1c0: 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f rotocols list */
c1d0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
c1e0: 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 os = protos;..st
c1f0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c atePtr->protos_l
c200: 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b en = protos_len;
c210: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 . } else {..s
c220: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
c230: 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 = NULL;..statePt
c240: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 r->protos_len =
c250: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0;. }.. /*
c260: 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c . * SSL Call
c270: 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 backs. */.
c280: 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 SSL_set_app_da
c290: 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ta(statePtr->ssl
c2a0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
c2b0: 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 tr);./* point ba
c2c0: 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 ck to us */.
c2d0: 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 SSL_set_verify(s
c2e0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 tatePtr->ssl, ve
c2f0: 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c rify, VerifyCall
c300: 62 61 63 6b 29 3b 0a 20 20 20 20 2f 2a 53 53 4c back);. /*SSL
c310: 5f 73 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 _set_verify_dept
c320: 68 28 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 h(SSL_set_verify
c330: 5f 64 65 70 74 68 2c 20 30 29 3b 2a 2f 0a 20 20 _depth, 0);*/.
c340: 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 SSL_set_info_c
c350: 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 allback(statePtr
c360: 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 ->ssl, InfoCallb
c370: 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 ack);.. /* Ca
c380: 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 llback for obser
c390: 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 ving protocol me
c3a0: 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 ssages */.#ifnde
c3b0: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c f OPENSSL_NO_SSL
c3c0: 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f _TRACE. /* vo
c3d0: 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d id SSL_CTX_set_m
c3e0: 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 sg_callback_arg(
c3f0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 statePtr->ctx, (
c400: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
c410: 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 ;. void SSL_C
c420: 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 TX_set_msg_callb
c430: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ack(statePtr->ct
c440: 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 x, MessageCallba
c450: 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f ck); */. SSL_
c460: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
c470: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73 _arg(statePtr->s
c480: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 sl, (void *)stat
c490: 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 ePtr);. SSL_s
c4a0: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 et_msg_callback(
c4b0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d statePtr->ssl, M
c4c0: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b essageCallback);
c4d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
c4e0: 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e Create Tcl_Chann
c4f0: 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a el BIO Handler *
c500: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e /. statePtr->
c510: 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f p_bio.= BIO_new_
c520: 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 tcl(statePtr, BI
c530: 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 O_NOCLOSE);.
c540: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 statePtr->bio.=
c550: 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 BIO_new(BIO_f_ss
c560: 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 l());.. if (s
c570: 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 erver) {../* Ser
c580: 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f ver callbacks */
c590: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c ..SSL_CTX_set_tl
c5a0: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f sext_servername_
c5b0: 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 arg(statePtr->ct
c5c0: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 x, (void *)state
c5d0: 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 Ptr);..SSL_CTX_s
c5e0: 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 et_tlsext_server
c5f0: 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 name_callback(st
c600: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 atePtr->ctx, SNI
c610: 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f Callback);..SSL_
c620: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 CTX_set_client_h
c630: 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 ello_cb(statePtr
c640: 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c ->ctx, HelloCall
c650: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 back, (void *)st
c660: 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74 atePtr);..if (st
c670: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 atePtr->protos !
c680: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 = NULL) {.. S
c690: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f SL_CTX_set_alpn_
c6a0: 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 select_cb(stateP
c6b0: 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c tr->ctx, ALPNCal
c6c0: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 lback, (void *)s
c6d0: 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66 tatePtr);.#ifdef
c6e0: 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 USE_NPN.. if
c6f0: 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 (tls1_2 == 0 &&
c700: 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a tls1_3 == 0) {.
c710: 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 ..SSL_CTX_set_ne
c720: 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 xt_protos_advert
c730: 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 ised_cb(statePtr
c740: 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 ->ctx, NPNCallba
c750: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
c760: 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 ePtr);.. }.#e
c770: 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 ndif..}.../* Ena
c780: 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 ble server to se
c790: 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74 20 nd cert request
c7a0: 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 after handshake
c7b0: 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a (TLS 1.3 only) *
c7c0: 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 /../* A write op
c7d0: 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b eration must tak
c7e0: 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20 e place for the
c7f0: 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71 75 Certificate Requ
c800: 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65 est to be.. se
c810: 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 nt to the client
c820: 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f , this can be do
c830: 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 ne with SSL_do_h
c840: 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 andshake(). */..
c850: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 if (request && p
c860: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 ost_handshake &&
c870: 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 tls1_3) {..
c880: 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e SSL_verify_clien
c890: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 t_post_handshake
c8a0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
c8b0: 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 ..}.../* set aut
c8c0: 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 6c omatic curve sel
c8d0: 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 ection */..SSL_s
c8e0: 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 61 et_ecdh_auto(sta
c8f0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a tePtr->ssl, 1);.
c900: 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20 ../* Set server
c910: 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 mode */..statePt
c920: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f r->flags |= TLS_
c930: 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c TCL_SERVER;..SSL
c940: 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 _set_accept_stat
c950: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
c960: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
c970: 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 /* Client callba
c980: 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 cks */.#ifdef US
c990: 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65 E_NPN..if (state
c9a0: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e Ptr->protos != N
c9b0: 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d ULL && tls1_2 ==
c9c0: 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 0 && tls1_3 ==
c9d0: 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 0) {.. SSL_CT
c9e0: 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f X_set_next_proto
c9f0: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 _select_cb(state
ca00: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 Ptr->ctx, ALPNCa
ca10: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
ca20: 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 statePtr);..}.#e
ca30: 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f ndif.../* Sessio
ca40: 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 n caching */..SS
ca50: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f L_CTX_set_sessio
ca60: 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 n_cache_mode(sta
ca70: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f tePtr->ctx, SSL_
ca80: 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e SESS_CACHE_CLIEN
ca90: 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 T | SSL_SESS_CAC
caa0: 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 HE_NO_INTERNAL_S
cab0: 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f TORE);..SSL_CTX_
cac0: 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 sess_set_new_cb(
cad0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 statePtr->ctx, S
cae0: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b essionCallback);
caf0: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 .../* Enable pos
cb00: 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 t handshake Auth
cb10: 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e entication exten
cb20: 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e sion. TLS 1.3 on
cb30: 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 ly, not http/2.
cb40: 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 */..if (request
cb50: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b && post_handshak
cb60: 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 e) {.. SSL_se
cb70: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 t_post_handshake
cb80: 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e _auth(statePtr->
cb90: 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a ssl, 1);..}.../*
cba0: 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 Set client mode
cbb0: 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e */..SSL_set_con
cbc0: 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 nect_state(state
cbd0: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
cbe0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 42 49 4f .. /* Set BIO
cbf0: 20 66 6f 72 20 72 65 61 64 20 61 6e 64 20 77 72 for read and wr
cc00: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f ite operations o
cc10: 6e 20 53 53 4c 20 6f 62 6a 65 63 74 20 2a 2f 0a n SSL object */.
cc20: 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 SSL_set_bio(
cc30: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 statePtr->ssl, s
cc40: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 tatePtr->p_bio,
cc50: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 statePtr->p_bio)
cc60: 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 ;. BIO_set_ss
cc70: 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c l(statePtr->bio,
cc80: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 statePtr->ssl,
cc90: 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 BIO_NOCLOSE);..
cca0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 /*. * End
ccb0: 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 of SSL Init.
ccc0: 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 */. dprintf
ccd0: 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c ("Returning %s",
cce0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
ccf0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
cd00: 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 lf));. Tcl_Se
cd10: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
cd20: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
cd30: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
cd40: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c ePtr->self), TCL
cd50: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 _VOLATILE);..
cd60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
cd70: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
cd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
cdc0: 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d * UnimportObjCm
cdd0: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 d --. *. *.This
cde0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
cdf0: 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 oked to remove t
ce00: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
ce10: 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a el filter.. *. *
ce20: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
ce30: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
ce40: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
ce50: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d ffects:. *.May m
ce60: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 odify the behavi
ce70: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e or of an IO chan
ce80: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nel.. *. *------
ce90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
ced0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 /.static int.Uni
cee0: 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 mportObjCmd(Clie
cef0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
cf00: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
cf10: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
cf20: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
cf30: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
cf40: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 2c 20 l_Channel chan,
cf50: 70 61 72 65 6e 74 3b 09 2f 2a 20 54 68 65 20 73 parent;./* The s
cf60: 74 61 63 6b 65 64 20 61 6e 64 20 75 6e 64 65 72 tacked and under
cf70: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 73 20 2a lying channels *
cf80: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e /. Tcl_DStrin
cf90: 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 g upperChannelTr
cfa0: 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 anslation, upper
cfb0: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c ChannelBlocking,
cfc0: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 upperChannelEnc
cfd0: 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e oding, upperChan
cfe0: 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 nelEOFChar;.
cff0: 69 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f 4f 4b int res = TCL_OK
d000: 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 ;. (void) cli
d010: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 entData;.. dp
d020: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
d030: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
d040: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 2) {..Tcl_Wron
d050: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
d060: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
d070: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 el");..return TC
d080: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
d090: 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 /* Validate
d0a0: 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 2a 2f 0a channel name */.
d0b0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
d0c0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
d0d0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 , Tcl_GetString(
d0e0: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b objv[1]), NULL);
d0f0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
d100: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
d110: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
d120: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
d130: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
d140: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
d150: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
d160: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
d170: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
d180: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 70 nel(chan);. p
d190: 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 arent = Tcl_GetS
d1a0: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 63 68 tackedChannel(ch
d1b0: 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 an);.. /* Ver
d1c0: 69 66 79 20 69 73 20 61 20 73 74 61 63 6b 65 64 ify is a stacked
d1d0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
d1e0: 69 66 20 28 70 61 72 65 6e 74 20 3d 3d 20 4e 55 if (parent == NU
d1f0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
d200: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
d210: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
d220: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
d230: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c Name(chan),..."\
d240: 22 3a 20 6e 6f 74 20 61 20 73 74 61 63 6b 65 64 ": not a stacked
d250: 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 channel", (char
d260: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
d270: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
d280: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
d290: 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 "UNIMPORT", "CHA
d2a0: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 NNEL", "INVALID"
d2b0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
d2c0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
d2d0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
d2e0: 2f 2a 20 46 6c 75 73 68 20 61 6e 79 20 70 65 6e /* Flush any pen
d2f0: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 20 ding data */.
d300: 20 69 66 20 28 54 63 6c 5f 46 6c 75 73 68 28 63 if (Tcl_Flush(c
d310: 68 61 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 han) != TCL_OK)
d320: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
d330: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
d340: 2f 2a 20 49 6e 69 74 20 73 74 6f 72 61 67 65 20 /* Init storage
d350: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 */. Tcl_DStri
d360: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
d370: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 nnelTranslation)
d380: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
d390: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e gInit(&upperChan
d3a0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 nelBlocking);.
d3b0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
d3c0: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 t(&upperChannelE
d3d0: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c OFChar);. Tcl
d3e0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 _DStringInit(&up
d3f0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
d400: 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 ng);.. /* Pre
d410: 73 65 72 76 65 20 63 75 72 72 65 6e 74 20 63 68 serve current ch
d420: 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a annel config */.
d430: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e Tcl_GetChann
d440: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
d450: 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e chan, "-blockin
d460: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 g", &upperChanne
d470: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 lBlocking);.
d480: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
d490: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
d4a0: 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 n, "-encoding",
d4b0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 &upperChannelEnc
d4c0: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f oding);. Tcl_
d4d0: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
d4e0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
d4f0: 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 -eofchar", &uppe
d500: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
d510: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 ;. Tcl_GetCha
d520: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
d530: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 p, chan, "-trans
d540: 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 lation", &upperC
d550: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
d560: 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 73 74 n);.. /* Unst
d570: 61 63 6b 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 ack the channel
d580: 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 */. if (Tcl_U
d590: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e nstackChannel(in
d5a0: 74 65 72 70 2c 20 63 68 61 6e 29 20 21 3d 20 54 terp, chan) != T
d5b0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 73 20 3d 20 CL_OK) {..res =
d5c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
d5d0: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65 .. /* Restore
d5e0: 20 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 channel config
d5f0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 */. Tcl_SetCh
d600: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
d610: 72 70 2c 20 70 61 72 65 6e 74 2c 20 22 2d 65 6e rp, parent, "-en
d620: 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 coding", Tcl_DSt
d630: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
d640: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
d650: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
d660: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
d670: 72 70 2c 20 70 61 72 65 6e 74 2c 20 22 2d 65 6f rp, parent, "-eo
d680: 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 fchar", Tcl_DStr
d690: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 ingValue(&upperC
d6a0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b hannelEOFChar));
d6b0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
d6c0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
d6d0: 2c 20 70 61 72 65 6e 74 2c 20 22 2d 74 72 61 6e , parent, "-tran
d6e0: 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 slation", Tcl_DS
d6f0: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 tringValue(&uppe
d700: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
d710: 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 ion));. Tcl_S
d720: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
d730: 69 6e 74 65 72 70 2c 20 70 61 72 65 6e 74 2c 20 interp, parent,
d740: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c "-blocking", Tcl
d750: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
d760: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
d770: 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 ing));.. /* C
d780: 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 54 lean-up */. T
d790: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
d7a0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
d7b0: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 slation);. Tc
d7c0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 l_DStringFree(&u
d7d0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
d7e0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ing);. Tcl_DS
d7f0: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
d800: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
d810: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d820: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e Free(&upperChann
d830: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 elBlocking);.
d840: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c return res;.}..
d850: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
d860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
d8a0: 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 CTX_Init -- cons
d8b0: 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 truct a SSL_CTX
d8c0: 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 instance. *. * R
d8d0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c esults:. *.A val
d8e0: 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 id SSL_CTX insta
d8f0: 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a nce or NULL.. *.
d900: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
d910: 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 . *.constructs S
d920: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 SL context (CTX)
d930: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
d940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
d980: 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 atic SSL_CTX *.C
d990: 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 TX_Init(State *s
d9a0: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 tatePtr, int isS
d9b0: 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f erver, int proto
d9c0: 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c , char *keyfile,
d9d0: 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c char *certfile,
d9e0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
d9f0: 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 ar *key, unsigne
da00: 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20 54 63 d char *cert, Tc
da10: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 2c 20 l_Size key_len,
da20: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 Tcl_Size cert_le
da30: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c n, char *CApath,
da40: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 73 74 6f . char *CAsto
da50: 72 65 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 re, char *CAfile
da60: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c , char *ciphers,
da70: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 char *ciphersui
da80: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 tes, int level,
da90: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 char *DHparams)
daa0: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 {. Tcl_Interp
dab0: 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 *interp = state
dac0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
dad0: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 SSL_CTX *ctx =
dae0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 NULL;. Tcl_DS
daf0: 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 69 6e tring ds;. in
db00: 74 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72 74 t off = 0, abort
db10: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f = 0;. int lo
db20: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a ad_private_key;.
db30: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 const SSL_ME
db40: 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 THOD *method;..
db50: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
db60: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 ed");.. if (!
db70: 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 proto) {..Tcl_Ap
db80: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
db90: 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f p, "no valid pro
dba0: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c tocol selected",
dbb0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
dbc0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
dbd0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 }.. /* cre
dbe0: 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 ate SSL context
dbf0: 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 */.#if OPENSSL_V
dc00: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d ERSION_NUMBER >=
dc10: 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 0x10100000L ||
dc20: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
dc30: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
dc40: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
dc50: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
dc60: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 to, TLS_PROTO_SS
dc70: 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 L2)) {..Tcl_Appe
dc80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
dc90: 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 "SSL2 protocol
dca0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
dcb0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
dcc0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
dcd0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 }.#endif.#if d
dce0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
dcf0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
dd00: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 SL_NO_SSL3).
dd10: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
dd20: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c o, TLS_PROTO_SSL
dd30: 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 3)) {..Tcl_Appen
dd40: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
dd50: 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e "SSL3 protocol n
dd60: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
dd70: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
dd80: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
dd90: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
dda0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c fined(NO_TLS1) |
ddb0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
ddc0: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 L_NO_TLS1). i
ddd0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
dde0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
ddf0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
de00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
de10: 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c TLS 1.0 protocol
de20: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
de30: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
de40: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
de50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
de60: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
de70: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
de80: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
de90: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
dea0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
deb0: 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 O_TLS1_1)) {..Tc
dec0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
ded0: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 nterp, "TLS 1.1
dee0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
def0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
df00: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
df10: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
df20: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
df30: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 NO_TLS1_2) || de
df40: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
df50: 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20 _TLS1_2). if
df60: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
df70: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 TLS_PROTO_TLS1_2
df80: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
df90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
dfa0: 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c TLS 1.2 protocol
dfb0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
dfc0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
dfd0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
dfe0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
dff0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
e000: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
e010: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
e020: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
e030: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
e040: 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 O_TLS1_3)) {..Tc
e050: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
e060: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 nterp, "TLS 1.3
e070: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
e080: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
e090: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
e0a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
e0b0: 64 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f 74 dif. if (prot
e0c0: 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 o == 0) {../* Us
e0d0: 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a e full range */.
e0e0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e .SSL_CTX_set_min
e0f0: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
e100: 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 tx, 0);..SSL_CTX
e110: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 _set_max_proto_v
e120: 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a ersion(ctx, 0);.
e130: 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 }.. switc
e140: 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 h (proto) {.#if
e150: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
e160: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
e170: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 000L && !defined
e180: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 (NO_SSL2) && !de
e190: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e1a0: 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 _SSL2). case
e1b0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a TLS_PROTO_SSL2:.
e1c0: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
e1d0: 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 65 er ? SSLv2_serve
e1e0: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c r_method() : SSL
e1f0: 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 v2_client_method
e200: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
e210: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
e220: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
e230: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
e240: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
e250: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
e260: 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 3_METHOD). ca
e270: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c se TLS_PROTO_SSL
e280: 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 3:..method = isS
e290: 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 65 erver ? SSLv3_se
e2a0: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 rver_method() :
e2b0: 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 SSLv3_client_met
e2c0: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 hod();..break;.#
e2d0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
e2e0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 ed(NO_TLS1) && !
e2f0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e300: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 NO_TLS1) && !def
e310: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
e320: 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 TLS1_METHOD).
e330: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
e340: 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 TLS1:..method =
e350: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 isServer ? TLSv1
e360: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
e370: 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f : TLSv1_client_
e380: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
e390: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
e3a0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
e3b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
e3c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 NSSL_NO_TLS1_1)
e3d0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e3e0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 SSL_NO_TLS1_1_ME
e3f0: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 THOD). case T
e400: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a LS_PROTO_TLS1_1:
e410: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
e420: 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 ver ? TLSv1_1_se
e430: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 rver_method() :
e440: 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d TLSv1_1_client_m
e450: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
e460: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
e470: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
e480: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e490: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 SSL_NO_TLS1_2) &
e4a0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
e4b0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 SL_NO_TLS1_2_MET
e4c0: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c HOD). case TL
e4d0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a S_PROTO_TLS1_2:.
e4e0: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
e4f0: 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 er ? TLSv1_2_ser
e500: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 ver_method() : T
e510: 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 LSv1_2_client_me
e520: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
e530: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
e540: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
e550: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
e560: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
e570: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
e580: 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 _TLS1_3:../* Use
e590: 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74 the generic met
e5a0: 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 hod and constrai
e5b0: 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 63 nt range after c
e5c0: 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 65 ontext is create
e5d0: 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 d */..method = i
e5e0: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 sServer ? TLS_se
e5f0: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 rver_method() :
e600: 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f TLS_client_metho
e610: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
e620: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a dif. default:
e630: 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 ../* Negotiate h
e640: 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 ighest available
e650: 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e SSL/TLS version
e660: 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 */..method = is
e670: 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 Server ? TLS_ser
e680: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 ver_method() : T
e690: 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 LS_client_method
e6a0: 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f ();.#if OPENSSL_
e6b0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
e6c0: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 0x10100000L &&
e6d0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 !defined(NO_SSL2
e6e0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
e6f0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 ENSSL_NO_SSL2)..
e700: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
e710: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
e720: 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 _SSL2) ? 0 : S
e730: 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b SL_OP_NO_SSLv2);
e740: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
e750: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 ined(NO_SSL3) &&
e760: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
e770: 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 L_NO_SSL3)..off
e780: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 |= (ENABLED(prot
e790: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c o, TLS_PROTO_SSL
e7a0: 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 3) ? 0 : SSL_O
e7b0: 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e P_NO_SSLv3);.#en
e7c0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
e7d0: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 (NO_TLS1) && !de
e7e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e7f0: 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 _TLS1)..off |= (
e800: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
e810: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 LS_PROTO_TLS1)
e820: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
e830: 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a _TLSv1);.#endif.
e840: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
e850: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
e860: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
e870: 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 LS1_1)..off |= (
e880: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
e890: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 LS_PROTO_TLS1_1)
e8a0: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
e8b0: 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 _TLSv1_1);.#endi
e8c0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
e8d0: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
e8e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e8f0: 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d _TLS1_2)..off |=
e900: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
e910: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
e920: 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 2) ? 0 : SSL_OP_
e930: 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e NO_TLSv1_2);.#en
e940: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
e950: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 (NO_TLS1_3) && !
e960: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e970: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 NO_TLS1_3)..off
e980: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 |= (ENABLED(prot
e990: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
e9a0: 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 1_3) ? 0 : SSL_O
e9b0: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 P_NO_TLSv1_3);.#
e9c0: 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 endif..break;.
e9d0: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
e9e0: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
e9f0: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e ctx = SSL_CTX_n
ea00: 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 ew(method);.
ea10: 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 if (!ctx) {..ret
ea20: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
ea30: 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 28 . if (getenv(
ea40: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 SSLKEYLOGFILE))
ea50: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b {..SSL_CTX_set_k
ea60: 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 eylog_callback(c
ea70: 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 tx, KeyLogCallba
ea80: 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 ck);. }..#if
ea90: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
eaa0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
eab0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
eac0: 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 3). if (proto
ead0: 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c == TLS_PROTO_TL
eae0: 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 S1_3) {..SSL_CTX
eaf0: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 _set_min_proto_v
eb00: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
eb10: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 _3_VERSION);..SS
eb20: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 L_CTX_set_max_pr
eb30: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
eb40: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 TLS1_3_VERSION)
eb50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a ;. }.#endif..
eb60: 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 /* Force cip
eb70: 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 her selection or
eb80: 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f der by server */
eb90: 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72 76 . if (!isServ
eba0: 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 er) {..SSL_CTX_s
ebb0: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
ebc0: 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 SSL_OP_CIPHER_SE
ebd0: 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29 RVER_PREFERENCE)
ebe0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 ;. }..#if OPE
ebf0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
ec00: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 BER < 0x10100000
ec10: 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 L. OpenSSL_ad
ec20: 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 d_all_algorithms
ec30: 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 70 68 (); /* Load ciph
ec40: 65 72 73 20 61 6e 64 20 64 69 67 65 73 74 73 20 ers and digests
ec50: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 */.#endif.. S
ec60: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 SL_CTX_set_app_d
ec70: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 ata(ctx, (void*)
ec80: 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 interp);./* reme
ec90: 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72 mber the interpr
eca0: 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f eter */. SSL_
ecb0: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
ecc0: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 ctx, SSL_OP_ALL)
ecd0: 3b 09 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20 ;./* Enable all
ece0: 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 SSL bug workarou
ecf0: 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 nds */. SSL_C
ed00: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 TX_set_options(c
ed10: 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f tx, SSL_OP_NO_CO
ed20: 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 44 MPRESSION);./* D
ed30: 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 isable compressi
ed40: 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f on even if suppo
ed50: 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f rted */. SSL_
ed60: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
ed70: 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 44 ctx, off);../* D
ed80: 69 73 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 isable specified
ed90: 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f protocol versio
eda0: 6e 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c ns */.. /* Al
edb0: 6c 6f 77 20 77 72 69 74 65 73 20 74 6f 20 72 65 low writes to re
edc0: 70 6f 72 74 20 73 75 63 63 65 73 73 20 77 68 65 port success whe
edd0: 6e 20 6c 65 73 73 20 74 68 61 6e 20 61 6c 6c 20 n less than all
ede0: 72 65 63 6f 72 64 73 20 68 61 76 65 20 62 65 65 records have bee
edf0: 6e 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 n written */.
ee00: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 SSL_CTX_set_mod
ee10: 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f e(ctx, SSL_MODE_
ee20: 45 4e 41 42 4c 45 5f 50 41 52 54 49 41 4c 5f 57 ENABLE_PARTIAL_W
ee30: 52 49 54 45 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 RITE);.. /* D
ee40: 69 73 61 62 6c 65 20 61 74 74 65 6d 70 74 73 20 isable attempts
ee50: 74 6f 20 74 72 79 20 74 6f 20 70 72 6f 63 65 73 to try to proces
ee60: 73 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72 s the next recor
ee70: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 74 d instead of ret
ee80: 75 72 6e 69 6e 67 20 61 66 74 65 72 20 61 0a 20 urning after a.
ee90: 20 20 20 20 20 20 6e 6f 6e 2d 61 70 70 20 72 65 non-app re
eea0: 63 6f 72 64 2e 20 41 76 6f 69 64 73 20 68 61 6e cord. Avoids han
eeb0: 67 73 20 69 6e 20 62 6c 6f 63 6b 69 6e 67 20 6d gs in blocking m
eec0: 6f 64 65 2c 20 77 68 65 6e 20 75 73 69 6e 67 20 ode, when using
eed0: 53 53 4c 5f 72 65 61 64 28 29 20 61 6e 64 20 61 SSL_read() and a
eee0: 0a 20 20 20 20 20 20 20 6e 6f 6e 2d 61 70 70 6c . non-appl
eef0: 69 63 61 74 69 6f 6e 20 72 65 63 6f 72 64 20 77 ication record w
ef00: 61 73 20 73 65 6e 74 20 61 6e 64 20 6e 6f 20 61 as sent and no a
ef10: 70 70 6c 69 63 61 74 69 6f 6e 20 64 61 74 61 20 pplication data
ef20: 77 61 73 20 73 65 6e 74 2e 20 2a 2f 0a 20 20 20 was sent. */.
ef30: 20 53 53 4c 5f 43 54 58 5f 63 6c 65 61 72 5f 6d SSL_CTX_clear_m
ef40: 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 ode(ctx, SSL_MOD
ef50: 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 0a 0a E_AUTO_RETRY);..
ef60: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 SSL_CTX_sess
ef70: 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 _set_cache_size(
ef80: 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 ctx, 128);..
ef90: 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66 69 /* Set user defi
efa0: 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69 70 ned ciphers, cip
efb0: 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20 her suites, and
efc0: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a security level *
efd0: 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 /. if ((ciphe
efe0: 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 rs != NULL) && !
eff0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 SSL_CTX_set_ciph
f000: 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70 er_list(ctx, cip
f010: 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 hers)) {..Tcl_Ap
f020: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f030: 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73 20 p, "Set ciphers
f040: 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 failed: No valid
f050: 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 ciphers", (char
f060: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f *) NULL);..SSL_
f070: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
f080: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
f090: 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 }. if ((ciph
f0a0: 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c ersuites != NULL
f0b0: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 ) && !SSL_CTX_se
f0c0: 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 63 t_ciphersuites(c
f0d0: 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 tx, ciphersuites
f0e0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
f0f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
f100: 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74 65 Set cipher suite
f110: 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c s failed: No val
f120: 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 id ciphers", (ch
f130: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 ar *) NULL);..SS
f140: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
f150: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
f160: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 }.. /* Set
f170: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 security level
f180: 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c */. if (level
f190: 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c > -1 && level <
f1a0: 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 6) {../* SSL_se
f1b0: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c t_security_level
f1c0: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 */..SSL_CTX_set
f1d0: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 _security_level(
f1e0: 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 ctx, level);.
f1f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 }.. /* set s
f200: 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f ome callbacks */
f210: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
f220: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f _default_passwd_
f230: 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 cb(ctx, Password
f240: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 Callback);. S
f250: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 SL_CTX_set_defau
f260: 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 lt_passwd_cb_use
f270: 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 rdata(ctx, (void
f280: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 *)statePtr);..
f290: 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 /* read a Dif
f2a0: 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 fie-Hellman para
f2b0: 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 meters file, or
f2c0: 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e use the built-in
f2d0: 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f one */. Tcl_
f2e0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
f2f0: 3b 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c ;.#ifdef OPENSSL
f300: 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 _NO_DH. if (D
f310: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 Hparams != NULL)
f320: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
f330: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 sult(interp, "DH
f340: 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f parameter suppo
f350: 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 rt not available
f360: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
f370: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
f380: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e (ctx);..return N
f390: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 ULL;. }.#else
f3a0: 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a . {..DH* dh;.
f3b0: 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d .if (DHparams !=
f3c0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 NULL) {.. BI
f3d0: 4f 20 2a 62 69 6f 3b 0a 0a 09 20 20 20 20 62 69 O *bio;... bi
f3e0: 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 o = BIO_new_file
f3f0: 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 (F2N(DHparams, &
f400: 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 ds), "r");..
f410: 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 if (!bio) {...Tc
f420: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
f430: 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 s);...Tcl_Append
f440: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
f450: 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 Could not find D
f460: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c H parameters fil
f470: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c e", (char *) NUL
f480: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
f490: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
f4a0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a n NULL;.. }..
f4b0: 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 . dh = PEM_re
f4c0: 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 ad_bio_DHparams(
f4d0: 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c bio, NULL, NULL,
f4e0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f NULL);.. BIO
f4f0: 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 _free(bio);..
f500: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
f510: 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 (&ds);.. if (
f520: 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 !dh) {...Tcl_App
f530: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
f540: 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 , "Could not rea
f550: 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 d DH parameters
f560: 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 from file", (cha
f570: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
f580: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
f590: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
f5a0: 09 20 20 20 20 7d 0a 09 20 20 20 20 53 53 4c 5f . }.. SSL_
f5b0: 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 CTX_set_tmp_dh(c
f5c0: 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 20 44 48 tx, dh);.. DH
f5d0: 5f 66 72 65 65 28 64 68 29 3b 0a 0a 09 7d 20 65 _free(dh);...} e
f5e0: 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20 55 73 lse {.. /* Us
f5f0: 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20 e well known DH
f600: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 parameters that
f610: 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20 73 75 have built-in su
f620: 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53 53 4c pport in OpenSSL
f630: 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21 53 53 */.. if (!SS
f640: 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61 75 74 L_CTX_set_dh_aut
f650: 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09 09 54 o(ctx, 1)) {...T
f660: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
f670: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e interp, "Could n
f680: 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20 44 48 ot enable set DH
f690: 20 61 75 74 6f 3a 20 22 2c 20 47 45 54 5f 45 52 auto: ", GET_ER
f6a0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
f6b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
f6c0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
f6d0: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
f6e0: 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a . }..}. }.
f6f0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 #endif.. /* s
f700: 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 et our certifica
f710: 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 te */. load_p
f720: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a rivate_key = 0;.
f730: 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 if (certfile
f740: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 != NULL) {..loa
f750: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 d_private_key =
f760: 31 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 1;...if (SSL_CTX
f770: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 _use_certificate
f780: 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 _file(ctx, F2N(c
f790: 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 ertfile, &ds), S
f7a0: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 SL_FILETYPE_PEM)
f7b0: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 <= 0) {.. Tc
f7c0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
f7d0: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 s);.. Tcl_App
f7e0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
f7f0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 , "unable to set
f800: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c certificate fil
f810: 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 e ", certfile, "
f820: 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 : ",...GET_ERR_R
f830: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
f840: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 ) NULL);.. SS
f850: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
f860: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
f870: 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 L;..}..Tcl_DStri
f880: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 20 20 ngFree(&ds);..
f890: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 } else if (cer
f8a0: 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f t != NULL) {..lo
f8b0: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d ad_private_key =
f8c0: 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 1;..if (SSL_CTX
f8d0: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 _use_certificate
f8e0: 5f 41 53 4e 31 28 63 74 78 2c 20 28 69 6e 74 29 _ASN1(ctx, (int)
f8f0: 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 cert_len, cert)
f900: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 <= 0) {.. Tc
f910: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
f920: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
f930: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 o set certificat
f940: 65 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f e: ",...GET_ERR_
f950: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
f960: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
f970: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
f980: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
f990: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 LL;..}. } els
f9a0: 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 e {..certfile =
f9b0: 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f (char*)X509_get_
f9c0: 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c default_cert_fil
f9d0: 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 e();...if (SSL_C
f9e0: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 TX_use_certifica
f9f0: 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 te_file(ctx, cer
fa00: 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 tfile, SSL_FILET
fa10: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b YPE_PEM) <= 0) {
fa20: 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f .#if 0.. Tcl_
fa30: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
fa40: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
fa50: 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 use default cert
fa60: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 ificate file ",
fa70: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a certfile, ": ",.
fa80: 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e ..GET_ERR_REASON
fa90: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
faa0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
fab0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
fac0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 return NULL;.#e
fad0: 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ndif..}. }..
fae0: 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 /* set our pr
faf0: 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 ivate key */.
fb00: 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 if (load_privat
fb10: 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 e_key) {..if (ke
fb20: 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 yfile == NULL &&
fb30: 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a key == NULL) {.
fb40: 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 . keyfile = c
fb50: 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 ertfile;..}...if
fb60: 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c (keyfile != NUL
fb70: 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 L) {.. /* get
fb80: 20 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 the private key
fb90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
fba0: 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74 this certificat
fbb0: 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 e */.. if (ke
fbc0: 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b yfile == NULL) {
fbd0: 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 ...keyfile = cer
fbe0: 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 tfile;.. }...
fbf0: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f if (SSL_CTX_
fc00: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 use_PrivateKey_f
fc10: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 ile(ctx, F2N(key
fc20: 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f file, &ds), SSL_
fc30: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d FILETYPE_PEM) <=
fc40: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 0) {...Tcl_DStr
fc50: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 ingFree(&ds);...
fc60: 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 /* flush the pas
fc70: 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 sphrase which mi
fc80: 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 ght be left in t
fc90: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 he result */...T
fca0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
fcb0: 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 erp, NULL, TCL_S
fcc0: 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 TATIC);...Tcl_Ap
fcd0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
fce0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 p, "unable to se
fcf0: 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c t public key fil
fd00: 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 e ", keyfile, "
fd10: 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52 52 ",... GET_ERR
fd20: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 _REASON(), (char
fd30: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
fd40: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
fd50: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
fd60: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 }.. Tcl_D
fd70: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
fd80: 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 ...} else if (ke
fd90: 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 y != NULL) {..
fda0: 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 if (SSL_CTX_us
fdb0: 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e e_PrivateKey_ASN
fdc0: 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 1(EVP_PKEY_RSA,
fdd0: 63 74 78 2c 20 6b 65 79 2c 20 28 69 6e 74 29 20 ctx, key, (int)
fde0: 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b key_len) <= 0) {
fdf0: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 .../* flush the
fe00: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 passphrase which
fe10: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 might be left i
fe20: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a n the result */.
fe30: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 ..Tcl_SetResult(
fe40: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 interp, NULL, TC
fe50: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c L_STATIC);...Tcl
fe60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
fe70: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
fe80: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a set public key:
fe90: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 ", GET_ERR_REAS
fea0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
feb0: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
fec0: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
fed0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d urn NULL;.. }
fee0: 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b ..}../* Now we k
fef0: 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 now that a key a
ff00: 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 nd cert have bee
ff10: 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 n set against..
ff20: 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 * the SSL contex
ff30: 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 t */..if (!SSL_C
ff40: 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 TX_check_private
ff50: 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 _key(ctx)) {..
ff60: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
ff70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 lt(interp, "priv
ff80: 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 ate key does not
ff90: 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 match the certi
ffa0: 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 ficate public ke
ffb0: 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 y",.... (cha
ffc0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
ffd0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
ffe0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
fff0: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a NULL;..}. }..
10000 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 /* Set to us
10010 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f e the default lo
10020 63 61 74 69 6f 6e 20 61 6e 64 20 66 69 6c 65 20 cation and file
10030 66 6f 72 20 43 65 72 74 69 66 69 63 61 74 65 20 for Certificate
10040 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 20 63 Authority (CA) c
10050 65 72 74 69 66 69 63 61 74 65 73 2e 0a 20 20 20 ertificates..
10060 20 20 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 * The default
10070 43 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20 CA certificates
10080 64 69 72 65 63 74 6f 72 79 20 69 73 20 63 61 6c directory is cal
10090 6c 65 64 20 63 65 72 74 73 20 69 6e 20 74 68 65 led certs in the
100a0 20 64 65 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c default OpenSSL
100b0 0a 20 20 20 20 20 2a 20 64 69 72 65 63 74 6f 72 . * director
100c0 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 y. It contains t
100d0 68 65 20 43 41 20 63 65 72 74 69 66 69 63 61 74 he CA certificat
100e0 65 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d 61 74 es in PEM format
100f0 2c 20 77 69 74 68 20 6f 6e 65 20 63 65 72 74 69 , with one certi
10100 66 69 63 61 74 65 20 70 65 72 0a 20 20 20 20 20 ficate per.
10110 2a 20 66 69 6c 65 2e 20 54 68 65 20 76 65 72 69 * file. The veri
10120 66 79 20 70 61 74 68 20 61 6e 64 20 73 74 6f 72 fy path and stor
10130 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 e can be overrid
10140 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 den by the SSL_C
10150 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e ERT_DIR env var.
10160 20 54 68 65 0a 20 20 20 20 20 2a 20 64 65 66 61 The. * defa
10170 75 6c 74 20 43 41 20 63 65 72 74 69 66 69 63 61 ult CA certifica
10180 74 65 73 20 66 69 6c 65 20 69 73 20 63 61 6c 6c tes file is call
10190 65 64 20 63 65 72 74 2e 70 65 6d 20 69 6e 20 74 ed cert.pem in t
101a0 68 65 20 64 65 66 61 75 6c 74 20 4f 70 65 6e 53 he default OpenS
101b0 53 4c 20 64 69 72 65 63 74 6f 72 79 2e 0a 20 20 SL directory..
101c0 20 20 20 2a 20 54 68 65 20 76 65 72 69 66 79 20 * The verify
101d0 66 69 6c 65 20 63 61 6e 20 62 65 20 6f 76 65 72 file can be over
101e0 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 ridden by the SS
101f0 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e 76 20 L_CERT_FILE env
10200 76 61 72 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 var. */. if (
10210 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 !SSL_CTX_set_def
10220 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 ault_verify_path
10230 73 28 63 74 78 29 29 20 7b 0a 09 61 62 6f 72 74 s(ctx)) {..abort
10240 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ++;. }.. /
10250 2a 20 4f 76 65 72 72 69 64 65 73 20 66 6f 72 20 * Overrides for
10260 74 68 65 20 43 41 20 76 65 72 69 66 79 20 70 61 the CA verify pa
10270 74 68 20 61 6e 64 20 66 69 6c 65 20 2a 2f 0a 20 th and file */.
10280 20 20 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c {.#if OPENSSL
10290 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
102a0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 69 < 0x30000000L..i
102b0 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55 4c f (CApath != NUL
102c0 4c 20 7c 7c 20 43 41 66 69 6c 65 20 21 3d 20 4e L || CAfile != N
102d0 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f ULL) {.. Tcl_
102e0 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 09 20 20 DString ds1;..
102f0 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
10300 74 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 69 t(&ds1);... i
10310 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 f (!SSL_CTX_load
10320 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e _verify_location
10330 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c s(ctx, F2N(CAfil
10340 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 70 e, &ds), F2N(CAp
10350 61 74 68 2c 20 26 64 73 31 29 29 29 20 7b 0a 09 ath, &ds1))) {..
10360 09 61 62 6f 72 74 2b 2b 3b 0a 09 09 72 65 74 75 .abort++;...retu
10370 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a rn NULL;.. }.
10380 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
10390 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 Free(&ds);..
103a0 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
103b0 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 &ds1);... /*
103c0 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20 Set list of CAs
103d0 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e to send to clien
103e0 74 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e t when requestin
103f0 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69 g a client certi
10400 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 2f ficate */.. /
10410 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 * https://source
10420 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f forge.net/p/tls/
10430 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 bugs/57/ */..
10440 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 /* XXX:TODO: Le
10450 74 20 74 68 65 20 75 73 65 72 20 73 75 70 70 6c t the user suppl
10460 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e y values here in
10470 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 stead of somethi
10480 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 20 6f ng that exists o
10490 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d n the filesystem
104a0 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f */.. STACK_O
104b0 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 F(X509_NAME) *ce
104c0 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f rtNames = SSL_lo
104d0 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c ad_client_CA_fil
104e0 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 e(F2N(CAfile, &d
104f0 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65 s));.. if (ce
10500 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 rtNames != NULL)
10510 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 {...SSL_CTX_set
10520 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 _client_CA_list(
10530 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b ctx, certNames);
10540 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c .. }.. Tcl
10550 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
10560 29 3b 0a 09 7d 0a 0a 23 65 6c 73 65 0a 09 2f 2a );..}..#else../*
10570 20 53 65 74 20 64 69 72 65 63 74 6f 72 79 20 63 Set directory c
10580 6f 6e 74 61 69 6e 69 6e 67 20 43 41 20 63 65 72 ontaining CA cer
10590 74 69 66 69 63 61 74 65 73 20 69 6e 20 50 45 4d tificates in PEM
105a0 20 66 6f 72 6d 61 74 2e 20 2a 2f 0a 09 69 66 20 format. */..if
105b0 28 43 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 (CApath != NULL)
105c0 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c {.. if (!SSL
105d0 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 _CTX_load_verify
105e0 5f 64 69 72 28 63 74 78 2c 20 46 32 4e 28 43 41 _dir(ctx, F2N(CA
105f0 70 61 74 68 2c 20 26 64 73 29 29 29 20 7b 0a 09 path, &ds))) {..
10600 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d .abort++;.. }
10610 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
10620 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 09 gFree(&ds);..}..
10630 0a 09 2f 2a 20 53 65 74 20 55 52 49 20 66 6f 72 ../* Set URI for
10640 20 74 6f 20 61 20 73 74 6f 72 65 2c 20 77 68 69 to a store, whi
10650 63 68 20 6d 61 79 20 62 65 20 61 20 73 69 6e 67 ch may be a sing
10660 6c 65 20 63 6f 6e 74 61 69 6e 65 72 20 6f 72 20 le container or
10670 61 20 63 61 74 61 6c 6f 67 20 6f 66 20 63 6f 6e a catalog of con
10680 74 61 69 6e 65 72 73 2e 20 2a 2f 0a 09 69 66 20 tainers. */..if
10690 28 43 41 73 74 6f 72 65 20 21 3d 20 4e 55 4c 4c (CAstore != NULL
106a0 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 ) {.. if (!SS
106b0 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 L_CTX_load_verif
106c0 79 5f 73 74 6f 72 65 28 63 74 78 2c 20 46 32 4e y_store(ctx, F2N
106d0 28 43 41 73 74 6f 72 65 2c 20 26 64 73 29 29 29 (CAstore, &ds)))
106e0 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 {...abort++;..
106f0 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 }.. Tcl_DS
10700 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
10710 09 7d 0a 09 0a 09 2f 2a 20 53 65 74 20 66 69 6c .}..../* Set fil
10720 65 20 6f 66 20 43 41 20 63 65 72 74 69 66 69 63 e of CA certific
10730 61 74 65 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d ates in PEM form
10740 61 74 2e 20 20 2a 2f 0a 09 69 66 20 28 43 41 66 at. */..if (CAf
10750 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ile != NULL) {..
10760 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 if (!SSL_CTX
10770 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 69 6c _load_verify_fil
10780 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c e(ctx, F2N(CAfil
10790 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 e, &ds))) {...ab
107a0 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 ort++;.. }..
107b0 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
107c0 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 20 2f ee(&ds);... /
107d0 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41 * Set list of CA
107e0 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 s to send to cli
107f0 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74 ent when request
10800 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72 ing a client cer
10810 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 tificate */..
10820 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e STACK_OF(X509_N
10830 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 AME) *certNames
10840 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e = SSL_load_clien
10850 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 t_CA_file(F2N(CA
10860 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 file, &ds));..
10870 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 if (certNames
10880 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c != NULL) {...SSL
10890 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
108a0 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 CA_list(ctx, cer
108b0 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a tNames);.. }.
108c0 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
108d0 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65 Free(&ds);..}.#e
108e0 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ndif. }..
108f0 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a return ctx;.}...
10900 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
10910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10940 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 --------. *. * S
10950 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 tatusObjCmd -- r
10960 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 eturn certificat
10970 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 e for connected
10980 70 65 65 72 20 69 6e 66 6f 2e 0a 20 2a 0a 20 2a peer info.. *. *
10990 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
109a0 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
109b0 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
109c0 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
109d0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
109e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
109f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
10a20 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f atic int.StatusO
10a30 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
10a40 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
10a50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
10a60 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
10a70 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
10a80 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
10a90 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 tatePtr;. X50
10aa0 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 9 *peer;. Tcl
10ab0 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 _Obj *objPtr;.
10ac0 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
10ad0 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 an;. char *ch
10ae0 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 annelName, *ciph
10af0 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 ers;. int mod
10b00 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
10b10 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 igned char *prot
10b20 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 o;. unsigned
10b30 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 int len;. int
10b40 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20 20 28 nid, res;. (
10b50 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
10b60 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
10b70 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
10b80 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f f (objc < 2 || o
10b90 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 bjc > 3 || (objc
10ba0 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70 == 3 && !strcmp
10bb0 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f (Tcl_GetString(o
10bc0 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c bjv[1]), "-local
10bd0 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e "))) {..Tcl_Wron
10be0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
10bf0 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 1, objv, "?-loc
10c00 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 al? channel");..
10c10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
10c20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
10c30 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a Get channel Id *
10c40 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d /. channelNam
10c50 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e e = Tcl_GetStrin
10c60 67 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 g(objv[(objc ==
10c70 32 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 2 ? 1 : 2)]);.
10c80 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
10c90 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
10ca0 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f channelName, &mo
10cb0 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 de);. if (cha
10cc0 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
10cd0 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
10ce0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
10cf0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
10d00 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
10d10 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
10d20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
10d30 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
10d40 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 Channel(chan);.
10d50 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
10d60 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
10d70 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
10d80 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
10d90 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
10da0 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
10db0 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
10dc0 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 elName(chan),...
10dd0 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
10de0 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a hannel", (char *
10df0 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 ) NULL);..Tcl_Se
10e00 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
10e10 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 p, "TLS", "STATU
10e20 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 S", "CHANNEL", "
10e30 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
10e40 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
10e50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
10e60 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 }. statePtr
10e70 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f = (State *) Tcl_
10e80 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
10e90 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 ceData(chan);..
10ea0 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66 /* Get certif
10eb0 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f icate for peer o
10ec0 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 r self */. if
10ed0 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
10ee0 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 peer = SSL_get_p
10ef0 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 eer_certificate(
10f00 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
10f10 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 } else {..pe
10f20 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 er = SSL_get_cer
10f30 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 tificate(statePt
10f40 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 r->ssl);. }.
10f50 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63 /* Get X509 c
10f60 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20 ertificate info
10f70 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 */. if (peer)
10f80 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 {..objPtr = Tls
10f90 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 _NewX509Obj(inte
10fa0 72 70 2c 20 70 65 65 72 2c 20 31 29 3b 0a 09 69 rp, peer, 1);..i
10fb0 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a f (objc == 2) {.
10fc0 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70 . X509_free(p
10fd0 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20 eer);.. peer
10fe0 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d = NULL;..}. }
10ff0 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 else {..objPtr
11000 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
11010 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d (0, NULL);. }
11020 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 .. /* Peer na
11030 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e me */. LAPPEN
11040 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11050 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 jPtr, "peername"
11060 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e , SSL_get0_peern
11070 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ame(statePtr->ss
11080 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 l), -1);. LAP
11090 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
110a0 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22 objPtr, "sbits"
110b0 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 , SSL_get_cipher
110c0 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e _bits(statePtr->
110d0 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 ssl, NULL));..
110e0 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 ciphers = (cha
110f0 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 r*)SSL_get_ciphe
11100 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 r(statePtr->ssl)
11110 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 ;. LAPPEND_ST
11120 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11130 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 68 , "cipher", ciph
11140 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f ers, -1);.. /
11150 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 * Verify the X50
11160 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 9 certificate pr
11170 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 esented by the p
11180 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 eer */. LAPPE
11190 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
111a0 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 65 bjPtr, "verifyRe
111b0 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 sult",..X509_ver
111c0 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 ify_cert_error_s
111d0 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 tring(SSL_get_ve
111e0 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 rify_result(stat
111f0 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 ePtr->ssl)), -1)
11200 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 ;.. /* Verify
11210 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 mode */. mod
11220 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 e = SSL_get_veri
11230 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 fy_mode(statePtr
11240 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 ->ssl);. if (
11250 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
11260 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 FY_NONE) {..LAPP
11270 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11280 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d objPtr, "verifyM
11290 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 ode", "none", -1
112a0 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
112b0 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 .Tcl_Obj *listOb
112c0 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
112d0 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
112e0 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c .if (mode && SSL
112f0 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a _VERIFY_PEER) {.
11300 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
11310 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
11320 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 terp, listObjPtr
11330 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
11340 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b bj("peer", -1));
11350 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 ..}..if (mode &&
11360 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
11370 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
11380 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
11390 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
113a0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 t(interp, listOb
113b0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
113c0 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 ingObj("fail if
113d0 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d no peer cert", -
113e0 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 1));..}..if (mod
113f0 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f e && SSL_VERIFY_
11400 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 CLIENT_ONCE) {..
11410 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
11420 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
11430 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c erp, listObjPtr,
11440 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
11450 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c j("client once",
11460 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d -1));..}..if (m
11470 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
11480 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 Y_POST_HANDSHAKE
11490 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
114a0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
114b0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 t(interp, listOb
114c0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
114d0 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e ingObj("post han
114e0 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 dshake", -1));..
114f0 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 }..LAPPEND_OBJ(i
11500 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11510 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 verifyMode", lis
11520 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a tObjPtr). }..
11530 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f /* Verify mo
11540 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 de depth */.
11550 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
11560 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 rp, objPtr, "ver
11570 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 ifyDepth", SSL_g
11580 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 et_verify_depth(
11590 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b statePtr->ssl));
115a0 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 .. /* Report
115b0 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f the selected pro
115c0 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c tocol as a resul
115d0 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 t of the negotia
115e0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f tion */. SSL_
115f0 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 get0_alpn_select
11600 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ed(statePtr->ssl
11610 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b , &proto, &len);
11620 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
11630 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11640 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a "alpn", (char *
11650 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a )proto, (Tcl_Siz
11660 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 e) len);. LAP
11670 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11680 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 objPtr, "protoc
11690 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 ol", SSL_get_ver
116a0 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 sion(statePtr->s
116b0 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f sl), -1);.. /
116c0 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d * Valid for non-
116d0 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e RSA signature an
116e0 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 d TLS 1.3 */.
116f0 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 if (objc == 2)
11700 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 {..res = SSL_get
11710 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f _peer_signature_
11720 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
11730 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 l, &nid);. }
11740 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 else {..res = SS
11750 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f L_get_signature_
11760 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
11770 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a l, &nid);. }.
11780 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e if (!res) {n
11790 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 id = 0;}. LAP
117a0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
117b0 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 objPtr, "signat
117c0 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d ureHashAlgorithm
117d0 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 ", OBJ_nid2ln(ni
117e0 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a d), -1);.. /*
117f0 20 41 64 64 65 64 20 69 6e 20 4f 70 65 6e 53 53 Added in OpenSS
11800 4c 20 31 2e 31 2e 31 61 20 2a 2f 0a 23 69 66 20 L 1.1.1a */.#if
11810 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
11820 4e 55 4d 42 45 52 20 3e 20 30 78 31 30 31 30 31 NUMBER > 0x10101
11830 30 30 30 4c 0a 20 20 20 20 69 66 20 28 6f 62 6a 000L. if (obj
11840 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d c == 2) {..res =
11850 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 SSL_get_peer_si
11860 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 gnature_type_nid
11870 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
11880 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 &nid);. } els
11890 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 e {..res = SSL_g
118a0 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 et_signature_typ
118b0 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
118c0 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 ssl, &nid);.
118d0 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 }. if (!res)
118e0 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c {nid = 0;}. L
118f0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11900 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e p, objPtr, "sign
11910 61 74 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f atureType", OBJ_
11920 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 nid2ln(nid), -1)
11930 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 ;.#endif.. Tc
11940 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
11950 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
11960 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
11970 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
11980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
119a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
119b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
119c0 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e *. * Connection
119d0 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 InfoObjCmd -- re
119e0 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 turn connection
119f0 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 info from OpenSS
11a00 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 L.. *. * Results
11a10 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 :. *.A list of c
11a20 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 onnection info.
11a30 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
11a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a70 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
11a80 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 atic int Connect
11a90 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c ionInfoObjCmd(Cl
11aa0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
11ab0 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
11ac0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
11ad0 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
11ae0 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
11af0 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
11b00 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 ;../* The channe
11b10 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
11b20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 on */. State
11b30 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 *statePtr;../* c
11b40 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 lient state for
11b50 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 ssl socket */.
11b60 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
11b70 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 r, *listPtr;.
11b80 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b const SSL *ssl;
11b90 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 . const SSL_C
11ba0 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 IPHER *cipher;.
11bb0 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 const SSL_SES
11bc0 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 SION *session;.
11bd0 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 const EVP_MD
11be0 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 *md;. (void)
11bf0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
11c00 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
11c10 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
11c20 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
11c30 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
11c40 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
11c50 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
11c60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
11c70 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 }.. chan = Tc
11c80 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
11c90 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 erp, Tcl_GetStri
11ca0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c ng(objv[1]), NUL
11cb0 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e L);. if (chan
11cc0 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
11cd0 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
11ce0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
11cf0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 }.. /* Make
11d00 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
11d10 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
11d20 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
11d30 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
11d40 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 hannel(chan);.
11d50 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 if (Tcl_GetCha
11d60 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 nnelType(chan) !
11d70 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 = Tls_ChannelTyp
11d80 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 e()) {..Tcl_Appe
11d90 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
11da0 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
11db0 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
11dc0 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 lName(chan),..
11dd0 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 "\": not a TLS
11de0 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 channel", (char
11df0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f *) NULL);..Tcl_
11e00 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
11e10 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e erp, "TLS", "CON
11e20 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e NECTION", "CHANN
11e30 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 EL", "INVALID",
11e40 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
11e50 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
11e60 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 R;. }.. ob
11e70 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
11e80 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
11e90 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 . /* Connecti
11ea0 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 on info */. s
11eb0 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
11ec0 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *)Tcl_GetChanne
11ed0 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
11ee0 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 an);. ssl = s
11ef0 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 tatePtr->ssl;.
11f00 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c if (ssl != NUL
11f10 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 L) {..const unsi
11f20 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f gned char *proto
11f30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 ;..unsigned int
11f40 75 6c 65 6e 3b 0a 0a 09 2f 2a 20 49 6e 69 74 69 ulen;.../* Initi
11f50 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6e 69 73 68 alization finish
11f60 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 ed */..LAPPEND_B
11f70 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
11f80 74 72 2c 20 22 69 6e 69 74 5f 66 69 6e 69 73 68 tr, "init_finish
11f90 65 64 22 2c 20 53 53 4c 5f 69 73 5f 69 6e 69 74 ed", SSL_is_init
11fa0 5f 66 69 6e 69 73 68 65 64 28 73 73 6c 29 29 3b _finished(ssl));
11fb0 0a 09 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f ..../* connectio
11fc0 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 n state */..LAPP
11fd0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11fe0 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65 22 2c objPtr, "state",
11ff0 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e SSL_state_strin
12000 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 g_long(ssl), -1)
12010 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 ;.../* Get SNI r
12020 65 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20 equested server
12030 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 name */..LAPPEND
12040 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12050 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 Ptr, "servername
12060 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 ", SSL_get_serve
12070 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 rname(ssl, TLSEX
12080 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f T_NAMETYPE_host_
12090 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a name), -1);.../*
120a0 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 Report the sele
120b0 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 cted protocol as
120c0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 a result of the
120d0 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a negotiation */.
120e0 09 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 .SSL_get0_alpn_s
120f0 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72 elected(statePtr
12100 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 ->ssl, &proto, &
12110 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f ulen);..LAPPEND_
12120 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12130 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 tr, "alpn", (cha
12140 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f r *)proto, (Tcl_
12150 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f Size) ulen);.../
12160 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a * Get protocol *
12170 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
12180 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12190 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 protocol", SSL_g
121a0 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c et_version(ssl),
121b0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 -1);.../* Reneg
121c0 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 otiation allowed
121d0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f */..LAPPEND_BOO
121e0 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 L(interp, objPtr
121f0 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e , "renegotiation
12200 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67 _allowed", SSL_g
12210 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f et_secure_renego
12220 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 tiation_support(
12230 28 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b 0a 0a (SSL *) ssl));..
12240 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 ./* Get security
12250 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 level */..LAPPE
12260 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
12270 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74 79 bjPtr, "security
12280 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74 _level", SSL_get
12290 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 _security_level(
122a0 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 ssl));.../* Sess
122b0 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 ion info */..LAP
122c0 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 PEND_BOOL(interp
122d0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 , objPtr, "sessi
122e0 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f on_reused", SSL_
122f0 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 session_reused(s
12300 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 sl));.../* Is se
12310 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 rver info */..LA
12320 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
12330 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73 p, objPtr, "is_s
12340 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73 erver", SSL_is_s
12350 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f erver(ssl));.../
12360 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 * Is DTLS */..LA
12370 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
12380 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64 p, objPtr, "is_d
12390 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c tls", SSL_is_dtl
123a0 73 28 73 73 6c 29 29 3b 0a 0a 23 69 66 20 4f 50 s(ssl));..#if OP
123b0 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
123c0 4d 42 45 52 20 3e 3d 20 30 78 33 30 32 30 30 30 MBER >= 0x302000
123d0 30 30 4c 0a 09 2f 2a 20 49 73 20 51 55 49 43 20 00L../* Is QUIC
123e0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
123f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12400 20 22 69 73 5f 71 75 69 63 22 2c 20 53 53 4c 5f "is_quic", SSL_
12410 69 73 5f 71 75 69 63 28 73 73 6c 29 29 3b 0a 0a is_quic(ssl));..
12420 09 2f 2a 20 49 73 20 54 4c 53 20 2a 2f 0a 09 4c ./* Is TLS */..L
12430 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
12440 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f rp, objPtr, "is_
12450 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 74 6c 73 tls", SSL_is_tls
12460 28 73 73 6c 29 29 3b 0a 23 65 6e 64 69 66 0a 0a (ssl));.#endif..
12470 09 2f 2a 20 44 41 4e 45 20 54 4c 53 20 61 75 74 ./* DANE TLS aut
12480 68 65 6e 74 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 hentication */..
12490 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
124a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 61 erp, objPtr, "da
124b0 6e 65 5f 61 75 74 68 22 2c 20 53 53 4c 5f 67 65 ne_auth", SSL_ge
124c0 74 30 5f 64 61 6e 65 28 28 53 53 4c 20 2a 29 73 t0_dane((SSL *)s
124d0 73 6c 29 20 21 3d 20 4e 55 4c 4c 29 3b 0a 0a 09 sl) != NULL);...
124e0 2f 2a 20 57 61 69 74 69 6e 67 20 66 6f 72 20 61 /* Waiting for a
124f0 73 79 6e 63 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 sync */..LAPPEND
12500 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
12510 6a 50 74 72 2c 20 22 77 61 69 74 69 6e 67 5f 66 jPtr, "waiting_f
12520 6f 72 5f 61 73 79 6e 63 22 2c 20 53 53 4c 5f 77 or_async", SSL_w
12530 61 69 74 69 6e 67 5f 66 6f 72 5f 61 73 79 6e 63 aiting_for_async
12540 28 28 53 53 4c 20 2a 29 73 73 6c 29 29 3b 0a 0a ((SSL *)ssl));..
12550 09 2f 2a 20 54 69 6d 65 2d 6f 75 74 20 2a 2f 0a ./* Time-out */.
12560 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e .LAPPEND_LONG(in
12570 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 terp, objPtr, "t
12580 69 6d 65 2d 6f 75 74 22 2c 20 53 53 4c 5f 67 65 ime-out", SSL_ge
12590 74 5f 64 65 66 61 75 6c 74 5f 74 69 6d 65 6f 75 t_default_timeou
125a0 74 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 t(ssl));.../* Is
125b0 20 43 65 72 74 69 66 69 63 61 74 65 20 54 72 61 Certificate Tra
125c0 6e 73 70 61 72 65 6e 63 79 20 76 61 6c 69 64 61 nsparency valida
125d0 74 69 6f 6e 20 65 6e 61 62 6c 65 64 20 2a 2f 0a tion enabled */.
125e0 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
125f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
12600 74 5f 65 6e 61 62 6c 65 64 22 2c 20 53 53 4c 5f t_enabled", SSL_
12610 63 74 5f 69 73 5f 65 6e 61 62 6c 65 64 28 73 73 ct_is_enabled(ss
12620 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 l));. }..
12630 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a /* Cipher info *
12640 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 /. cipher = S
12650 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 SL_get_current_c
12660 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 ipher(ssl);.
12670 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 if (cipher != NU
12680 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b LL) {..char buf[
12690 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 BUFSIZ] = {0};..
126a0 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 int bits, alg_bi
126b0 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 ts;.../* Cipher
126c0 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 name */..LAPPEND
126d0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
126e0 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 Ptr, "cipher", S
126f0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 SL_CIPHER_get_na
12700 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b me(cipher), -1);
12710 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f .../* RFC name o
12720 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 f cipher */..LAP
12730 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
12740 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 objPtr, "standa
12750 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 rd_name", SSL_CI
12760 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 PHER_standard_na
12770 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b me(cipher), -1);
12780 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 .../* OpenSSL na
12790 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a me of cipher */.
127a0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
127b0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 erp, objPtr, "op
127c0 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 enssl_name", OPE
127d0 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 NSSL_cipher_name
127e0 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e (SSL_CIPHER_stan
127f0 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 dard_name(cipher
12800 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 )), -1);.../* nu
12810 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 mber of secret b
12820 69 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 its used for cip
12830 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 her */..bits = S
12840 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 SL_CIPHER_get_bi
12850 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f ts(cipher, &alg_
12860 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f bits);..LAPPEND_
12870 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
12880 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 tr, "secret_bits
12890 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 ", bits);..LAPPE
128a0 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
128b0 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 bjPtr, "algorith
128c0 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 m_bits", alg_bit
128d0 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 s);../* alg_bits
128e0 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 is actual key s
128f0 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 ecret bits. If u
12900 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 se bits and secr
12910 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 et (algorithm) b
12920 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 its differ,..
12930 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 the rest of the
12940 62 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 bits are fixed,
12950 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 i.e. for limited
12960 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 export ciphers
12970 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a (bits < 56) */..
12980 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 ./* Indicates wh
12990 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 ich SSL/TLS prot
129a0 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 ocol version fir
129b0 73 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 st defined the c
129c0 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e ipher */..LAPPEN
129d0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
129e0 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 jPtr, "min_versi
129f0 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f on", SSL_CIPHER_
12a00 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 get_version(ciph
12a10 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 er), -1);.../* C
12a20 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 ipher NID */..LA
12a30 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12a40 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 , objPtr, "ciphe
12a50 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f rNID", (char *)O
12a60 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
12a70 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f PHER_get_cipher_
12a80 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
12a90 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
12aa0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12ab0 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 "digestNID", (ch
12ac0 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 ar *)OBJ_nid2ln(
12ad0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 SSL_CIPHER_get_d
12ae0 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 igest_nid(cipher
12af0 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e )), -1);..LAPPEN
12b00 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
12b10 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e jPtr, "keyExchan
12b20 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 geNID", (char *)
12b30 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 OBJ_nid2ln(SSL_C
12b40 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 IPHER_get_kx_nid
12b50 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
12b60 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
12b70 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 erp, objPtr, "au
12b80 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 thenticationNID"
12b90 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 , (char *)OBJ_ni
12ba0 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f d2ln(SSL_CIPHER_
12bb0 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 get_auth_nid(cip
12bc0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a her)), -1);.../*
12bd0 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 message authent
12be0 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 ication code - C
12bf0 69 70 68 65 72 20 69 73 20 41 45 41 44 20 28 65 ipher is AEAD (e
12c00 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 .g. GCM or ChaCh
12c10 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 a20/Poly1305) or
12c20 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 not */../* Auth
12c30 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 enticated Encryp
12c40 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 tion with associ
12c50 61 74 65 64 20 64 61 74 61 20 28 41 45 41 44 29 ated data (AEAD)
12c60 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 check */..LAPPE
12c70 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
12c80 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f objPtr, "cipher_
12c90 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 is_aead", SSL_CI
12ca0 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 PHER_is_aead(cip
12cb0 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 her));.../* Dige
12cc0 73 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 st used during t
12cd0 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 he SSL/TLS hands
12ce0 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 hake when using
12cf0 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 the cipher. */..
12d00 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f md = SSL_CIPHER_
12d10 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 get_handshake_di
12d20 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c gest(cipher);..L
12d30 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
12d40 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 p, objPtr, "hand
12d50 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 shake_digest", (
12d60 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 char *)EVP_MD_na
12d70 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f me(md), -1);.../
12d80 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 * Get OpenSSL-sp
12d90 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 ecific ID, not I
12da0 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 ANA ID */..LAPPE
12db0 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
12dc0 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 bjPtr, "cipher_i
12dd0 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 d", (int) SSL_CI
12de0 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 PHER_get_id(ciph
12df0 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 er));.../* Two-b
12e00 79 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 yte ID used in t
12e10 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 he TLS protocol
12e20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 of the given cip
12e30 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
12e40 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
12e50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 tr, "protocol_id
12e60 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 ", (int) SSL_CIP
12e70 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c HER_get_protocol
12e80 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 _id(cipher));...
12e90 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 /* Textual descr
12ea0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 iption of the ci
12eb0 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c pher */..if (SSL
12ec0 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 _CIPHER_descript
12ed0 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c ion(cipher, buf,
12ee0 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d sizeof(buf)) !=
12ef0 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 NULL) {.. LA
12f00 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12f10 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 , objPtr, "descr
12f20 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 iption", buf, -1
12f30 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
12f40 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f /* Session info
12f50 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 */. session
12f60 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f = SSL_get_sessio
12f70 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 n(ssl);. if (
12f80 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 session != NULL)
12f90 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e {..const unsign
12fa0 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
12fb0 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 ..size_t len2;..
12fc0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 unsigned int ule
12fd0 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e n;..const unsign
12fe0 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
12ff0 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e _id, *proto;..un
13000 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 signed char buff
13010 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 er[SSL_MAX_MASTE
13020 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a R_KEY_LENGTH];..
13030 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 ./* Report the s
13040 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
13050 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 as a result of
13060 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 the ALPN negotia
13070 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 tion */..SSL_SES
13080 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 SION_get0_alpn_s
13090 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c elected(session,
130a0 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b &proto, &len2);
130b0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
130c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 terp, objPtr, "a
130d0 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 lpn", (char *) p
130e0 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 roto, (Tcl_Size)
130f0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 len2);.../* Rep
13100 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 ort the selected
13110 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 protocol as a r
13120 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e esult of the NPN
13130 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a negotiation */.
13140 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 #ifdef USE_NPN..
13150 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 SSL_get0_next_pr
13160 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 oto_negotiated(s
13170 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 sl, &proto, &ule
13180 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 n);..LAPPEND_STR
13190 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
131a0 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 "npn", (char *)
131b0 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a proto, (Tcl_Siz
131c0 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 e) ulen);.#endif
131d0 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 .../* Resumable
131e0 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 session */..LAPP
131f0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
13200 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 objPtr, "resuma
13210 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f ble", SSL_SESSIO
13220 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 N_is_resumable(s
13230 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 ession));.../* S
13240 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d ession start tim
13250 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 e (seconds since
13260 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 epoch) */..LAPP
13270 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c END_LONG(interp,
13280 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f objPtr, "start_
13290 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 time", SSL_SESSI
132a0 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 ON_get_time(sess
132b0 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 ion));.../* Time
132c0 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f out value - SSL_
132d0 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 CTX_get_timeout
132e0 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a (in seconds) */.
132f0 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e .LAPPEND_LONG(in
13300 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 terp, objPtr, "t
13310 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 imeout", SSL_SES
13320 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 SION_get_timeout
13330 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a (session));.../*
13340 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c Session id - TL
13350 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 Sv1.2 and below
13360 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e only */..session
13370 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f _id = SSL_SESSIO
13380 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e N_get_id(session
13390 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 , &ulen);..LAPPE
133a0 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 ND_BARRAY(interp
133b0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 , objPtr, "sessi
133c0 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f on_id", session_
133d0 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 id, (Tcl_Size) u
133e0 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 len);.../* Sessi
133f0 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 on context */..s
13400 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f ession_id = SSL_
13410 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f SESSION_get0_id_
13420 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c context(session,
13430 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e &ulen);..LAPPEN
13440 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c D_BARRAY(interp,
13450 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
13460 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 n_context", sess
13470 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a ion_id, (Tcl_Siz
13480 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 e) ulen);.../* S
13490 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 ession ticket -
134a0 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 client only */..
134b0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
134c0 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c _ticket(session,
134d0 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 &ticket, &len2)
134e0 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 ;..LAPPEND_BARRA
134f0 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 Y(interp, objPtr
13500 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 , "session_ticke
13510 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c t", ticket, (Tcl
13520 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 _Size) len2);...
13530 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 /* Session ticke
13540 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 t lifetime hint
13550 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a (in seconds) */.
13560 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e .LAPPEND_LONG(in
13570 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c terp, objPtr, "l
13580 69 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 ifetime", SSL_SE
13590 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 SSION_get_ticket
135a0 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 _lifetime_hint(s
135b0 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 ession));.../* T
135c0 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a icket app data *
135d0 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 /.#if OPENSSL_VE
135e0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
135f0 78 33 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f x30000000L..SSL_
13600 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 SESSION_get0_tic
13610 6b 65 74 5f 61 70 70 64 61 74 61 28 28 53 53 4c ket_appdata((SSL
13620 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 73 _SESSION *) sess
13630 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c ion, &ticket, &l
13640 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 en2);..LAPPEND_B
13650 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 ARRAY(interp, ob
13660 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 jPtr, "ticket_ap
13670 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c p_data", ticket,
13680 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
13690 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47 );.#endif.../* G
136a0 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f et master key */
136b0 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 ..len2 = SSL_SES
136c0 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f SION_get_master_
136d0 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 key(session, buf
136e0 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 fer, SSL_MAX_MAS
136f0 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b TER_KEY_LENGTH);
13700 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
13710 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
13720 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 "master_key", b
13730 75 66 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 uffer, (Tcl_Size
13740 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f ) len2);.../* Co
13750 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a mpression id */.
13760 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 .unsigned int id
13770 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
13780 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 et_compress_id(s
13790 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e ession);..LAPPEN
137a0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
137b0 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 jPtr, "compressi
137c0 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 on_id", id == 1
137d0 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 ? "zlib" : "none
137e0 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 ", -1);. }..
137f0 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f /* Compressio
13800 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 n info */. if
13810 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b (ssl != NULL) {
13820 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c .#ifdef HAVE_SSL
13830 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f _COMPRESSION..co
13840 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 nst COMP_METHOD
13850 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 *comp, *expn;..c
13860 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 omp = SSL_get_cu
13870 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f rrent_compressio
13880 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 n(ssl);..expn =
13890 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f SSL_get_current_
138a0 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a expansion(ssl);.
138b0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
138c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
138d0 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d ompression", com
138e0 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 p ? SSL_COMP_get
138f0 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e _name(comp) : "n
13900 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 one", -1);..LAPP
13910 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
13920 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 objPtr, "expansi
13930 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f on", expn ? SSL_
13940 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 COMP_get_name(ex
13950 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 pn) : "none", -1
13960 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e );.#else..LAPPEN
13970 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
13980 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 jPtr, "compressi
13990 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 on", "none", -1)
139a0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
139b0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
139c0 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e expansion", "non
139d0 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a e", -1);.#endif.
139e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
139f0 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 rver info */.
13a00 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 {..long mode =
13a10 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 SSL_CTX_get_sess
13a20 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 ion_cache_mode(s
13a30 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 tatePtr->ctx);..
13a40 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 char *msg;...if
13a50 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 (mode & SSL_SESS
13a60 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 _CACHE_OFF) {..
13a70 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a msg = "off";.
13a80 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 .} else if (mode
13a90 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
13aa0 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 E_CLIENT) {..
13ab0 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b msg = "client";
13ac0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 ..} else if (mod
13ad0 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 e & SSL_SESS_CAC
13ae0 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 HE_SERVER) {..
13af0 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22 msg = "server"
13b00 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f ;..} else if (mo
13b10 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 de & SSL_SESS_CA
13b20 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 CHE_BOTH) {..
13b30 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 msg = "both";..
13b40 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 } else {.. ms
13b50 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 g = "unknown";..
13b60 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 }..LAPPEND_STR(i
13b70 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
13b80 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f session_cache_mo
13b90 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 de", msg, -1);.
13ba0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 }.. /* CA
13bb0 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 List */. /* I
13bc0 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20 F not a server,
13bd0 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30 same as SSL_get0
13be0 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 _peer_CA_list. I
13bf0 66 20 73 65 72 76 65 72 20 73 61 6d 65 20 61 73 f server same as
13c00 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 SSL_CTX_get_cli
13c10 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 ent_CA_list */.
13c20 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c listPtr = Tcl
13c30 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
13c40 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f ULL);. STACK_
13c50 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 OF(X509_NAME) *c
13c60 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 a_list;. if (
13c70 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 (ca_list = SSL_g
13c80 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 et_client_CA_lis
13c90 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 t(ssl)) != NULL)
13ca0 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b {..char buffer[
13cb0 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 BUFSIZ];..for (i
13cc0 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b nt i = 0; i < sk
13cd0 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 _X509_NAME_num(c
13ce0 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a a_list); i++) {.
13cf0 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a . X509_NAME *
13d00 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e name = sk_X509_N
13d10 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 AME_value(ca_lis
13d20 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 t, i);.. if (
13d30 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e name) {...X509_N
13d40 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 AME_oneline(name
13d50 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a , buffer, BUFSIZ
13d60 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a );...Tcl_ListObj
13d70 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
13d80 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 terp, listPtr, T
13d90 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
13da0 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 buffer, -1));..
13db0 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 }..}. }.
13dc0 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e LAPPEND_OBJ(in
13dd0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
13de0 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29 aList", listPtr)
13df0 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e ;. LAPPEND_IN
13e00 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
13e10 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c , "caListCount",
13e20 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 sk_X509_NAME_nu
13e30 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 m(ca_list));..
13e40 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
13e50 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
13e60 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
13e70 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
13e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ec0 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f ---. *. * Versio
13ed0 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 nObjCmd -- retur
13ee0 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 n version string
13ef0 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 from OpenSSL..
13f00 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
13f10 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
13f20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
13f30 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
13f40 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
13f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
13f90 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 /.static int.Ver
13fa0 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e sionObjCmd(Clien
13fb0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
13fc0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
13fd0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
13fe0 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
13ff0 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
14000 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 _Obj *objPtr;.
14010 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 (void) clientD
14020 61 74 61 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 ata;. (void)
14030 6f 62 6a 63 3b 0a 20 20 20 20 28 76 6f 69 64 29 objc;. (void)
14040 20 6f 62 6a 76 3b 0a 0a 20 20 20 20 64 70 72 69 objv;.. dpri
14050 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
14060 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
14070 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 _NewStringObj(OP
14080 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 ENSSL_VERSION_TE
14090 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c XT, -1);. Tcl
140a0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
140b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a terp, objPtr);..
140c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
140d0 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
140e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
140f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
14120 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 *. * MiscObjCmd
14130 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 -- misc command
14140 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
14150 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
14160 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
14170 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
14180 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
14190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
141a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
141b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
141c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
141d0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
141e0 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e MiscObjCmd(Clien
141f0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
14200 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
14210 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
14220 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
14230 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 bjv[]) {. sta
14240 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tic const char *
14250 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 commands [] = {
14260 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c "req", "strreq",
14270 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 NULL };. enu
14280 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 m command { C_RE
14290 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 Q, C_STRREQ, C_D
142a0 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f UMMY };. Tcl_
142b0 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e Size cmd;. in
142c0 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 t isStr;. cha
142d0 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b r buffer[16384];
142e0 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 . (void) clie
142f0 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ntData;.. dpr
14300 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
14310 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 . if (objc <
14320 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
14330 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
14340 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d , objv, "subcomm
14350 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 and ?args?");..r
14360 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
14370 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 . }. if (T
14380 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f cl_GetIndexFromO
14390 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
143a0 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 1], commands, "c
143b0 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64 ommand", 0, &cmd
143c0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
143d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
143e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
143f0 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
14400 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d . isStr = (cm
14410 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a d == C_STRREQ);.
14420 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 switch ((enu
14430 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 m command) cmd)
14440 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 {..case C_REQ:..
14450 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b case C_STRREQ: {
14460 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a .. EVP_PKEY *
14470 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 pkey=NULL;..
14480 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b X509 *cert=NULL;
14490 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 .. X509_NAME
144a0 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 *name=NULL;..
144b0 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 Tcl_Obj **listv
144c0 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 ;.. Tcl_Size
144d0 6c 69 73 74 63 3b 0a 09 20 20 20 20 69 6e 74 20 listc;.. int
144e0 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 i;... BIO *ou
144f0 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 t=NULL;... ch
14500 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 ar *k_C="",*k_ST
14510 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f ="",*k_L="",*k_O
14520 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f ="",*k_OU="",*k_
14530 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 CN="",*k_Email="
14540 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 ";.. char *ke
14550 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 yout,*pemout,*st
14560 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 r;.. int keys
14570 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 ize,serial=0,day
14580 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e s=365;..#if OPEN
14590 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
145a0 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
145b0 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e .. BIGNUM *bn
145c0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 e = NULL;.. R
145d0 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a SA *rsa = NULL;.
145e0 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50 #else.. EVP_P
145f0 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e KEY_CTX *ctx = N
14600 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 ULL;.#endif...
14610 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c if ((objc<5) |
14620 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 | (objc>6)) {...
14630 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
14640 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 (interp, 2, objv
14650 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 , "keysize keyfi
14660 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 le certfile ?inf
14670 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 o?");...return T
14680 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
14690 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 ... if (Tcl_G
146a0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 etIntFromObj(int
146b0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b erp, objv[2], &k
146c0 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f eysize) != TCL_O
146d0 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 K) {...return TC
146e0 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
146f0 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f . keyout=Tcl_
14700 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 GetString(objv[3
14710 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d ]);.. pemout=
14720 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
14730 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 jv[4]);.. if
14740 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f (isStr) {...Tcl_
14750 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 SetVar(interp,ke
14760 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 yout,"",0);...Tc
14770 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
14780 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 pemout,"",0);..
14790 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f }... if (o
147a0 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 bjc>=6) {...if (
147b0 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c Tcl_ListObjGetEl
147c0 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f ements(interp, o
147d0 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20 bjv[5], &listc,
147e0 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f &listv) != TCL_O
147f0 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 K) {... retur
14800 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
14810 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 ....if ((listc%2
14820 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 ) != 0) {...
14830 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
14840 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f terp,"Informatio
14850 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 n list must have
14860 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 even number of
14870 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 arguments",NULL)
14880 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
14890 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 CL_ERROR;...}...
148a0 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 for (i=0; i<list
148b0 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 c; i+=2) {...
148c0 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 str=Tcl_GetStri
148d0 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 ng(listv[i]);...
148e0 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 if (strcmp(s
148f0 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b tr,"days")==0) {
14900 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
14910 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
14920 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 ,listv[i+1],&day
14930 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 s)!=TCL_OK)....
14940 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
14950 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 ROR;... } els
14960 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
14970 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b ,"serial")==0) {
14980 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
14990 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
149a0 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 ,listv[i+1],&ser
149b0 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 ial)!=TCL_OK)...
149c0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
149d0 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 ERROR;... } e
149e0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
149f0 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 tr,"C")==0) {...
14a00 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 .k_C=Tcl_GetStri
14a10 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
14a20 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
14a30 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 (strcmp(str,"ST"
14a40 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d )==0) {....k_ST=
14a50 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
14a60 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
14a70 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
14a80 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 mp(str,"L")==0)
14a90 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 {....k_L=Tcl_Get
14aa0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
14ab0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
14ac0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
14ad0 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "O")==0) {....k_
14ae0 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 O=Tcl_GetString(
14af0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
14b00 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
14b10 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d rcmp(str,"OU")==
14b20 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 0) {....k_OU=Tcl
14b30 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
14b40 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
14b50 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
14b60 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a str,"CN")==0) {.
14b70 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 ...k_CN=Tcl_GetS
14b80 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
14b90 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
14ba0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
14bb0 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 Email")==0) {...
14bc0 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 .k_Email=Tcl_Get
14bd0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
14be0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
14bf0 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 {....Tcl_SetRes
14c00 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e ult(interp,"Unkn
14c10 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e own parameter",N
14c20 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 ULL);....return
14c30 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
14c40 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 }...}.. }..#
14c50 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
14c60 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
14c70 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 000000L.. bne
14c80 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 = BN_new();..
14c90 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 rsa = RSA_new(
14ca0 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 );.. pkey = E
14cb0 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 VP_PKEY_new();..
14cc0 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e if (bne == N
14cd0 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 ULL || rsa == NU
14ce0 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 LL || pkey == NU
14cf0 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f LL || !BN_set_wo
14d00 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c rd(bne,RSA_F4) |
14d10 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 |...!RSA_generat
14d20 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 e_key_ex(rsa, ke
14d30 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c ysize, bne, NULL
14d40 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 ) || !EVP_PKEY_a
14d50 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 ssign_RSA(pkey,
14d60 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b rsa)) {...EVP_PK
14d70 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 EY_free(pkey);..
14d80 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 ./* RSA_free(rsa
14d90 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f ); freed by EVP_
14da0 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 PKEY_free */...B
14db0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c N_free(bne);.#el
14dc0 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 se.. pkey = E
14dd0 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 VP_RSA_gen((unsi
14de0 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a gned int) keysiz
14df0 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 e);.. ctx = E
14e00 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 VP_PKEY_CTX_new(
14e10 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 pkey,NULL);..
14e20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c if (pkey == NUL
14e30 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c L || ctx == NULL
14e40 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 || !EVP_PKEY_ke
14e50 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c ygen_init(ctx) |
14e60 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 |...!EVP_PKEY_CT
14e70 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e X_set_rsa_keygen
14e80 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 _bits(ctx, keysi
14e90 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 ze) || !EVP_PKEY
14ea0 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b _keygen(ctx, &pk
14eb0 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 ey)) {...EVP_PKE
14ec0 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 Y_free(pkey);...
14ed0 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 EVP_PKEY_CTX_fre
14ee0 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 e(ctx);.#endif..
14ef0 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
14f00 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e nterp,"Error gen
14f10 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 erating private
14f20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 key",NULL);...re
14f30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
14f40 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
14f50 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 if (isStr) {...
14f60 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
14f70 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 IO_s_mem());...
14f80 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
14f90 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c _PrivateKey(out,
14fa0 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 pkey,NULL,NULL,0
14fb0 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ,NULL,NULL);...
14fc0 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 i=BIO_read(ou
14fd0 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 t,buffer,sizeof(
14fe0 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 buffer)-1);...
14ff0 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 i=(i<0) ? 0 :
15000 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b i;... buffer[
15010 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 i]='\0';... T
15020 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
15030 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 ,keyout,buffer,0
15040 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 );... BIO_flu
15050 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 sh(out);... B
15060 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 IO_free(out);...
15070 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f } else {... o
15080 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
15090 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 _file());...
150a0 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 BIO_write_filena
150b0 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a me(out,keyout);.
150c0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
150d0 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f bio_PrivateKey(o
150e0 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c ut,pkey,NULL,NUL
150f0 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a L,0,NULL,NULL);.
15100 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 .. /* PEM_wri
15110 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 te_bio_RSAPrivat
15120 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e eKey(out, rsa, N
15130 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 ULL, NULL, 0, NU
15140 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 LL, NULL); */...
15150 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c BIO_free_all
15160 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 (out);.. .}....i
15170 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 f ((cert=X509_ne
15180 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 w())==NULL) {...
15190 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
151a0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
151b0 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 generating certi
151c0 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c ficate request",
151d0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 NULL);... EVP
151e0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
151f0 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
15200 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
15210 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 x30000000L...
15220 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 BN_free(bne);.#
15230 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 endif... retu
15240 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
15250 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 }....X509_set_ve
15260 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 rsion(cert,2);..
15270 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 .ASN1_INTEGER_se
15280 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 t(X509_get_seria
15290 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 lNumber(cert),se
152a0 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d rial);...X509_gm
152b0 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 time_adj(X509_ge
152c0 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 tm_notBefore(cer
152d0 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d t),0);...X509_gm
152e0 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 time_adj(X509_ge
152f0 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 tm_notAfter(cert
15300 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 ),(long)60*60*24
15310 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 *days);...X509_s
15320 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 et_pubkey(cert,p
15330 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 key);....name=X5
15340 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 09_get_subject_n
15350 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 ame(cert);....X5
15360 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
15370 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 y_by_txt(name,"C
15380 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
15390 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
153a0 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 char *) k_C, -1
153b0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
153c0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
153d0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 by_txt(name,"ST"
153e0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
153f0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
15400 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 char *) k_ST, -1
15410 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
15420 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
15430 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c by_txt(name,"L",
15440 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
15450 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
15460 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 har *) k_L, -1,
15470 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
15480 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
15490 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d _txt(name,"O", M
154a0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
154b0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
154c0 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 r *) k_O, -1, -1
154d0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
154e0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
154f0 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 xt(name,"OU", MB
15500 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
15510 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
15520 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 *) k_OU, -1, -1
15530 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
15540 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
15550 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 xt(name,"CN", MB
15560 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
15570 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
15580 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 *) k_CN, -1, -1
15590 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
155a0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
155b0 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c xt(name,"Email",
155c0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
155d0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
155e0 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 har *) k_Email,
155f0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 -1, -1, 0);....X
15600 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 509_set_subject_
15610 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b name(cert,name);
15620 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 ....if (!X509_si
15630 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 gn(cert,pkey,EVP
15640 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 _sha256())) {...
15650 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 X509_free(ce
15660 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 rt);... EVP_P
15670 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
15680 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
15690 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
156a0 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 0000000L... B
156b0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e N_free(bne);.#en
156c0 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 dif... Tcl_Se
156d0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
156e0 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 Error signing ce
156f0 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 rtificate",NULL)
15700 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
15710 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 CL_ERROR;...}...
15720 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 .if (isStr) {...
15730 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
15740 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 BIO_s_mem());...
15750 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 PEM_write_bi
15760 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 o_X509(out,cert)
15770 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 ;... i=BIO_re
15780 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 ad(out,buffer,si
15790 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b zeof(buffer)-1);
157a0 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f ... i=(i<0) ?
157b0 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 0 : i;... bu
157c0 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 ffer[i]='\0';...
157d0 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 Tcl_SetVar(i
157e0 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 nterp,pemout,buf
157f0 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 fer,0);... BI
15800 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 O_flush(out);...
15810 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 BIO_free(out
15820 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
15830 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
15840 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 BIO_s_file());..
15850 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 . BIO_write_f
15860 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f ilename(out,pemo
15870 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ut);... PEM_w
15880 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 rite_bio_X509(ou
15890 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 t,cert);... B
158a0 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 IO_free_all(out)
158b0 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 ;...}....X509_fr
158c0 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f ee(cert);...EVP_
158d0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
158e0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
158f0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
15900 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 30000000L...BN_f
15910 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 ree(bne);.#endif
15920 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 .. }..}..brea
15930 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a k;. default:.
15940 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 .break;. }.
15950 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
15960 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .}.../**********
15970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 **********/./* I
15980 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 nit
15990 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./************
159a0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a ********/../*. *
159b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159f0 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 ---. *. * Tls_Fr
15a00 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 ee --. *. *.This
15a10 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e procedure clean
15a20 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 s up when a SSL
15a30 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 socket based cha
15a40 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 nnel. *.is close
15a50 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 d and its refere
15a60 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 nce count falls
15a70 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 below 1. *. * Re
15a80 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 sults:. *.none.
15a90 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
15aa0 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 s:. *.Frees all
15ab0 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d the state. *. *-
15ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b00 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f --. */.void.Tls_
15b10 46 72 65 65 28 74 6c 73 5f 66 72 65 65 5f 74 79 Free(tls_free_ty
15b20 70 65 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a pe *blockPtr) {.
15b30 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
15b40 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 Ptr = (State *)b
15b50 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 lockPtr;.. dp
15b60 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
15b70 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 .. Tls_Clean(
15b80 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 statePtr);. c
15b90 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b kfree(blockPtr);
15ba0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
15bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
15bf0 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d . * Tls_Clean --
15c00 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
15c10 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 edure cleans up
15c20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 when a SSL socke
15c30 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a t based channel.
15c40 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 *.is closed and
15c50 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 its reference c
15c60 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 ount falls below
15c70 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 1. This should
15c80 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 . *.be called sy
15c90 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 nchronously by t
15ca0 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f he CloseProc, no
15cb0 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e t in the. *.Even
15cc0 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 tuallyFree callb
15cd0 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ack.. *. * Resul
15ce0 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 ts:. *.none. *.
15cf0 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
15d00 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 *.Frees all the
15d10 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d state. *. *----
15d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
15d60 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 */.void Tls_Cle
15d70 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 an(State *stateP
15d80 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 tr) {. dprint
15d90 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
15da0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
15db0 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 65 6e 64 20 ssl) {../* Send
15dc0 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 6d 65 73 close_notify mes
15dd0 73 61 67 65 20 2a 2f 0a 09 64 70 72 69 6e 74 66 sage */..dprintf
15de0 28 22 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28 25 ("SSL_shutdown(%
15df0 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 p)", statePtr->s
15e00 73 6c 29 3b 0a 09 2f 2a 20 57 69 6c 6c 20 72 65 sl);../* Will re
15e10 74 75 72 6e 20 72 65 74 75 72 6e 20 30 20 77 68 turn return 0 wh
15e20 69 6c 65 20 73 68 75 74 64 6f 77 6e 20 69 6e 20 ile shutdown in
15e30 70 72 6f 63 65 73 73 2c 20 74 68 65 6e 20 31 20 process, then 1
15e40 77 68 65 6e 20 63 6f 6d 70 6c 65 74 65 20 2a 2f when complete */
15e50 0a 09 2f 2a 20 63 6c 6f 73 65 73 20 74 68 65 20 ../* closes the
15e60 77 72 69 74 65 20 64 69 72 65 63 74 69 6f 6e 20 write direction
15e70 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f of the connectio
15e80 6e 3b 20 74 68 65 20 72 65 61 64 20 64 69 72 65 n; the read dire
15e90 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 20 ction is closed
15ea0 62 79 20 74 68 65 20 70 65 65 72 2e 20 2a 2f 0a by the peer. */.
15eb0 09 2f 2a 20 44 6f 65 73 20 6e 6f 74 20 61 66 66 ./* Does not aff
15ec0 65 63 74 20 73 6f 63 6b 65 74 20 2a 2f 0a 09 53 ect socket */..S
15ed0 53 4c 5f 73 68 75 74 64 6f 77 6e 28 73 74 61 74 SL_shutdown(stat
15ee0 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
15ef0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
15f00 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 we're assuming
15f10 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20 here that we're
15f20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a single-threaded.
15f30 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 */. if (
15f40 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
15f50 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b != (Tcl_TimerTok
15f60 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c en) NULL) {..Tcl
15f70 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 _DeleteTimerHand
15f80 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 ler(statePtr->ti
15f90 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d mer);..statePtr-
15fa0 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 >timer = NULL;.
15fb0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d }.. /* Rem
15fc0 6f 76 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f ove callbacks */
15fd0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
15fe0 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 r->callback) {..
15ff0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
16000 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
16010 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ack);..statePtr-
16020 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c >callback = NULL
16030 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
16040 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
16050 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 rd) {..Tcl_DecrR
16060 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
16070 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 ->password);..st
16080 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
16090 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
160a0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
160b0 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 >vcmd) {..Tcl_De
160c0 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
160d0 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 Ptr->vcmd);..sta
160e0 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 tePtr->vcmd = NU
160f0 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 LL;. }.. i
16100 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f f (statePtr->pro
16110 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 tos) {..ckfree(s
16120 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 tatePtr->protos)
16130 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f ;..statePtr->pro
16140 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 tos = NULL;.
16150 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
16160 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 Ptr->bio) {../*
16170 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 This will call S
16180 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 SL_shutdown. Bug
16190 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 1414045 */..dpr
161a0 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 intf("BIO_free_a
161b0 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 ll(%p)", statePt
161c0 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 r->bio);..BIO_fr
161d0 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d ee_all(statePtr-
161e0 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 >bio);..statePtr
161f0 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->bio = NULL;.
16200 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 }.. if (sta
16210 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 tePtr->ssl) {..d
16220 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 printf("SSL_free
16230 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d (%p)", statePtr-
16240 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 >ssl);..SSL_free
16250 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
16260 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 ..statePtr->ssl
16270 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 = NULL;. }..
16280 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
16290 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 >ctx) {..SSL_CTX
162a0 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e _free(statePtr->
162b0 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ctx);..statePtr-
162c0 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 >ctx = NULL;.
162d0 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 }.. dprintf(
162e0 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a "Returning");.}.
162f0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
16300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
16340 0a 20 2a 20 42 75 69 6c 64 20 49 6e 66 6f 20 43 . * Build Info C
16350 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ommand --. *. *.
16360 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
16370 6f 20 72 65 74 75 72 6e 20 62 75 69 6c 64 20 69 o return build i
16380 6e 66 6f 20 66 6f 72 20 70 61 63 6b 61 67 65 2e nfo for package.
16390 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
163a0 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
163b0 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 l result. *. * S
163c0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
163d0 43 72 65 61 74 65 64 20 62 75 69 6c 64 2d 69 6e Created build-in
163e0 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 fo command.. *.
163f0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
16400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16430 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 -------. */..#if
16440 6e 64 65 66 20 53 54 52 49 4e 47 49 46 59 0a 23 ndef STRINGIFY.#
16450 20 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49 define STRINGI
16460 46 59 28 78 29 20 53 54 52 49 4e 47 49 46 59 31 FY(x) STRINGIFY1
16470 28 78 29 0a 23 20 20 64 65 66 69 6e 65 20 53 54 (x).# define ST
16480 52 49 4e 47 49 46 59 31 28 78 29 20 23 78 0a 23 RINGIFY1(x) #x.#
16490 65 6e 64 69 66 0a 0a 69 6e 74 0a 42 75 69 6c 64 endif..int.Build
164a0 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 54 63 6c 5f InfoCommand(Tcl_
164b0 49 6e 74 65 72 70 2a 20 69 6e 74 65 72 70 29 20 Interp* interp)
164c0 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64 49 6e 66 {. Tcl_CmdInf
164d0 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 69 66 20 o info;.. if
164e0 28 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 (Tcl_GetCommandI
164f0 6e 66 6f 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 nfo(interp, "::t
16500 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c cl::build-info",
16510 20 26 69 6e 66 6f 29 29 20 7b 0a 09 54 63 6c 5f &info)) {..Tcl_
16520 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
16530 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a (interp, "::tls:
16540 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 69 6e :build-info", in
16550 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28 76 6f 69 fo.objProc, (voi
16560 64 20 2a 29 28 0a 09 09 50 41 43 4b 41 47 45 5f d *)(...PACKAGE_
16570 56 45 52 53 49 4f 4e 20 22 2b 22 20 53 54 52 49 VERSION "+" STRI
16580 4e 47 49 46 59 28 54 4c 53 5f 56 45 52 53 49 4f NGIFY(TLS_VERSIO
16590 4e 5f 55 55 49 44 29 0a 23 69 66 20 64 65 66 69 N_UUID).#if defi
165a0 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 ned(__clang__) &
165b0 26 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e & defined(__clan
165c0 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09 09 20 20 g_major__)....
165d0 20 20 22 2e 63 6c 61 6e 67 2d 22 20 53 54 52 49 ".clang-" STRI
165e0 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 61 NGIFY(__clang_ma
165f0 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f 63 6c 61 jor__).#if __cla
16600 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20 31 30 0a ng_minor__ < 10.
16610 09 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64 69 ... "0".#endi
16620 66 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47 49 f.... STRINGI
16630 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 FY(__clang_minor
16640 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 __).#endif.#if d
16650 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c efined(__cpluspl
16660 75 73 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 us) && !defined(
16670 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09 20 20 20 __OBJC__)....
16680 20 22 2e 63 70 6c 75 73 70 6c 75 73 22 0a 23 65 ".cplusplus".#e
16690 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 ndif.#ifndef NDE
166a0 42 55 47 0a 09 09 09 20 20 20 20 22 2e 64 65 62 BUG.... ".deb
166b0 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ug".#endif.#if !
166c0 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f defined(__clang_
166d0 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f _) && !defined(_
166e0 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 _INTEL_COMPILER)
166f0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e && defined(__GN
16700 55 43 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 67 UC__).... ".g
16710 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f cc-" STRINGIFY(_
16720 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 20 5f 5f 47 _GNUC__).#if __G
16730 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c 20 31 30 NUC_MINOR__ < 10
16740 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64 .... "0".#end
16750 69 66 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47 if.... STRING
16760 49 46 59 28 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 IFY(__GNUC_MINOR
16770 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 __).#endif.#ifde
16780 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c f __INTEL_COMPIL
16790 45 52 0a 09 09 09 20 20 20 20 22 2e 69 63 63 2d ER.... ".icc-
167a0 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 49 4e " STRINGIFY(__IN
167b0 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 0a 23 65 TEL_COMPILER).#e
167c0 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c 5f ndif.#ifdef TCL_
167d0 4d 45 4d 5f 44 45 42 55 47 0a 09 09 09 20 20 20 MEM_DEBUG....
167e0 20 22 2e 6d 65 6d 64 65 62 75 67 22 0a 23 65 6e ".memdebug".#en
167f0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
16800 5f 4d 53 43 5f 56 45 52 29 0a 09 09 09 20 20 20 _MSC_VER)....
16810 20 22 2e 6d 73 76 63 2d 22 20 53 54 52 49 4e 47 ".msvc-" STRING
16820 49 46 59 28 5f 4d 53 43 5f 56 45 52 29 0a 23 65 IFY(_MSC_VER).#e
16830 6e 64 69 66 0a 23 69 66 64 65 66 20 55 53 45 5f ndif.#ifdef USE_
16840 4e 4d 41 4b 45 0a 09 09 09 20 20 20 20 22 2e 6e NMAKE.... ".n
16850 6d 61 6b 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 make".#endif.#if
16860 6e 64 65 66 20 54 43 4c 5f 43 46 47 5f 4f 50 54 ndef TCL_CFG_OPT
16870 49 4d 49 5a 45 44 0a 09 09 09 20 20 20 20 22 2e IMIZED.... ".
16880 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a 23 65 6e no-optimize".#en
16890 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 4f 42 4a dif.#ifdef __OBJ
168a0 43 5f 5f 0a 09 09 09 20 20 20 20 22 2e 6f 62 6a C__.... ".obj
168b0 65 63 74 69 76 65 2d 63 22 0a 23 69 66 20 64 65 ective-c".#if de
168c0 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 fined(__cplusplu
168d0 73 29 0a 09 09 09 20 20 20 20 22 70 6c 75 73 70 s).... "plusp
168e0 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 65 6e 64 lus".#endif.#end
168f0 69 66 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 46 if.#ifdef TCL_CF
16900 47 5f 50 52 4f 46 49 4c 45 44 0a 09 09 09 20 20 G_PROFILED....
16910 20 20 22 2e 70 72 6f 66 69 6c 65 22 0a 23 65 6e ".profile".#en
16920 64 69 66 0a 23 69 66 64 65 66 20 50 55 52 49 46 dif.#ifdef PURIF
16930 59 0a 09 09 09 20 20 20 20 22 2e 70 75 72 69 66 Y.... ".purif
16940 79 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 y".#endif.#ifdef
16950 20 53 54 41 54 49 43 5f 42 55 49 4c 44 0a 09 09 STATIC_BUILD...
16960 09 20 20 20 20 22 2e 73 74 61 74 69 63 22 0a 23 . ".static".#
16970 65 6e 64 69 66 0a 09 09 29 2c 20 4e 55 4c 4c 29 endif...), NULL)
16980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
16990 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
169a0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
169b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
169c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
169d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
169e0 2a 20 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e * TlsLibShutdown
169f0 20 2d 2d 0a 20 2a 0a 20 2a 09 53 68 75 74 64 6f --. *. *.Shutdo
16a00 77 6e 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f wn SSL library o
16a10 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 nce per applicat
16a20 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ion. *. * Result
16a30 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
16a40 20 54 43 4c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 TCL result. *.
16a50 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
16a60 20 2a 09 53 68 75 74 64 6f 77 6e 20 53 53 4c 20 *.Shutdown SSL
16a70 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 2d 2d 2d library. *. *---
16a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ab0 2d 2d 2d 2a 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c ---*. */.void Tl
16ac0 73 4c 69 62 53 68 75 74 64 6f 77 6e 28 43 6c 69 sLibShutdown(Cli
16ad0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
16ae0 74 61 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 ta) {. dprint
16af0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
16b00 20 20 42 49 4f 5f 63 6c 65 61 6e 75 70 28 29 3b BIO_cleanup();
16b10 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
16b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
16b50 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 . *. *.TlsLibIni
16b60 74 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 t --. *. *.Initi
16b70 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 alizes SSL libra
16b80 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c ry once per appl
16b90 69 63 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 ication. *. * Re
16ba0 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
16bb0 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a dard Tcl result.
16bc0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
16bd0 74 73 3a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a ts:. *.Initializ
16be0 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 es SSL library.
16bf0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
16c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a ----------*. */.
16c30 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 static int TlsLi
16c40 62 49 6e 69 74 28 29 20 7b 0a 20 20 20 20 73 74 bInit() {. st
16c50 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c atic int initial
16c60 69 7a 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 ized = 0;.. d
16c70 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
16c80 3b 0a 0a 20 20 20 20 69 66 20 28 21 69 6e 69 74 ;.. if (!init
16c90 69 61 6c 69 7a 65 64 29 20 7b 0a 09 2f 2a 20 49 ialized) {../* I
16ca0 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c nitialize BOTH l
16cb0 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 ibcrypto and lib
16cc0 73 73 6c 2e 20 2a 2f 0a 09 69 66 20 28 21 4f 50 ssl. */..if (!OP
16cd0 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f ENSSL_init_ssl(O
16ce0 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 PENSSL_INIT_LOAD
16cf0 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f _SSL_STRINGS | O
16d00 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 PENSSL_INIT_LOAD
16d10 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a _CRYPTO_STRINGS.
16d20 09 20 20 20 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 . | OPENSSL_I
16d30 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 NIT_ADD_ALL_CIPH
16d40 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e ERS | OPENSSL_IN
16d50 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 IT_ADD_ALL_DIGES
16d60 54 53 0a 09 20 20 20 20 7c 20 4f 50 45 4e 53 53 TS.. | OPENSS
16d70 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 4f 4e 46 L_INIT_LOAD_CONF
16d80 49 47 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 IG | OPENSSL_INI
16d90 54 5f 41 53 59 4e 43 2c 20 4e 55 4c 4c 29 29 20 T_ASYNC, NULL))
16da0 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 {.. return TC
16db0 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
16dc0 20 43 72 65 61 74 65 20 42 49 4f 20 68 61 6e 64 Create BIO hand
16dd0 6c 65 72 73 20 2a 2f 0a 09 42 49 4f 5f 6e 65 77 lers */..BIO_new
16de0 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 09 _tcl(NULL, 0);..
16df0 0a 09 2f 2a 20 43 72 65 61 74 65 20 65 78 69 74 ../* Create exit
16e00 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 09 54 63 6c handler */..Tcl
16e10 5f 43 72 65 61 74 65 45 78 69 74 48 61 6e 64 6c _CreateExitHandl
16e20 65 72 28 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 er(TlsLibShutdow
16e30 6e 2c 20 4e 55 4c 4c 29 3b 0a 09 69 6e 69 74 69 n, NULL);..initi
16e40 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 20 20 20 20 alized = 1;.
16e50 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c }. return TCL
16e60 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 20 49 6e 69 74 _OK;.}.../* Init
16e70 20 73 63 72 69 70 74 20 2a 2f 0a 73 74 61 74 69 script */.stati
16e80 63 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 c const char tls
16e90 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 TclInitScript[]
16ea0 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c = {.#include "tl
16eb0 73 2e 74 63 6c 2e 68 22 0a 7d 3b 0a 0a 2f 2a 0a s.tcl.h".};../*.
16ec0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
16ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f00 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
16f10 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Init --. *. *.Th
16f20 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 is is a package
16f30 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 initialization p
16f40 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 rocedure, which
16f50 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 is called. *.by
16f60 54 43 4c 20 77 68 65 6e 20 74 68 69 73 20 70 61 TCL when this pa
16f70 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 ckage is to be a
16f80 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 dded to an inter
16f90 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 preter.. *. * Re
16fa0 73 75 6c 74 73 3a 0a 20 2a 09 49 6e 69 74 69 61 sults:. *.Initia
16fb0 6c 69 7a 65 73 20 73 74 72 75 63 74 75 72 65 73 lizes structures
16fc0 20 61 6e 64 20 63 72 65 61 74 65 73 20 63 6f 6d and creates com
16fd0 6d 61 6e 64 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 mands.. *. * Sid
16fe0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 43 e effects:. *. C
16ff0 72 65 61 74 65 20 74 68 65 20 63 6f 6d 6d 61 6e reate the comman
17000 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ds. *. *--------
17010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
17050 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 .#if TCL_MAJOR_V
17060 45 52 53 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 ERSION > 8.#defi
17070 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 ne MIN_VERSION "
17080 39 2e 30 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 9.0".#else.#defi
17090 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 ne MIN_VERSION "
170a0 38 2e 35 22 0a 23 65 6e 64 69 66 0a 0a 44 4c 4c 8.5".#endif..DLL
170b0 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 EXPORT int Tls_I
170c0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a nit(Tcl_Interp *
170d0 69 6e 74 65 72 70 29 20 7b 0a 0a 20 20 20 20 64 interp) {.. d
170e0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
170f0 3b 0a 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 ;..#ifdef USE_TC
17100 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20 28 L_STUBS. if (
17110 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e Tcl_InitStubs(in
17120 74 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f terp, MIN_VERSIO
17130 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b N, 0) == NULL) {
17140 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
17150 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 OR;. }.#endif
17160 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 . if (Tcl_Pkg
17170 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 Require(interp,
17180 22 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49 "Tcl", MIN_VERSI
17190 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 ON, 0) == NULL)
171a0 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
171b0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
171c0 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 29 if (TlsLibInit()
171d0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 != TCL_OK) {..T
171e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
171f0 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e interp, "could n
17200 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 ot initialize SS
17210 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 63 68 61 L library", (cha
17220 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
17230 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
17240 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 }.. Tcl_Cr
17250 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
17260 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 63 nterp, "::tls::c
17270 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 iphers", Ciphers
17280 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
17290 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f ata) NULL, (Tcl_
172a0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
172b0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
172c0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
172d0 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a (interp, "::tls:
172e0 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f :connection", Co
172f0 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 nnectionInfoObjC
17300 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
17310 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 NULL, (Tcl_CmdD
17320 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
17330 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
17340 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
17350 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 68 61 6e erp, "::tls::han
17360 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 dshake", Handsha
17370 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e keObjCmd, (Clien
17380 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 tData) NULL, (Tc
17390 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
173a0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
173b0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
173c0 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c nd(interp, "::tl
173d0 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f s::import", Impo
173e0 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e rtObjCmd, (Clien
173f0 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 tData) NULL, (Tc
17400 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
17410 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
17420 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
17430 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c nd(interp, "::tl
17440 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e s::unimport", Un
17450 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 importObjCmd, (C
17460 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c lientData) NULL,
17470 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
17480 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
17490 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
174a0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
174b0 3a 3a 74 6c 73 3a 3a 75 6e 73 74 61 63 6b 22 2c ::tls::unstack",
174c0 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c UnimportObjCmd,
174d0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
174e0 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
174f0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
17500 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
17510 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
17520 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74 61 74 75 73 , "::tls::status
17530 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c ", StatusObjCmd,
17540 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
17550 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
17560 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
17570 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
17580 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
17590 2c 20 22 3a 3a 74 6c 73 3a 3a 76 65 72 73 69 6f , "::tls::versio
175a0 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d n", VersionObjCm
175b0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
175c0 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
175d0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
175e0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
175f0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
17600 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 6d 69 73 63 rp, "::tls::misc
17610 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 ", MiscObjCmd, (
17620 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
17630 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
17640 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
17650 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
17660 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
17670 22 3a 3a 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c "::tls::protocol
17680 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a s", ProtocolsObj
17690 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
176a0 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 ) NULL, (Tcl_Cmd
176b0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
176c0 4c 4c 29 3b 0a 0a 20 20 20 20 42 75 69 6c 64 49 LL);.. BuildI
176d0 6e 66 6f 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 nfoCommand(inter
176e0 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 p);.. if (int
176f0 65 72 70 20 26 26 20 54 63 6c 5f 45 76 61 6c 28 erp && Tcl_Eval(
17700 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e interp, tlsTclIn
17710 69 74 53 63 72 69 70 74 29 20 21 3d 20 54 43 4c itScript) != TCL
17720 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
17730 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
17740 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f . return Tcl_
17750 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 PkgProvide(inter
17760 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c p, PACKAGE_NAME,
17770 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e PACKAGE_VERSION
17780 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d );.}../*. *-----
17790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
177a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
177b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
177c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
177d0 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 *. *.Tls_SafeIni
177e0 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 t --. *. *.This
177f0 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 is a package ini
17800 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 tialization proc
17810 65 64 75 72 65 20 66 6f 72 20 73 61 66 65 20 69 edure for safe i
17820 6e 74 65 72 70 73 2e 0a 20 2a 0a 20 2a 20 52 65 nterps.. *. * Re
17830 73 75 6c 74 73 3a 0a 20 2a 09 53 61 6d 65 20 61 sults:. *.Same a
17840 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a s of 'Tls_Init'.
17850 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
17860 74 73 3a 0a 20 2a 09 53 61 6d 65 20 61 73 20 6f ts:. *.Same as o
17870 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a f 'Tls_Init'. *.
17880 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
17890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
178a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
178b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
178c0 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 -----. */.DLLEXP
178d0 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 ORT int Tls_Safe
178e0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 Init(Tcl_Interp
178f0 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 *interp) {. d
17900 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
17910 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c 73 ;. return Tls
17920 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 7d _Init(interp);.}
17930 0a .