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 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
10370 74 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 t(interp, GET_ER
10380 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
10390 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
103a0 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
103b0 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ...Tcl_DStringFr
103c0 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 44 ee(&ds);...Tcl_D
103d0 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 StringFree(&ds1)
103e0 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
103f0 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c .. }.. Tcl
10400 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
10410 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 );.. Tcl_DStr
10420 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 0a ingFree(&ds1);..
10430 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 . /* Set list
10440 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20 of CAs to send
10450 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 to client when r
10460 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65 equesting a clie
10470 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a nt certificate *
10480 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 73 3a /.. /* https:
10490 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 //sourceforge.ne
104a0 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f t/p/tls/bugs/57/
104b0 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 58 3a */.. /* XXX:
104c0 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 TODO: Let the us
104d0 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 er supply values
104e0 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 here instead of
104f0 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 something that
10500 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 exists on the fi
10510 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 20 20 lesystem */..
10520 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e STACK_OF(X509_N
10530 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 AME) *certNames
10540 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e = SSL_load_clien
10550 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 t_CA_file(F2N(CA
10560 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 file, &ds));..
10570 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 if (certNames
10580 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c != NULL) {...SSL
10590 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
105a0 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 CA_list(ctx, cer
105b0 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a tNames);.. }.
105c0 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
105d0 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 23 Free(&ds);..}..#
105e0 65 6c 73 65 0a 09 2f 2a 20 53 65 74 20 64 69 72 else../* Set dir
105f0 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e ectory containin
10600 67 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65 g CA certificate
10610 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d 61 74 2e s in PEM format.
10620 20 2a 2f 0a 09 69 66 20 28 43 41 70 61 74 68 20 */..if (CApath
10630 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
10640 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 if (!SSL_CTX_loa
10650 64 5f 76 65 72 69 66 79 5f 64 69 72 28 63 74 78 d_verify_dir(ctx
10660 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 , F2N(CApath, &d
10670 73 29 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 s))) {...Tcl_App
10680 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
10690 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
106a0 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
106b0 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
106c0 65 65 28 63 74 78 29 3b 0a 09 09 54 63 6c 5f 44 ee(ctx);...Tcl_D
106d0 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
106e0 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
106f0 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f . }.. Tcl_
10700 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
10710 3b 0a 09 7d 0a 09 0a 09 2f 2a 20 53 65 74 20 55 ;..}..../* Set U
10720 52 49 20 66 6f 72 20 74 6f 20 61 20 73 74 6f 72 RI for to a stor
10730 65 2c 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 e, which may be
10740 61 20 73 69 6e 67 6c 65 20 63 6f 6e 74 61 69 6e a single contain
10750 65 72 20 6f 72 20 61 20 63 61 74 61 6c 6f 67 20 er or a catalog
10760 6f 66 20 63 6f 6e 74 61 69 6e 65 72 73 2e 20 2a of containers. *
10770 2f 0a 09 69 66 20 28 43 41 73 74 6f 72 65 20 21 /..if (CAstore !
10780 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 = NULL) {.. i
10790 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 f (!SSL_CTX_load
107a0 5f 76 65 72 69 66 79 5f 73 74 6f 72 65 28 63 74 _verify_store(ct
107b0 78 2c 20 46 32 4e 28 43 41 73 74 6f 72 65 2c 20 x, F2N(CAstore,
107c0 26 64 73 29 29 29 20 7b 0a 09 09 54 63 6c 5f 41 &ds))) {...Tcl_A
107d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
107e0 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 rp, GET_ERR_REAS
107f0 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
10800 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
10810 66 72 65 65 28 63 74 78 29 3b 0a 09 09 54 63 6c free(ctx);...Tcl
10820 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
10830 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
10840 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 ;.. }.. Tc
10850 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
10860 73 29 3b 0a 09 7d 0a 09 0a 09 2f 2a 20 53 65 74 s);..}..../* Set
10870 20 66 69 6c 65 20 6f 66 20 43 41 20 63 65 72 74 file of CA cert
10880 69 66 69 63 61 74 65 73 20 69 6e 20 50 45 4d 20 ificates in PEM
10890 66 6f 72 6d 61 74 2e 20 20 2a 2f 0a 09 69 66 20 format. */..if
108a0 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 (CAfile != NULL)
108b0 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c {.. if (!SSL
108c0 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 _CTX_load_verify
108d0 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 _file(ctx, F2N(C
108e0 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a Afile, &ds))) {.
108f0 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
10900 6c 74 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 lt(interp, GET_E
10910 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
10920 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
10930 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
10940 3b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 ;...Tcl_DStringF
10950 72 65 65 28 26 64 73 29 3b 0a 09 09 72 65 74 75 ree(&ds);...retu
10960 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a rn NULL;.. }.
10970 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
10980 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 Free(&ds);...
10990 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 /* Set list of
109a0 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 CAs to send to c
109b0 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 lient when reque
109c0 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 sting a client c
109d0 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 ertificate */..
109e0 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 STACK_OF(X509
109f0 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 _NAME) *certName
10a00 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 s = SSL_load_cli
10a10 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 ent_CA_file(F2N(
10a20 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 CAfile, &ds));..
10a30 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 if (certName
10a40 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 s != NULL) {...S
10a50 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
10a60 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 t_CA_list(ctx, c
10a70 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 ertNames);..
10a80 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
10a90 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a ngFree(&ds);..}.
10aa0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
10ab0 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a return ctx;.}.
10ac0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
10ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
10b10 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d StatusObjCmd --
10b20 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 return certific
10b30 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 ate for connecte
10b40 64 20 70 65 65 72 20 69 6e 66 6f 2e 0a 20 2a 0a d peer info.. *.
10b50 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
10b60 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
10b70 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
10b80 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
10b90 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
10ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
10be0 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 static int.Statu
10bf0 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 sObjCmd(ClientDa
10c00 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
10c10 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
10c20 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
10c30 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
10c40 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 []) {. State
10c50 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 *statePtr;. X
10c60 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 509 *peer;. T
10c70 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a cl_Obj *objPtr;.
10c80 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
10c90 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a chan;. char *
10ca0 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 channelName, *ci
10cb0 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d phers;. int m
10cc0 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 ode;. const u
10cd0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 nsigned char *pr
10ce0 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 oto;. unsigne
10cf0 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 d int len;. i
10d00 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20 nt nid, res;.
10d10 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 (void) clientDa
10d20 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 ta;.. dprintf
10d30 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
10d40 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c if (objc < 2 ||
10d50 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 objc > 3 || (ob
10d60 6a 63 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 jc == 3 && !strc
10d70 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 mp(Tcl_GetString
10d80 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 (objv[1]), "-loc
10d90 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 al"))) {..Tcl_Wr
10da0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
10db0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c p, 1, objv, "?-l
10dc0 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b ocal? channel");
10dd0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
10de0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
10df0 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 * Get channel Id
10e00 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e */. channelN
10e10 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 ame = Tcl_GetStr
10e20 69 6e 67 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d ing(objv[(objc =
10e30 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a = 2 ? 1 : 2)]);.
10e40 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
10e50 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
10e60 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 , channelName, &
10e70 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 mode);. if (c
10e80 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
10e90 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
10ea0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
10eb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
10ec0 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
10ed0 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
10ee0 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
10ef0 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
10f00 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
10f10 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
10f20 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
10f30 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
10f40 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 Type()) {..Tcl_A
10f50 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
10f60 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
10f70 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
10f80 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
10f90 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 .."\": not a TLS
10fa0 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 channel", (char
10fb0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f *) NULL);..Tcl_
10fc0 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
10fd0 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 erp, "TLS", "STA
10fe0 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c TUS", "CHANNEL",
10ff0 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
11000 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
11010 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
11020 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 }. statePt
11030 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 r = (State *) Tc
11040 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
11050 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
11060 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 . /* Get cert
11070 69 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 ificate for peer
11080 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 or self */.
11090 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b if (objc == 2) {
110a0 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 ..peer = SSL_get
110b0 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 _peer_certificat
110c0 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
110d0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
110e0 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 peer = SSL_get_c
110f0 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 ertificate(state
11100 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
11110 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 . /* Get X509
11120 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 certificate inf
11130 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 o */. if (pee
11140 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 r) {..objPtr = T
11150 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e ls_NewX509Obj(in
11160 74 65 72 70 2c 20 70 65 65 72 2c 20 31 29 3b 0a terp, peer, 1);.
11170 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 .if (objc == 2)
11180 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 {.. X509_free
11190 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 (peer);.. pee
111a0 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 r = NULL;..}.
111b0 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 } else {..objPt
111c0 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
111d0 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 bj(0, NULL);.
111e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 }.. /* Peer
111f0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 name */. LAPP
11200 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11210 6f 62 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d objPtr, "peernam
11220 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 e", SSL_get0_pee
11230 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e rname(statePtr->
11240 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c ssl), -1);. L
11250 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
11260 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 p, objPtr, "sbit
11270 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 s", SSL_get_ciph
11280 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 er_bits(statePtr
11290 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a ->ssl, NULL));..
112a0 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 ciphers = (c
112b0 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 har*)SSL_get_cip
112c0 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 her(statePtr->ss
112d0 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f l);. LAPPEND_
112e0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
112f0 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 tr, "cipher", ci
11300 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 phers, -1);..
11310 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 /* Verify the X
11320 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 509 certificate
11330 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 presented by the
11340 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 peer */. LAP
11350 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11360 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 objPtr, "verify
11370 52 65 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 Result",..X509_v
11380 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 erify_cert_error
11390 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f _string(SSL_get_
113a0 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 verify_result(st
113b0 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d atePtr->ssl)), -
113c0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 1);.. /* Veri
113d0 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d fy mode */. m
113e0 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 ode = SSL_get_ve
113f0 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 rify_mode(stateP
11400 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 tr->ssl);. if
11410 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 (mode && SSL_VE
11420 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 RIFY_NONE) {..LA
11430 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11440 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 , objPtr, "verif
11450 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 yMode", "none",
11460 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 -1);. } else
11470 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 {..Tcl_Obj *list
11480 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 ObjPtr = Tcl_New
11490 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
114a0 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 ;..if (mode && S
114b0 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20 SL_VERIFY_PEER)
114c0 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
114d0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
114e0 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 interp, listObjP
114f0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
11500 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 gObj("peer", -1)
11510 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 );..}..if (mode
11520 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 && SSL_VERIFY_FA
11530 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 IL_IF_NO_PEER_CE
11540 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c RT) {.. Tcl_L
11550 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
11560 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 ent(interp, list
11570 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ObjPtr, Tcl_NewS
11580 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 tringObj("fail i
11590 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c f no peer cert",
115a0 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d -1));..}..if (m
115b0 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
115c0 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b Y_CLIENT_ONCE) {
115d0 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
115e0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
115f0 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 nterp, listObjPt
11600 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
11610 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 Obj("client once
11620 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 ", -1));..}..if
11630 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 (mode && SSL_VER
11640 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 IFY_POST_HANDSHA
11650 4b 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c KE) {.. Tcl_L
11660 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
11670 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 ent(interp, list
11680 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ObjPtr, Tcl_NewS
11690 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 tringObj("post h
116a0 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b andshake", -1));
116b0 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a ..}..LAPPEND_OBJ
116c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
116d0 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c "verifyMode", l
116e0 69 73 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d istObjPtr). }
116f0 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 .. /* Verify
11700 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 mode depth */.
11710 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e LAPPEND_INT(in
11720 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 terp, objPtr, "v
11730 65 72 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c erifyDepth", SSL
11740 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 _get_verify_dept
11750 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 h(statePtr->ssl)
11760 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 );.. /* Repor
11770 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 t the selected p
11780 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 rotocol as a res
11790 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 ult of the negot
117a0 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 iation */. SS
117b0 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 L_get0_alpn_sele
117c0 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 cted(statePtr->s
117d0 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e sl, &proto, &len
117e0 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 );. LAPPEND_S
117f0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11800 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 r, "alpn", (char
11810 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 *)proto, (Tcl_S
11820 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c ize) len);. L
11830 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11840 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 p, objPtr, "prot
11850 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 ocol", SSL_get_v
11860 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d ersion(statePtr-
11870 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 >ssl), -1);..
11880 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f /* Valid for no
11890 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 n-RSA signature
118a0 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 and TLS 1.3 */.
118b0 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 if (objc == 2
118c0 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 ) {..res = SSL_g
118d0 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 et_peer_signatur
118e0 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
118f0 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 ssl, &nid);.
11900 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
11910 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 SSL_get_signatur
11920 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
11930 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 ssl, &nid);.
11940 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 }. if (!res)
11950 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c {nid = 0;}. L
11960 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11970 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e p, objPtr, "sign
11980 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 atureHashAlgorit
11990 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 hm", OBJ_nid2ln(
119a0 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 nid), -1);..
119b0 2f 2a 20 41 64 64 65 64 20 69 6e 20 4f 70 65 6e /* Added in Open
119c0 53 53 4c 20 31 2e 31 2e 31 61 20 2a 2f 0a 23 69 SSL 1.1.1a */.#i
119d0 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
119e0 4e 5f 4e 55 4d 42 45 52 20 3e 20 30 78 31 30 31 N_NUMBER > 0x101
119f0 30 31 30 30 30 4c 0a 20 20 20 20 69 66 20 28 6f 01000L. if (o
11a00 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 bjc == 2) {..res
11a10 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f = SSL_get_peer_
11a20 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e signature_type_n
11a30 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c id(statePtr->ssl
11a40 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 , &nid);. } e
11a50 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c lse {..res = SSL
11a60 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 _get_signature_t
11a70 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 ype_nid(statePtr
11a80 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 ->ssl, &nid);.
11a90 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 }. if (!res
11aa0 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 ) {nid = 0;}.
11ab0 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
11ac0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 erp, objPtr, "si
11ad0 67 6e 61 74 75 72 65 54 79 70 65 22 2c 20 4f 42 gnatureType", OB
11ae0 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d J_nid2ln(nid), -
11af0 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 1);.#endif..
11b00 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
11b10 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
11b20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
11b30 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
11b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b80 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 -. *. * Connecti
11b90 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 onInfoObjCmd --
11ba0 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f return connectio
11bb0 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e n info from Open
11bc0 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c SSL.. *. * Resul
11bd0 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 ts:. *.A list of
11be0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f connection info
11bf0 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *---------
11c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
11c40 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 static int Conne
11c50 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 ctionInfoObjCmd(
11c60 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
11c70 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
11c80 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
11c90 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
11ca0 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
11cb0 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
11cc0 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e an;../* The chan
11cd0 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 nel to set a mod
11ce0 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 e on */. Stat
11cf0 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a e *statePtr;../*
11d00 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f client state fo
11d10 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a r ssl socket */.
11d20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
11d30 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 Ptr, *listPtr;.
11d40 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 const SSL *ss
11d50 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c l;. const SSL
11d60 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b _CIPHER *cipher;
11d70 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 . const SSL_S
11d80 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b ESSION *session;
11d90 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d . const EVP_M
11da0 44 20 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 64 D *md;. (void
11db0 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
11dc0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
11dd0 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
11de0 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
11df0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
11e00 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
11e10 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
11e20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
11e30 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
11e40 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
11e50 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 nterp, Tcl_GetSt
11e60 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e ring(objv[1]), N
11e70 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 ULL);. if (ch
11e80 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
11e90 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
11ea0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
11eb0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b }.. /* Mak
11ec0 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
11ed0 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
11ee0 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
11ef0 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
11f00 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
11f10 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
11f20 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
11f30 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
11f40 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
11f50 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
11f60 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
11f70 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
11f80 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
11f90 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 "\": not a T
11fa0 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 LS channel", (ch
11fb0 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 ar *) NULL);..Tc
11fc0 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
11fd0 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 nterp, "TLS", "C
11fe0 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 ONNECTION", "CHA
11ff0 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 NNEL", "INVALID"
12000 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
12010 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
12020 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
12030 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
12040 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
12050 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 ;.. /* Connec
12060 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 tion info */.
12070 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
12080 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
12090 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
120a0 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d chan);. ssl =
120b0 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a statePtr->ssl;.
120c0 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e if (ssl != N
120d0 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e ULL) {..const un
120e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f signed char *pro
120f0 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e to;..unsigned in
12100 74 20 75 6c 65 6e 3b 0a 0a 09 2f 2a 20 49 6e 69 t ulen;.../* Ini
12110 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6e 69 tialization fini
12120 73 68 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 shed */..LAPPEND
12130 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
12140 6a 50 74 72 2c 20 22 69 6e 69 74 5f 66 69 6e 69 jPtr, "init_fini
12150 73 68 65 64 22 2c 20 53 53 4c 5f 69 73 5f 69 6e shed", SSL_is_in
12160 69 74 5f 66 69 6e 69 73 68 65 64 28 73 73 6c 29 it_finished(ssl)
12170 29 3b 0a 09 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 );..../* connect
12180 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 ion state */..LA
12190 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
121a0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65 , objPtr, "state
121b0 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 ", SSL_state_str
121c0 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d ing_long(ssl), -
121d0 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 1);.../* Get SNI
121e0 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76 65 requested serve
121f0 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 r name */..LAPPE
12200 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
12210 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61 bjPtr, "serverna
12220 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 me", SSL_get_ser
12230 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 vername(ssl, TLS
12240 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 EXT_NAMETYPE_hos
12250 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 t_name), -1);...
12260 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 /* Report the se
12270 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
12280 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 as a result of t
12290 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a he negotiation *
122a0 2f 0a 09 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e /..SSL_get0_alpn
122b0 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 _selected(stateP
122c0 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c tr->ssl, &proto,
122d0 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e &ulen);..LAPPEN
122e0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
122f0 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 jPtr, "alpn", (c
12300 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 har *)proto, (Tc
12310 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a l_Size) ulen);..
12320 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c ./* Get protocol
12330 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
12340 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12350 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c "protocol", SSL
12360 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c _get_version(ssl
12370 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e ), -1);.../* Ren
12380 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 egotiation allow
12390 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 ed */..LAPPEND_B
123a0 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
123b0 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69 tr, "renegotiati
123c0 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c on_allowed", SSL
123d0 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 _get_secure_rene
123e0 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 gotiation_suppor
123f0 74 28 28 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b t((SSL *) ssl));
12400 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 .../* Get securi
12410 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 ty level */..LAP
12420 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
12430 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69 objPtr, "securi
12440 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 ty_level", SSL_g
12450 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 et_security_leve
12460 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 l(ssl));.../* Se
12470 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c ssion info */..L
12480 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
12490 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 rp, objPtr, "ses
124a0 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 sion_reused", SS
124b0 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 L_session_reused
124c0 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 (ssl));.../* Is
124d0 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 server info */..
124e0 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
124f0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 erp, objPtr, "is
12500 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 _server", SSL_is
12510 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a _server(ssl));..
12520 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 ./* Is DTLS */..
12530 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
12540 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 erp, objPtr, "is
12550 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 _dtls", SSL_is_d
12560 74 6c 73 28 73 73 6c 29 29 3b 0a 0a 23 69 66 20 tls(ssl));..#if
12570 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
12580 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33 30 32 30 NUMBER >= 0x3020
12590 30 30 30 30 4c 0a 09 2f 2a 20 49 73 20 51 55 49 0000L../* Is QUI
125a0 43 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f C */..LAPPEND_BO
125b0 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 OL(interp, objPt
125c0 72 2c 20 22 69 73 5f 71 75 69 63 22 2c 20 53 53 r, "is_quic", SS
125d0 4c 5f 69 73 5f 71 75 69 63 28 73 73 6c 29 29 3b L_is_quic(ssl));
125e0 0a 0a 09 2f 2a 20 49 73 20 54 4c 53 20 2a 2f 0a .../* Is TLS */.
125f0 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
12600 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 terp, objPtr, "i
12610 73 5f 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 74 s_tls", SSL_is_t
12620 6c 73 28 73 73 6c 29 29 3b 0a 23 65 6e 64 69 66 ls(ssl));.#endif
12630 0a 0a 09 2f 2a 20 44 41 4e 45 20 54 4c 53 20 61 .../* DANE TLS a
12640 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 2a 2f uthentication */
12650 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
12660 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12670 64 61 6e 65 5f 61 75 74 68 22 2c 20 53 53 4c 5f dane_auth", SSL_
12680 67 65 74 30 5f 64 61 6e 65 28 28 53 53 4c 20 2a get0_dane((SSL *
12690 29 73 73 6c 29 20 21 3d 20 4e 55 4c 4c 29 3b 0a )ssl) != NULL);.
126a0 0a 09 2f 2a 20 57 61 69 74 69 6e 67 20 66 6f 72 ../* Waiting for
126b0 20 61 73 79 6e 63 20 2a 2f 0a 09 4c 41 50 50 45 async */..LAPPE
126c0 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
126d0 6f 62 6a 50 74 72 2c 20 22 77 61 69 74 69 6e 67 objPtr, "waiting
126e0 5f 66 6f 72 5f 61 73 79 6e 63 22 2c 20 53 53 4c _for_async", SSL
126f0 5f 77 61 69 74 69 6e 67 5f 66 6f 72 5f 61 73 79 _waiting_for_asy
12700 6e 63 28 28 53 53 4c 20 2a 29 73 73 6c 29 29 3b nc((SSL *)ssl));
12710 0a 0a 09 2f 2a 20 54 69 6d 65 2d 6f 75 74 20 2a .../* Time-out *
12720 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 /..LAPPEND_LONG(
12730 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12740 22 74 69 6d 65 2d 6f 75 74 22 2c 20 53 53 4c 5f "time-out", SSL_
12750 67 65 74 5f 64 65 66 61 75 6c 74 5f 74 69 6d 65 get_default_time
12760 6f 75 74 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 out(ssl));.../*
12770 49 73 20 43 65 72 74 69 66 69 63 61 74 65 20 54 Is Certificate T
12780 72 61 6e 73 70 61 72 65 6e 63 79 20 76 61 6c 69 ransparency vali
12790 64 61 74 69 6f 6e 20 65 6e 61 62 6c 65 64 20 2a dation enabled *
127a0 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
127b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
127c0 22 63 74 5f 65 6e 61 62 6c 65 64 22 2c 20 53 53 "ct_enabled", SS
127d0 4c 5f 63 74 5f 69 73 5f 65 6e 61 62 6c 65 64 28 L_ct_is_enabled(
127e0 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 ssl));. }..
127f0 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f /* Cipher info
12800 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d */. cipher =
12810 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 SSL_get_current
12820 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 _cipher(ssl);.
12830 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 if (cipher !=
12840 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 NULL) {..char bu
12850 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b f[BUFSIZ] = {0};
12860 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f ..int bits, alg_
12870 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 bits;.../* Ciphe
12880 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 r name */..LAPPE
12890 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
128a0 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c bjPtr, "cipher",
128b0 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
128c0 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 name(cipher), -1
128d0 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 );.../* RFC name
128e0 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c of cipher */..L
128f0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
12900 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e p, objPtr, "stan
12910 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f dard_name", SSL_
12920 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f CIPHER_standard_
12930 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 name(cipher), -1
12940 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 );.../* OpenSSL
12950 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a name of cipher *
12960 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
12970 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12980 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f openssl_name", O
12990 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 PENSSL_cipher_na
129a0 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 me(SSL_CIPHER_st
129b0 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 andard_name(ciph
129c0 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 er)), -1);.../*
129d0 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74 number of secret
129e0 20 62 69 74 73 20 75 73 65 64 20 66 6f 72 20 63 bits used for c
129f0 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d ipher */..bits =
12a00 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
12a10 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c bits(cipher, &al
12a20 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e g_bits);..LAPPEN
12a30 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
12a40 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69 jPtr, "secret_bi
12a50 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 ts", bits);..LAP
12a60 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
12a70 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 objPtr, "algori
12a80 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 thm_bits", alg_b
12a90 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 its);../* alg_bi
12aa0 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 ts is actual key
12ab0 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 secret bits. If
12ac0 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 use bits and se
12ad0 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 cret (algorithm)
12ae0 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 bits differ,..
12af0 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 the rest of th
12b00 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65 64 e bits are fixed
12b10 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 , i.e. for limit
12b20 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 ed export cipher
12b30 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f s (bits < 56) */
12b40 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 .../* Indicates
12b50 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 which SSL/TLS pr
12b60 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 otocol version f
12b70 69 72 73 74 20 64 65 66 69 6e 65 64 20 74 68 65 irst defined the
12b80 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 cipher */..LAPP
12b90 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
12ba0 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 objPtr, "min_ver
12bb0 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 sion", SSL_CIPHE
12bc0 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 R_get_version(ci
12bd0 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a pher), -1);.../*
12be0 20 43 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 Cipher NID */..
12bf0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12c00 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
12c10 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a herNID", (char *
12c20 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f )OBJ_nid2ln(SSL_
12c30 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 CIPHER_get_ciphe
12c40 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 r_nid(cipher)),
12c50 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 -1);..LAPPEND_ST
12c60 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
12c70 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28 , "digestNID", (
12c80 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c char *)OBJ_nid2l
12c90 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 n(SSL_CIPHER_get
12ca0 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68 _digest_nid(ciph
12cb0 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 er)), -1);..LAPP
12cc0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
12cd0 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68 objPtr, "keyExch
12ce0 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20 angeNID", (char
12cf0 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c *)OBJ_nid2ln(SSL
12d00 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e _CIPHER_get_kx_n
12d10 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 id(cipher)), -1)
12d20 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
12d30 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12d40 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 authenticationNI
12d50 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f D", (char *)OBJ_
12d60 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 nid2ln(SSL_CIPHE
12d70 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 R_get_auth_nid(c
12d80 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 ipher)), -1);...
12d90 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 /* message authe
12da0 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d ntication code -
12db0 20 43 69 70 68 65 72 20 69 73 20 41 45 41 44 20 Cipher is AEAD
12dc0 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 (e.g. GCM or Cha
12dd0 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 Cha20/Poly1305)
12de0 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 or not */../* Au
12df0 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72 thenticated Encr
12e00 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f yption with asso
12e10 63 69 61 74 65 64 20 64 61 74 61 20 28 41 45 41 ciated data (AEA
12e20 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 D) check */..LAP
12e30 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 PEND_BOOL(interp
12e40 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 , objPtr, "ciphe
12e50 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f r_is_aead", SSL_
12e60 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63 CIPHER_is_aead(c
12e70 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 ipher));.../* Di
12e80 67 65 73 74 20 75 73 65 64 20 64 75 72 69 6e 67 gest used during
12e90 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e the SSL/TLS han
12ea0 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e dshake when usin
12eb0 67 20 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f g the cipher. */
12ec0 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 ..md = SSL_CIPHE
12ed0 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f R_get_handshake_
12ee0 64 69 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a digest(cipher);.
12ef0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
12f00 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 erp, objPtr, "ha
12f10 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c ndshake_digest",
12f20 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f (char *)EVP_MD_
12f30 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a name(md), -1);..
12f40 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d ./* Get OpenSSL-
12f50 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 specific ID, not
12f60 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 IANA ID */..LAP
12f70 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
12f80 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 objPtr, "cipher
12f90 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f _id", (int) SSL_
12fa0 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 CIPHER_get_id(ci
12fb0 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f pher));.../* Two
12fc0 2d 62 79 74 65 20 49 44 20 75 73 65 64 20 69 6e -byte ID used in
12fd0 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f the TLS protoco
12fe0 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 l of the given c
12ff0 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e ipher */..LAPPEN
13000 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
13010 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f jPtr, "protocol_
13020 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 id", (int) SSL_C
13030 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 IPHER_get_protoc
13040 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a ol_id(cipher));.
13050 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73 ../* Textual des
13060 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 cription of the
13070 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 cipher */..if (S
13080 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 SL_CIPHER_descri
13090 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 ption(cipher, bu
130a0 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 f, sizeof(buf))
130b0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
130c0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
130d0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 rp, objPtr, "des
130e0 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 cription", buf,
130f0 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 -1);..}. }..
13100 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e /* Session in
13110 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f fo */. sessio
13120 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 n = SSL_get_sess
13130 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 ion(ssl);. if
13140 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c (session != NUL
13150 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 L) {..const unsi
13160 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 gned char *ticke
13170 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b t;..size_t len2;
13180 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 ..unsigned int u
13190 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 len;..const unsi
131a0 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 gned char *sessi
131b0 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 on_id, *proto;..
131c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 unsigned char bu
131d0 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 ffer[SSL_MAX_MAS
131e0 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b TER_KEY_LENGTH];
131f0 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 .../* Report the
13200 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 selected protoc
13210 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f ol as a result o
13220 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 f the ALPN negot
13230 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 iation */..SSL_S
13240 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e ESSION_get0_alpn
13250 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f _selected(sessio
13260 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 n, &proto, &len2
13270 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
13280 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
13290 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 "alpn", (char *)
132a0 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a proto, (Tcl_Siz
132b0 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 e) len2);.../* R
132c0 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 eport the select
132d0 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 ed protocol as a
132e0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e result of the N
132f0 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a PN negotiation *
13300 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e /.#ifdef USE_NPN
13310 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f ..SSL_get0_next_
13320 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 proto_negotiated
13330 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 (ssl, &proto, &u
13340 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 len);..LAPPEND_S
13350 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
13360 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 r, "npn", (char
13370 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 *) proto, (Tcl_S
13380 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 ize) ulen);.#end
13390 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c if.../* Resumabl
133a0 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 e session */..LA
133b0 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
133c0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 p, objPtr, "resu
133d0 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 mable", SSL_SESS
133e0 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 ION_is_resumable
133f0 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a (session));.../*
13400 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 Session start t
13410 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e ime (seconds sin
13420 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 ce epoch) */..LA
13430 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 PPEND_LONG(inter
13440 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 p, objPtr, "star
13450 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 t_time", SSL_SES
13460 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 SION_get_time(se
13470 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 ssion));.../* Ti
13480 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 meout value - SS
13490 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 L_CTX_get_timeou
134a0 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a t (in seconds) *
134b0 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 /..LAPPEND_LONG(
134c0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
134d0 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 "timeout", SSL_S
134e0 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f ESSION_get_timeo
134f0 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 ut(session));...
13500 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 /* Session id -
13510 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f TLSv1.2 and belo
13520 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 w only */..sessi
13530 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 on_id = SSL_SESS
13540 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 ION_get_id(sessi
13550 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 on, &ulen);..LAP
13560 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 PEND_BARRAY(inte
13570 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 rp, objPtr, "ses
13580 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f sion_id", sessio
13590 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 n_id, (Tcl_Size)
135a0 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 ulen);.../* Ses
135b0 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a sion context */.
135c0 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 .session_id = SS
135d0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 L_SESSION_get0_i
135e0 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f d_context(sessio
135f0 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 n, &ulen);..LAPP
13600 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 END_BARRAY(inter
13610 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 p, objPtr, "sess
13620 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 ion_context", se
13630 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 ssion_id, (Tcl_S
13640 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a ize) ulen);.../*
13650 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 Session ticket
13660 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f - client only */
13670 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 ..SSL_SESSION_ge
13680 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f t0_ticket(sessio
13690 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e n, &ticket, &len
136a0 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 2);..LAPPEND_BAR
136b0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 RAY(interp, objP
136c0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 tr, "session_tic
136d0 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 ket", ticket, (T
136e0 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a cl_Size) len2);.
136f0 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 ../* Session tic
13700 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e ket lifetime hin
13710 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a t (in seconds) *
13720 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 /..LAPPEND_LONG(
13730 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
13740 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f "lifetime", SSL_
13750 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b SESSION_get_tick
13760 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 et_lifetime_hint
13770 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a (session));.../*
13780 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 Ticket app data
13790 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f */.#if OPENSSL_
137a0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
137b0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 53 53 0x30000000L..SS
137c0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 L_SESSION_get0_t
137d0 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 28 53 icket_appdata((S
137e0 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73 65 SL_SESSION *) se
137f0 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 ssion, &ticket,
13800 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 &len2);..LAPPEND
13810 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
13820 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f objPtr, "ticket_
13830 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 app_data", ticke
13840 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 t, (Tcl_Size) le
13850 6e 32 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a n2);.#endif.../*
13860 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 Get master key
13870 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 */..len2 = SSL_S
13880 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 ESSION_get_maste
13890 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 r_key(session, b
138a0 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d uffer, SSL_MAX_M
138b0 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 ASTER_KEY_LENGTH
138c0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
138d0 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
138e0 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c r, "master_key",
138f0 20 62 75 66 66 65 72 2c 20 28 54 63 6c 5f 53 69 buffer, (Tcl_Si
13900 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 ze) len2);.../*
13910 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a Compression id *
13920 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 /..unsigned int
13930 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e id = SSL_SESSION
13940 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 _get_compress_id
13950 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 (session);..LAPP
13960 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
13970 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 objPtr, "compres
13980 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 sion_id", id ==
13990 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 1 ? "zlib" : "no
139a0 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a ne", -1);. }.
139b0 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 . /* Compress
139c0 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 ion info */.
139d0 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 if (ssl != NULL)
139e0 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 {.#ifdef HAVE_S
139f0 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 SL_COMPRESSION..
13a00 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f const COMP_METHO
13a10 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a D *comp, *expn;.
13a20 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f .comp = SSL_get_
13a30 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 current_compress
13a40 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 ion(ssl);..expn
13a50 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e = SSL_get_curren
13a60 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 t_expansion(ssl)
13a70 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 ;...LAPPEND_STR(
13a80 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
13a90 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 "compression", c
13aa0 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 omp ? SSL_COMP_g
13ab0 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 et_name(comp) :
13ac0 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 "none", -1);..LA
13ad0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
13ae0 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e , objPtr, "expan
13af0 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 sion", expn ? SS
13b00 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 L_COMP_get_name(
13b10 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 expn) : "none",
13b20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 -1);.#else..LAPP
13b30 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
13b40 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 objPtr, "compres
13b50 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d sion", "none", -
13b60 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 1);..LAPPEND_STR
13b70 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
13b80 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e "expansion", "n
13b90 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 one", -1);.#endi
13ba0 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 f. }.. /*
13bb0 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 Server info */.
13bc0 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 {..long mode
13bd0 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 = SSL_CTX_get_se
13be0 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 ssion_cache_mode
13bf0 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b (statePtr->ctx);
13c00 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 ..char *msg;...i
13c10 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 f (mode & SSL_SE
13c20 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a SS_CACHE_OFF) {.
13c30 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 . msg = "off"
13c40 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f ;..} else if (mo
13c50 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 de & SSL_SESS_CA
13c60 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 CHE_CLIENT) {..
13c70 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 msg = "client
13c80 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d ";..} else if (m
13c90 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 ode & SSL_SESS_C
13ca0 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 ACHE_SERVER) {..
13cb0 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65 msg = "serve
13cc0 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 r";..} else if (
13cd0 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
13ce0 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 CACHE_BOTH) {..
13cf0 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b msg = "both";
13d00 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
13d10 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b msg = "unknown";
13d20 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 ..}..LAPPEND_STR
13d30 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
13d40 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f "session_cache_
13d50 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b mode", msg, -1);
13d60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
13d70 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a A List */. /*
13d80 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72 IF not a server
13d90 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 , same as SSL_ge
13da0 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e t0_peer_CA_list.
13db0 20 49 66 20 73 65 72 76 65 72 20 73 61 6d 65 20 If server same
13dc0 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 as SSL_CTX_get_c
13dd0 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f lient_CA_list */
13de0 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54 . listPtr = T
13df0 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
13e00 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 NULL);. STAC
13e10 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 K_OF(X509_NAME)
13e20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 *ca_list;. if
13e30 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c ((ca_list = SSL
13e40 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c _get_client_CA_l
13e50 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c ist(ssl)) != NUL
13e60 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65 L) {..char buffe
13e70 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 r[BUFSIZ];..for
13e80 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 (int i = 0; i <
13e90 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d sk_X509_NAME_num
13ea0 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 (ca_list); i++)
13eb0 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 {.. X509_NAME
13ec0 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 *name = sk_X509
13ed0 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c _NAME_value(ca_l
13ee0 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 ist, i);.. if
13ef0 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 (name) {...X509
13f00 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 _NAME_oneline(na
13f10 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 me, buffer, BUFS
13f20 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f IZ);...Tcl_ListO
13f30 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
13f40 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c interp, listPtr,
13f50 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
13f60 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a j(buffer, -1));.
13f70 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a . }..}. }.
13f80 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 LAPPEND_OBJ(
13f90 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
13fa0 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 "caList", listPt
13fb0 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f r);. LAPPEND_
13fc0 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
13fd0 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 tr, "caListCount
13fe0 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f ", sk_X509_NAME_
13ff0 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a num(ca_list));..
14000 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
14010 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
14020 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
14030 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
14040 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
14050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14080 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 -----. *. * Vers
14090 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 ionObjCmd -- ret
140a0 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 urn version stri
140b0 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e ng from OpenSSL.
140c0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
140d0 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
140e0 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
140f0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
14100 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
14110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
14150 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 */.static int.V
14160 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 ersionObjCmd(Cli
14170 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
14180 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
14190 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
141a0 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
141b0 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
141c0 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a cl_Obj *objPtr;.
141d0 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e (void) clien
141e0 74 44 61 74 61 3b 0a 20 20 20 20 28 76 6f 69 64 tData;. (void
141f0 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28 76 6f 69 ) objc;. (voi
14200 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20 20 64 70 d) objv;.. dp
14210 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
14220 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
14230 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
14240 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
14250 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 TEXT, -1);. T
14260 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
14270 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
14280 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
14290 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
142a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
142b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
142c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
142d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
142e0 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 -. *. * MiscObjC
142f0 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 md -- misc comma
14300 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 nds. *. * Result
14310 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
14320 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
14330 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
14340 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
14350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14390 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
143a0 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 t.MiscObjCmd(Cli
143b0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
143c0 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
143d0 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
143e0 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
143f0 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 objv[]) {. s
14400 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char
14410 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 *commands [] =
14420 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 { "req", "strreq
14430 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 ", NULL };. e
14440 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f num command { C_
14450 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 REQ, C_STRREQ, C
14460 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 _DUMMY };. Tc
14470 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 l_Size cmd;.
14480 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63 int isStr;. c
14490 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 har buffer[16384
144a0 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c ];. (void) cl
144b0 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 ientData;.. d
144c0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
144d0 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
144e0 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e < 2) {..Tcl_Wron
144f0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
14500 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 1, objv, "subco
14510 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a mmand ?args?");.
14520 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
14530 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
14540 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f (Tcl_GetIndexFro
14550 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
14560 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 v[1], commands,
14570 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 "command", 0, &c
14580 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b md) != TCL_OK) {
14590 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
145a0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 OR;. }.. E
145b0 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
145c0 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 ;.. isStr = (
145d0 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 cmd == C_STRREQ)
145e0 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 ;. switch ((e
145f0 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 num command) cmd
14600 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a ) {..case C_REQ:
14610 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a ..case C_STRREQ:
14620 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 {.. EVP_PKEY
14630 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 *pkey=NULL;..
14640 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c X509 *cert=NUL
14650 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d L;.. X509_NAM
14660 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 E *name=NULL;..
14670 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 Tcl_Obj **lis
14680 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a tv;.. Tcl_Siz
14690 65 20 6c 69 73 74 63 3b 0a 09 20 20 20 20 69 6e e listc;.. in
146a0 74 20 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a t i;... BIO *
146b0 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 out=NULL;...
146c0 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f char *k_C="",*k_
146d0 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b ST="",*k_L="",*k
146e0 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a _O="",*k_OU="",*
146f0 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c k_CN="",*k_Email
14700 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a ="";.. char *
14710 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a keyout,*pemout,*
14720 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 str;.. int ke
14730 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 ysize,serial=0,d
14740 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 ays=365;..#if OP
14750 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
14760 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
14770 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 0L.. BIGNUM *
14780 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 bne = NULL;..
14790 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c RSA *rsa = NULL
147a0 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 ;.#else.. EVP
147b0 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d _PKEY_CTX *ctx =
147c0 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 NULL;.#endif...
147d0 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 if ((objc<5)
147e0 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a || (objc>6)) {.
147f0 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
14800 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 gs(interp, 2, ob
14810 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 jv, "keysize key
14820 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 file certfile ?i
14830 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e nfo?");...return
14840 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 TCL_ERROR;..
14850 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c }... if (Tcl
14860 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 _GetIntFromObj(i
14870 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 nterp, objv[2],
14880 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c &keysize) != TCL
14890 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 _OK) {...return
148a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
148b0 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 }.. keyout=Tc
148c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
148d0 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 [3]);.. pemou
148e0 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 t=Tcl_GetString(
148f0 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 objv[4]);.. i
14900 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 f (isStr) {...Tc
14910 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
14920 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 keyout,"",0);...
14930 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 Tcl_SetVar(inter
14940 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a p,pemout,"",0);.
14950 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 . }... if
14960 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 (objc>=6) {...if
14970 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 (Tcl_ListObjGet
14980 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c Elements(interp,
14990 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63 objv[5], &listc
149a0 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c , &listv) != TCL
149b0 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 _OK) {... ret
149c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
149d0 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 .}....if ((listc
149e0 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 %2) != 0) {...
149f0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 Tcl_SetResult(
14a00 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 interp,"Informat
14a10 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 ion list must ha
14a20 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f ve even number o
14a30 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c f arguments",NUL
14a40 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e L);... return
14a50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a TCL_ERROR;...}.
14a60 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 ..for (i=0; i<li
14a70 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 stc; i+=2) {...
14a80 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 str=Tcl_GetSt
14a90 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a ring(listv[i]);.
14aa0 09 09 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 .. if (strcmp
14ab0 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 (str,"days")==0)
14ac0 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 {....if (Tcl_Ge
14ad0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 tIntFromObj(inte
14ae0 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 rp,listv[i+1],&d
14af0 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 ays)!=TCL_OK)...
14b00 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
14b10 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 ERROR;... } e
14b20 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
14b30 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 tr,"serial")==0)
14b40 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 {....if (Tcl_Ge
14b50 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 tIntFromObj(inte
14b60 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 rp,listv[i+1],&s
14b70 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a erial)!=TCL_OK).
14b80 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
14b90 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d L_ERROR;... }
14ba0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
14bb0 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a (str,"C")==0) {.
14bc0 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 ...k_C=Tcl_GetSt
14bd0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
14be0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
14bf0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 f (strcmp(str,"S
14c00 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 T")==0) {....k_S
14c10 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 T=Tcl_GetString(
14c20 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
14c30 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
14c40 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 rcmp(str,"L")==0
14c50 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 ) {....k_L=Tcl_G
14c60 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
14c70 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
14c80 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
14c90 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 r,"O")==0) {....
14ca0 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e k_O=Tcl_GetStrin
14cb0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
14cc0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
14cd0 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 strcmp(str,"OU")
14ce0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 ==0) {....k_OU=T
14cf0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
14d00 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
14d10 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
14d20 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 p(str,"CN")==0)
14d30 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 {....k_CN=Tcl_Ge
14d40 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
14d50 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
14d60 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
14d70 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a ,"Email")==0) {.
14d80 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 ...k_Email=Tcl_G
14d90 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
14da0 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
14db0 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 se {....Tcl_SetR
14dc0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e esult(interp,"Un
14dd0 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 known parameter"
14de0 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 ,NULL);....retur
14df0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 n TCL_ERROR;...
14e00 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a }...}.. }.
14e10 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
14e20 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
14e30 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 30000000L.. b
14e40 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 ne = BN_new();..
14e50 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 rsa = RSA_ne
14e60 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d w();.. pkey =
14e70 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b EVP_PKEY_new();
14e80 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d .. if (bne ==
14e90 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 NULL || rsa ==
14ea0 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 NULL || pkey ==
14eb0 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f NULL || !BN_set_
14ec0 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 word(bne,RSA_F4)
14ed0 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 ||...!RSA_gener
14ee0 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 ate_key_ex(rsa,
14ef0 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 keysize, bne, NU
14f00 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 LL) || !EVP_PKEY
14f10 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 _assign_RSA(pkey
14f20 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f , rsa)) {...EVP_
14f30 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
14f40 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 .../* RSA_free(r
14f50 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 sa); freed by EV
14f60 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 P_PKEY_free */..
14f70 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 .BN_free(bne);.#
14f80 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d else.. pkey =
14f90 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e EVP_RSA_gen((un
14fa0 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 signed int) keys
14fb0 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d ize);.. ctx =
14fc0 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 EVP_PKEY_CTX_ne
14fd0 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 w(pkey,NULL);..
14fe0 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e if (pkey == N
14ff0 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 ULL || ctx == NU
15000 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f LL || !EVP_PKEY_
15010 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 keygen_init(ctx)
15020 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f ||...!EVP_PKEY_
15030 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 CTX_set_rsa_keyg
15040 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 en_bits(ctx, key
15050 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b size) || !EVP_PK
15060 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 EY_keygen(ctx, &
15070 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 pkey)) {...EVP_P
15080 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
15090 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 ..EVP_PKEY_CTX_f
150a0 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 ree(ctx);.#endif
150b0 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
150c0 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 (interp,"Error g
150d0 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 enerating privat
150e0 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 e key",NULL);...
150f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
15100 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ;.. } else {.
15110 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 ..if (isStr) {..
15120 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
15130 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 (BIO_s_mem());..
15140 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
15150 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 io_PrivateKey(ou
15160 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c t,pkey,NULL,NULL
15170 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 ,0,NULL,NULL);..
15180 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 . i=BIO_read(
15190 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f out,buffer,sizeo
151a0 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 f(buffer)-1);...
151b0 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 i=(i<0) ? 0
151c0 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 : i;... buffe
151d0 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 r[i]='\0';...
151e0 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 Tcl_SetVar(inte
151f0 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 rp,keyout,buffer
15200 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 ,0);... BIO_f
15210 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 lush(out);...
15220 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a BIO_free(out);.
15230 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 ..} else {...
15240 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f out=BIO_new(BIO
15250 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 _s_file());...
15260 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 BIO_write_file
15270 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 name(out,keyout)
15280 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 ;... PEM_writ
15290 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 e_bio_PrivateKey
152a0 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e (out,pkey,NULL,N
152b0 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 ULL,0,NULL,NULL)
152c0 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 ;... /* PEM_w
152d0 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 rite_bio_RSAPriv
152e0 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c ateKey(out, rsa,
152f0 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 NULL, NULL, 0,
15300 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a NULL, NULL); */.
15310 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 .. BIO_free_a
15320 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 ll(out);.. .}...
15330 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f .if ((cert=X509_
15340 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a new())==NULL) {.
15350 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 .. Tcl_SetRes
15360 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f ult(interp,"Erro
15370 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 r generating cer
15380 74 69 66 69 63 61 74 65 20 72 65 71 75 65 73 74 tificate request
15390 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 ",NULL);... E
153a0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 VP_PKEY_free(pke
153b0 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f y);.#if OPENSSL_
153c0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
153d0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 0x30000000L...
153e0 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b BN_free(bne);
153f0 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 .#endif... re
15400 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
15410 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f ..}....X509_set_
15420 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b version(cert,2);
15430 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f ...ASN1_INTEGER_
15440 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 set(X509_get_ser
15450 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c ialNumber(cert),
15460 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f serial);...X509_
15470 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f gmtime_adj(X509_
15480 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 getm_notBefore(c
15490 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f ert),0);...X509_
154a0 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f gmtime_adj(X509_
154b0 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 getm_notAfter(ce
154c0 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a rt),(long)60*60*
154d0 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 24*days);...X509
154e0 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 _set_pubkey(cert
154f0 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d ,pkey);....name=
15500 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 X509_get_subject
15510 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 _name(cert);....
15520 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
15530 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
15540 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 "C", MBSTRING_AS
15550 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
15560 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 ed char *) k_C,
15570 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
15580 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
15590 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 y_by_txt(name,"S
155a0 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 T", MBSTRING_ASC
155b0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
155c0 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 d char *) k_ST,
155d0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
155e0 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
155f0 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c y_by_txt(name,"L
15600 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
15610 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
15620 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 char *) k_L, -1
15630 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
15640 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
15650 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c by_txt(name,"O",
15660 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
15670 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
15680 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 har *) k_O, -1,
15690 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
156a0 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
156b0 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 _txt(name,"OU",
156c0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
156d0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
156e0 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 ar *) k_OU, -1,
156f0 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
15700 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
15710 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 _txt(name,"CN",
15720 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
15730 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
15740 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 ar *) k_CN, -1,
15750 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
15760 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
15770 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c _txt(name,"Email
15780 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
15790 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
157a0 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c char *) k_Email
157b0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 , -1, -1, 0);...
157c0 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 .X509_set_subjec
157d0 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 t_name(cert,name
157e0 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f );....if (!X509_
157f0 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 sign(cert,pkey,E
15800 56 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a VP_sha256())) {.
15810 09 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 .. X509_free(
15820 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 cert);... EVP
15830 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
15840 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
15850 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
15860 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 x30000000L...
15870 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 BN_free(bne);.#
15880 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f endif... Tcl_
15890 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
158a0 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 ,"Error signing
158b0 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c certificate",NUL
158c0 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e L);... return
158d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a TCL_ERROR;...}.
158e0 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a ...if (isStr) {.
158f0 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 .. out=BIO_ne
15900 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a w(BIO_s_mem());.
15910 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
15920 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 bio_X509(out,cer
15930 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f t);... i=BIO_
15940 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c read(out,buffer,
15950 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 sizeof(buffer)-1
15960 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 );... i=(i<0)
15970 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 ? 0 : i;...
15980 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a buffer[i]='\0';.
15990 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 .. Tcl_SetVar
159a0 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 (interp,pemout,b
159b0 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 uffer,0);...
159c0 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a BIO_flush(out);.
159d0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f .. BIO_free(o
159e0 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a ut);...} else {.
159f0 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 .. out=BIO_ne
15a00 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b w(BIO_s_file());
15a10 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 ... BIO_write
15a20 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 _filename(out,pe
15a30 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d mout);... PEM
15a40 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 _write_bio_X509(
15a50 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 out,cert);...
15a60 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 BIO_free_all(ou
15a70 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f t);...}....X509_
15a80 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 free(cert);...EV
15a90 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 P_PKEY_free(pkey
15aa0 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 );.#if OPENSSL_V
15ab0 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
15ac0 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 0x30000000L...BN
15ad0 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 _free(bne);.#end
15ae0 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 if.. }..}..br
15af0 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 eak;. default
15b00 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a :..break;. }.
15b10 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
15b20 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a K;.}.../********
15b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a ************/./*
15b40 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 Init
15b50 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./**********
15b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a **********/../*.
15b70 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
15b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15bb0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
15bc0 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Free --. *. *.Th
15bd0 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 is procedure cle
15be0 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 ans up when a SS
15bf0 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 L socket based c
15c00 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f hannel. *.is clo
15c10 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 sed and its refe
15c20 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c rence count fall
15c30 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 s below 1. *. *
15c40 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 Results:. *.none
15c50 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
15c60 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c cts:. *.Frees al
15c70 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 l the state. *.
15c80 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
15c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15cc0 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c ----. */.void.Tl
15cd0 73 5f 46 72 65 65 28 74 6c 73 5f 66 72 65 65 5f s_Free(tls_free_
15ce0 74 79 70 65 20 2a 62 6c 6f 63 6b 50 74 72 29 20 type *blockPtr)
15cf0 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
15d00 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
15d10 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 )blockPtr;..
15d20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
15d30 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 );.. Tls_Clea
15d40 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 n(statePtr);.
15d50 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 ckfree(blockPtr
15d60 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
15d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
15db0 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 *. * Tls_Clean
15dc0 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
15dd0 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 ocedure cleans u
15de0 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 p when a SSL soc
15df0 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 ket based channe
15e00 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 l. *.is closed a
15e10 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 nd its reference
15e20 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c count falls bel
15e30 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 ow 1. This shou
15e40 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 ld. *.be called
15e50 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 synchronously by
15e60 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 the CloseProc,
15e70 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 not in the. *.Ev
15e80 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c entuallyFree cal
15e90 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 lback.. *. * Res
15ea0 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ults:. *.none. *
15eb0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
15ec0 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 :. *.Frees all t
15ed0 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d he state. *. *--
15ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f20 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 -. */.void Tls_C
15f30 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 lean(State *stat
15f40 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 ePtr) {. dpri
15f50 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
15f60 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
15f70 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 65 6e ->ssl) {../* Sen
15f80 64 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 6d d close_notify m
15f90 65 73 73 61 67 65 20 2a 2f 0a 09 64 70 72 69 6e essage */..dprin
15fa0 74 66 28 22 53 53 4c 5f 73 68 75 74 64 6f 77 6e tf("SSL_shutdown
15fb0 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d (%p)", statePtr-
15fc0 3e 73 73 6c 29 3b 0a 09 2f 2a 20 57 69 6c 6c 20 >ssl);../* Will
15fd0 72 65 74 75 72 6e 20 72 65 74 75 72 6e 20 30 20 return return 0
15fe0 77 68 69 6c 65 20 73 68 75 74 64 6f 77 6e 20 69 while shutdown i
15ff0 6e 20 70 72 6f 63 65 73 73 2c 20 74 68 65 6e 20 n process, then
16000 31 20 77 68 65 6e 20 63 6f 6d 70 6c 65 74 65 20 1 when complete
16010 2a 2f 0a 09 2f 2a 20 63 6c 6f 73 65 73 20 74 68 */../* closes th
16020 65 20 77 72 69 74 65 20 64 69 72 65 63 74 69 6f e write directio
16030 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 n of the connect
16040 69 6f 6e 3b 20 74 68 65 20 72 65 61 64 20 64 69 ion; the read di
16050 72 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 rection is close
16060 64 20 62 79 20 74 68 65 20 70 65 65 72 2e 20 2a d by the peer. *
16070 2f 0a 09 2f 2a 20 44 6f 65 73 20 6e 6f 74 20 61 /../* Does not a
16080 66 66 65 63 74 20 73 6f 63 6b 65 74 20 2a 2f 0a ffect socket */.
16090 09 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28 73 74 .SSL_shutdown(st
160a0 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
160b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 }.. /*.
160c0 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e * we're assumin
160d0 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72 g here that we'r
160e0 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 e single-threade
160f0 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 d. */. if
16100 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 (statePtr->time
16110 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 r != (Tcl_TimerT
16120 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 oken) NULL) {..T
16130 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 cl_DeleteTimerHa
16140 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e ndler(statePtr->
16150 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 timer);..statePt
16160 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b r->timer = NULL;
16170 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 . }.. /* R
16180 65 6d 6f 76 65 20 63 61 6c 6c 62 61 63 6b 73 20 emove callbacks
16190 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
161a0 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b Ptr->callback) {
161b0 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 ..Tcl_DecrRefCou
161c0 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c nt(statePtr->cal
161d0 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 lback);..statePt
161e0 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 r->callback = NU
161f0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
16200 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 (statePtr->pass
16210 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 word) {..Tcl_Dec
16220 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
16230 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 tr->password);..
16240 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
16250 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d rd = NULL;. }
16260 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
16270 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f r->vcmd) {..Tcl_
16280 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 DecrRefCount(sta
16290 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 tePtr->vcmd);..s
162a0 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 tatePtr->vcmd =
162b0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
162c0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
162d0 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 rotos) {..ckfree
162e0 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
162f0 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 s);..statePtr->p
16300 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 rotos = NULL;.
16310 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 }.. if (sta
16320 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f tePtr->bio) {../
16330 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c * This will call
16340 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 SSL_shutdown. B
16350 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 ug 1414045 */..d
16360 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 printf("BIO_free
16370 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 _all(%p)", state
16380 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f Ptr->bio);..BIO_
16390 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 free_all(statePt
163a0 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 r->bio);..stateP
163b0 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a tr->bio = NULL;.
163c0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
163d0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a tatePtr->ssl) {.
163e0 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 .dprintf("SSL_fr
163f0 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 ee(%p)", statePt
16400 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 r->ssl);..SSL_fr
16410 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ee(statePtr->ssl
16420 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 );..statePtr->ss
16430 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a l = NULL;. }.
16440 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
16450 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 r->ctx) {..SSL_C
16460 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 TX_free(statePtr
16470 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 ->ctx);..statePt
16480 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 r->ctx = NULL;.
16490 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
164a0 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a f("Returning");.
164b0 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
164c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
164d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
164e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
164f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
16500 20 2a 0a 20 2a 20 42 75 69 6c 64 20 49 6e 66 6f *. * Build Info
16510 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 Command --. *.
16520 2a 09 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 *.Create command
16530 20 74 6f 20 72 65 74 75 72 6e 20 62 75 69 6c 64 to return build
16540 20 69 6e 66 6f 20 66 6f 72 20 70 61 63 6b 61 67 info for packag
16550 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 e.. *. * Results
16560 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
16570 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a Tcl result. *. *
16580 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
16590 2a 09 43 72 65 61 74 65 64 20 62 75 69 6c 64 2d *.Created build-
165a0 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a info command.. *
165b0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
165c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
165d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
165e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
165f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 ---------. */..#
16600 69 66 6e 64 65 66 20 53 54 52 49 4e 47 49 46 59 ifndef STRINGIFY
16610 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 49 4e .# define STRIN
16620 47 49 46 59 28 78 29 20 53 54 52 49 4e 47 49 46 GIFY(x) STRINGIF
16630 59 31 28 78 29 0a 23 20 20 64 65 66 69 6e 65 20 Y1(x).# define
16640 53 54 52 49 4e 47 49 46 59 31 28 78 29 20 23 78 STRINGIFY1(x) #x
16650 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 0a 42 75 69 .#endif..int.Bui
16660 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 54 63 ldInfoCommand(Tc
16670 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65 72 70 l_Interp* interp
16680 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64 49 ) {. Tcl_CmdI
16690 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 69 nfo info;.. i
166a0 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e f (Tcl_GetComman
166b0 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 22 3a dInfo(interp, ":
166c0 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f :tcl::build-info
166d0 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a 09 54 63 ", &info)) {..Tc
166e0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
166f0 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c nd(interp, "::tl
16700 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 s::build-info",
16710 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28 76 info.objProc, (v
16720 6f 69 64 20 2a 29 28 0a 09 09 50 41 43 4b 41 47 oid *)(...PACKAG
16730 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20 53 54 E_VERSION "+" ST
16740 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 45 52 53 RINGIFY(TLS_VERS
16750 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66 20 64 65 ION_UUID).#if de
16760 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 fined(__clang__)
16770 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c && defined(__cl
16780 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09 09 ang_major__)....
16790 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20 53 54 ".clang-" ST
167a0 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f RINGIFY(__clang_
167b0 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f 63 major__).#if __c
167c0 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20 31 lang_minor__ < 1
167d0 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65 6e 0.... "0".#en
167e0 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 49 4e dif.... STRIN
167f0 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69 6e GIFY(__clang_min
16800 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 or__).#endif.#if
16810 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 defined(__cplus
16820 70 6c 75 73 29 20 26 26 20 21 64 65 66 69 6e 65 plus) && !define
16830 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09 20 d(__OBJC__)....
16840 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 73 22 0a ".cplusplus".
16850 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e #endif.#ifndef N
16860 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e 64 DEBUG.... ".d
16870 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 ebug".#endif.#if
16880 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e !defined(__clan
16890 67 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 g__) && !defined
168a0 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 (__INTEL_COMPILE
168b0 52 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f R) && defined(__
168c0 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20 20 22 GNUC__).... "
168d0 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 .gcc-" STRINGIFY
168e0 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 20 5f (__GNUC__).#if _
168f0 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c 20 _GNUC_MINOR__ <
16900 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65 10.... "0".#e
16910 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 49 ndif.... STRI
16920 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d 49 4e NGIFY(__GNUC_MIN
16930 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 OR__).#endif.#if
16940 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 def __INTEL_COMP
16950 49 4c 45 52 0a 09 09 09 20 20 20 20 22 2e 69 63 ILER.... ".ic
16960 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f c-" STRINGIFY(__
16970 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 0a INTEL_COMPILER).
16980 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 #endif.#ifdef TC
16990 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09 09 20 L_MEM_DEBUG....
169a0 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 22 0a 23 ".memdebug".#
169b0 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
169c0 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09 09 20 d(_MSC_VER)....
169d0 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 54 52 49 ".msvc-" STRI
169e0 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 52 29 0a NGIFY(_MSC_VER).
169f0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 55 53 #endif.#ifdef US
16a00 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20 20 22 E_NMAKE.... "
16a10 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66 0a 23 .nmake".#endif.#
16a20 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 47 5f 4f ifndef TCL_CFG_O
16a30 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 20 20 20 PTIMIZED....
16a40 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a 23 ".no-optimize".#
16a50 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 4f endif.#ifdef __O
16a60 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22 2e 6f BJC__.... ".o
16a70 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 69 66 20 bjective-c".#if
16a80 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 defined(__cplusp
16a90 6c 75 73 29 0a 09 09 09 20 20 20 20 22 70 6c 75 lus).... "plu
16aa0 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 65 splus".#endif.#e
16ab0 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c 5f ndif.#ifdef TCL_
16ac0 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09 09 09 CFG_PROFILED....
16ad0 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 22 0a 23 ".profile".#
16ae0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 50 55 52 endif.#ifdef PUR
16af0 49 46 59 0a 09 09 09 20 20 20 20 22 2e 70 75 72 IFY.... ".pur
16b00 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 ify".#endif.#ifd
16b10 65 66 20 53 54 41 54 49 43 5f 42 55 49 4c 44 0a ef STATIC_BUILD.
16b20 09 09 09 20 20 20 20 22 2e 73 74 61 74 69 63 22 ... ".static"
16b30 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e 55 4c .#endif...), NUL
16b40 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 L);. }. re
16b50 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
16b60 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
16b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
16ba0 0a 20 2a 20 54 6c 73 4c 69 62 53 68 75 74 64 6f . * TlsLibShutdo
16bb0 77 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 53 68 75 74 wn --. *. *.Shut
16bc0 64 6f 77 6e 20 53 53 4c 20 6c 69 62 72 61 72 79 down SSL library
16bd0 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 once per applic
16be0 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73 75 ation. *. * Resu
16bf0 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
16c00 72 64 20 54 43 4c 20 72 65 73 75 6c 74 0a 20 2a rd TCL result. *
16c10 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
16c20 3a 0a 20 2a 09 53 68 75 74 64 6f 77 6e 20 53 53 :. *.Shutdown SS
16c30 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 2d L library. *. *-
16c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c70 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 76 6f 69 64 20 -----*. */.void
16c80 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e 28 43 TlsLibShutdown(C
16c90 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
16ca0 44 61 74 61 29 20 7b 0a 20 20 20 20 64 70 72 69 Data) {. dpri
16cb0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
16cc0 20 20 20 20 42 49 4f 5f 63 6c 65 61 6e 75 70 28 BIO_cleanup(
16cd0 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d );.}../*. *-----
16ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16d10 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 -*. *. *.TlsLibI
16d20 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 nit --. *. *.Ini
16d30 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 tializes SSL lib
16d40 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 rary once per ap
16d50 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 plication. *. *
16d60 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
16d70 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
16d80 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 t. *. * Side eff
16d90 65 63 74 73 3a 0a 20 2a 09 49 6e 69 74 69 61 6c ects:. *.Initial
16da0 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 izes SSL library
16db0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
16dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
16df0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 /.static int Tls
16e00 4c 69 62 49 6e 69 74 28 29 20 7b 0a 20 20 20 20 LibInit() {.
16e10 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 static int initi
16e20 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 20 20 20 alized = 0;..
16e30 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
16e40 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 69 6e ");.. if (!in
16e50 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 2f 2a itialized) {../*
16e60 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 Initialize BOTH
16e70 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c libcrypto and l
16e80 69 62 73 73 6c 2e 20 2a 2f 0a 09 69 66 20 28 21 ibssl. */..if (!
16e90 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c OPENSSL_init_ssl
16ea0 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f (OPENSSL_INIT_LO
16eb0 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c AD_SSL_STRINGS |
16ec0 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f OPENSSL_INIT_LO
16ed0 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 AD_CRYPTO_STRING
16ee0 53 0a 09 20 20 20 20 7c 20 4f 50 45 4e 53 53 4c S.. | OPENSSL
16ef0 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 _INIT_ADD_ALL_CI
16f00 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f PHERS | OPENSSL_
16f10 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 INIT_ADD_ALL_DIG
16f20 45 53 54 53 0a 09 20 20 20 20 7c 20 4f 50 45 4e ESTS.. | OPEN
16f30 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 4f SSL_INIT_LOAD_CO
16f40 4e 46 49 47 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 NFIG | OPENSSL_I
16f50 4e 49 54 5f 41 53 59 4e 43 2c 20 4e 55 4c 4c 29 NIT_ASYNC, NULL)
16f60 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ) {.. return
16f70 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
16f80 2f 2a 20 43 72 65 61 74 65 20 42 49 4f 20 68 61 /* Create BIO ha
16f90 6e 64 6c 65 72 73 20 2a 2f 0a 09 42 49 4f 5f 6e ndlers */..BIO_n
16fa0 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b ew_tcl(NULL, 0);
16fb0 0a 09 0a 09 2f 2a 20 43 72 65 61 74 65 20 65 78 ..../* Create ex
16fc0 69 74 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 09 54 it handler */..T
16fd0 63 6c 5f 43 72 65 61 74 65 45 78 69 74 48 61 6e cl_CreateExitHan
16fe0 64 6c 65 72 28 54 6c 73 4c 69 62 53 68 75 74 64 dler(TlsLibShutd
16ff0 6f 77 6e 2c 20 4e 55 4c 4c 29 3b 0a 09 69 6e 69 own, NULL);..ini
17000 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 20 20 tialized = 1;.
17010 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }. return T
17020 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 20 49 6e CL_OK;.}.../* In
17030 69 74 20 73 63 72 69 70 74 20 2a 2f 0a 73 74 61 it script */.sta
17040 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 74 tic const char t
17050 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b lsTclInitScript[
17060 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 ] = {.#include "
17070 74 6c 73 2e 74 63 6c 2e 68 22 0a 7d 3b 0a 0a 2f tls.tcl.h".};../
17080 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
17090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
170a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
170b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
170c0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
170d0 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 s_Init --. *. *.
170e0 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 This is a packag
170f0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e e initialization
17100 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 procedure, whic
17110 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 h is called. *.b
17120 79 20 54 43 4c 20 77 68 65 6e 20 74 68 69 73 20 y TCL when this
17130 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 package is to be
17140 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 added to an int
17150 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 erpreter.. *. *
17160 52 65 73 75 6c 74 73 3a 0a 20 2a 09 49 6e 69 74 Results:. *.Init
17170 69 61 6c 69 7a 65 73 20 73 74 72 75 63 74 75 72 ializes structur
17180 65 73 20 61 6e 64 20 63 72 65 61 74 65 73 20 63 es and creates c
17190 6f 6d 6d 61 6e 64 73 2e 0a 20 2a 0a 20 2a 20 53 ommands.. *. * S
171a0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
171b0 20 43 72 65 61 74 65 20 74 68 65 20 63 6f 6d 6d Create the comm
171c0 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ands. *. *------
171d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
171e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
171f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
17210 2f 0a 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 /..#if TCL_MAJOR
17220 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 64 65 _VERSION > 8.#de
17230 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e fine MIN_VERSION
17240 20 22 39 2e 30 22 0a 23 65 6c 73 65 0a 23 64 65 "9.0".#else.#de
17250 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e fine MIN_VERSION
17260 20 22 38 2e 35 22 0a 23 65 6e 64 69 66 0a 0a 44 "8.5".#endif..D
17270 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 LLEXPORT int Tls
17280 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 _Init(Tcl_Interp
17290 20 2a 69 6e 74 65 72 70 29 20 7b 0a 0a 20 20 20 *interp) {..
172a0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
172b0 22 29 3b 0a 0a 23 69 66 64 65 66 20 55 53 45 5f ");..#ifdef USE_
172c0 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 66 TCL_STUBS. if
172d0 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 (Tcl_InitStubs(
172e0 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53 interp, MIN_VERS
172f0 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 ION, 0) == NULL)
17300 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
17310 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 RROR;. }.#end
17320 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50 if. if (Tcl_P
17330 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 kgRequire(interp
17340 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 , "Tcl", MIN_VER
17350 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c SION, 0) == NULL
17360 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
17370 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
17380 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 if (TlsLibInit
17390 28 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a () != TCL_OK) {.
173a0 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
173b0 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 t(interp, "could
173c0 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 not initialize
173d0 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 63 SSL library", (c
173e0 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
173f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
17400 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
17410 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
17420 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a (interp, "::tls:
17430 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 :ciphers", Ciphe
17440 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e rsObjCmd, (Clien
17450 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 tData) NULL, (Tc
17460 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
17470 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
17480 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
17490 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c nd(interp, "::tl
174a0 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 s::connection",
174b0 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 ConnectionInfoOb
174c0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
174d0 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d a) NULL, (Tcl_Cm
174e0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
174f0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
17500 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
17510 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 68 nterp, "::tls::h
17520 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 andshake", Hands
17530 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 hakeObjCmd, (Cli
17540 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 entData) NULL, (
17550 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
17560 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
17570 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
17580 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a mand(interp, "::
17590 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d tls::import", Im
175a0 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 portObjCmd, (Cli
175b0 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 entData) NULL, (
175c0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
175d0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
175e0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
175f0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a mand(interp, "::
17600 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 tls::unimport",
17610 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 UnimportObjCmd,
17620 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c (ClientData) NUL
17630 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 L, (Tcl_CmdDelet
17640 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
17650 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
17660 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
17670 20 22 3a 3a 74 6c 73 3a 3a 75 6e 73 74 61 63 6b "::tls::unstack
17680 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d ", UnimportObjCm
17690 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
176a0 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
176b0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
176c0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
176d0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
176e0 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74 61 74 rp, "::tls::stat
176f0 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d us", StatusObjCm
17700 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
17710 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
17720 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
17730 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
17740 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
17750 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 76 65 72 73 rp, "::tls::vers
17760 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a ion", VersionObj
17770 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
17780 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 ) NULL, (Tcl_Cmd
17790 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
177a0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
177b0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
177c0 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 6d 69 terp, "::tls::mi
177d0 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c sc", MiscObjCmd,
177e0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
177f0 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
17800 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
17810 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
17820 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
17830 2c 20 22 3a 3a 74 6c 73 3a 3a 70 72 6f 74 6f 63 , "::tls::protoc
17840 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f ols", ProtocolsO
17850 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
17860 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 ta) NULL, (Tcl_C
17870 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
17880 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 75 69 6c NULL);.. Buil
17890 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 69 6e 74 dInfoCommand(int
178a0 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 erp);.. if (i
178b0 6e 74 65 72 70 20 26 26 20 54 63 6c 5f 45 76 61 nterp && Tcl_Eva
178c0 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c l(interp, tlsTcl
178d0 49 6e 69 74 53 63 72 69 70 74 29 20 21 3d 20 54 InitScript) != T
178e0 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
178f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
17900 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 }.. return Tc
17910 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 l_PkgProvide(int
17920 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d erp, PACKAGE_NAM
17930 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 E, PACKAGE_VERSI
17940 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d ON);.}../*. *---
17950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17990 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 . *. *.Tls_SafeI
179a0 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 nit --. *. *.Thi
179b0 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 s is a package i
179c0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 nitialization pr
179d0 6f 63 65 64 75 72 65 20 66 6f 72 20 73 61 66 65 ocedure for safe
179e0 20 69 6e 74 65 72 70 73 2e 0a 20 2a 0a 20 2a 20 interps.. *. *
179f0 52 65 73 75 6c 74 73 3a 0a 20 2a 09 53 61 6d 65 Results:. *.Same
17a00 20 61 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 as of 'Tls_Init
17a10 27 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 '. *. * Side eff
17a20 65 63 74 73 3a 0a 20 2a 09 53 61 6d 65 20 61 73 ects:. *.Same as
17a30 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 of 'Tls_Init'.
17a40 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
17a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17a80 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 -------. */.DLLE
17a90 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 XPORT int Tls_Sa
17aa0 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 feInit(Tcl_Inter
17ab0 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 p *interp) {.
17ac0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
17ad0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 ");. return T
17ae0 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b ls_Init(interp);
17af0 0a 7d 0a .}.