0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61 (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69 some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68 ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32 pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72 ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79 poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53 right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29 *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61 2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 ka SSL) Channel
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68 st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65 based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64 * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61 dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64 .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74 ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 full fileevent
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 Also work done
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68 ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 e impetus to do
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 pts.h".#include
0360: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63 "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e include <stdlib.
0390: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 h>.#include <ope
03a0: 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a 23 69 6e 63 nssl/ssl.h>.#inc
03b0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72 lude <openssl/cr
03c0: 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 ypto.h>.#include
03d0: 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 73 <openssl/openss
03e0: 6c 63 6f 6e 66 2e 68 3e 0a 23 69 6e 63 6c 75 64 lconf.h>.#includ
03f0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 72 73 61 2e 68 e <openssl/rsa.h
0400: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e >.#include <open
0410: 73 73 6c 2f 73 61 66 65 73 74 61 63 6b 2e 68 3e ssl/safestack.h>
0420: 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 65 6e 53 53 4c ../* Min OpenSSL
0430: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 69 66 20 version */.#if
0440: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
0450: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 NUMBER < 0x10101
0460: 30 30 30 4c 0a 23 65 72 72 6f 72 20 22 4f 6e 6c 000L.#error "Onl
0470: 79 20 4f 70 65 6e 53 53 4c 20 76 31 2e 31 2e 31 y OpenSSL v1.1.1
0480: 20 6f 72 20 6c 61 74 65 72 20 69 73 20 73 75 70 or later is sup
0490: 70 6f 72 74 65 64 22 0a 23 65 6e 64 69 66 0a 0a ported".#endif..
04a0: 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20 64 ./*. * Forward d
04b0: 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a eclarations. */.
04c0: 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b 65 79 .#define F2N(key
04d0: 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b 65 79 , dsp) \..(((key
04e0: 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 63 68 ) == NULL) ? (ch
04f0: 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c 0a 09 ar *) NULL : \..
0500: 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 .Tcl_TranslateFi
0510: 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 28 leName(interp, (
0520: 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a 0a 73 key), (dsp)))..s
0530: 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 43 tatic SSL_CTX *C
0540: 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 TX_Init(State *s
0550: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 tatePtr, int isS
0560: 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f erver, int proto
0570: 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09 09 63 , char *key,...c
0580: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 20 75 har *certfile, u
0590: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 nsigned char *ke
05a0: 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e 65 64 y_asn1, unsigned
05b0: 20 63 68 61 72 20 2a 63 65 72 74 5f 61 73 6e 31 char *cert_asn1
05c0: 2c 0a 09 09 54 63 6c 5f 53 69 7a 65 20 6b 65 79 ,...Tcl_Size key
05d0: 5f 61 73 6e 31 5f 6c 65 6e 2c 20 54 63 6c 5f 53 _asn1_len, Tcl_S
05e0: 69 7a 65 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65 ize cert_asn1_le
05f0: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c n, char *CApath,
0600: 20 63 68 61 72 20 2a 43 41 73 74 6f 72 65 2c 0a char *CAstore,.
0610: 09 09 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 ..char *CAfile,
0620: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 char *ciphers, c
0630: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 har *ciphersuite
0640: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 s, int level, ch
0650: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a ar *DHparams);..
0660: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 #define TLS_PROT
0670: 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a 23 64 65 O_SSL2..0x01.#de
0680: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 fine TLS_PROTO_S
0690: 53 4c 33 09 09 30 78 30 32 0a 23 64 65 66 69 6e SL3..0x02.#defin
06a0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
06b0: 09 09 30 78 30 34 0a 23 64 65 66 69 6e 65 20 54 ..0x04.#define T
06c0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 LS_PROTO_TLS1_1.
06d0: 30 78 30 38 0a 23 64 65 66 69 6e 65 20 54 4c 53 0x08.#define TLS
06e0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 09 30 78 _PROTO_TLS1_2.0x
06f0: 31 30 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 10.#define TLS_P
0700: 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 78 32 30 ROTO_TLS1_3.0x20
0710: 0a 23 64 65 66 69 6e 65 20 45 4e 41 42 4c 45 44 .#define ENABLED
0720: 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09 28 28 28 (flag, mask).(((
0730: 66 6c 61 67 29 20 26 20 28 6d 61 73 6b 29 29 20 flag) & (mask))
0740: 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23 64 65 66 == (mask))..#def
0750: 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47 46 49 4c ine SSLKEYLOGFIL
0760: 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47 46 49 4c E.."SSLKEYLOGFIL
0770: 45 22 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a E"..../*********
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 ***********/./*
0790: 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 20 20 Callbacks
07a0: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./***********
07b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 *********/../*.
07c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0800: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20 ----. *. * Eval
0810: 43 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64 Callback Command
0820: 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63 --. *. *.Eval c
0830: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
0840: 61 6e 64 20 63 61 74 63 68 20 61 6e 79 20 65 72 and catch any er
0850: 72 6f 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c rors. *. * Resul
0860: 74 73 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61 ts:. *.0 = Comma
0870: 6e 64 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c nd returned fail
0880: 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 or eval returne
0890: 64 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31 d TCL_ERROR. *.1
08a0: 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 = Command retur
08b0: 6e 65 64 20 73 75 63 63 65 73 73 20 6f 72 20 65 ned success or e
08c0: 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c val returned TCL
08d0: 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 _OK. *. * Side e
08e0: 66 66 65 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75 ffects:. *.Evalu
08f0: 61 74 65 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f ates callback co
0900: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d mmand. *. *-----
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
0950: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 45 76 */.static int.Ev
0960: 61 6c 43 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49 alCallback(Tcl_I
0970: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 53 nterp *interp, S
0980: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 tate *statePtr,
0990: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29 Tcl_Obj *cmdPtr)
09a0: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c {. int code,
09b0: 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 ok = 0;.. dp
09c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
09d0: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 .. Tcl_Preser
09e0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
09f0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c interp);. Tcl
0a00: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
0a10: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
0a20: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
0a30: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 73 75 63 allback with suc
0a40: 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f 72 20 72 cess for ok or r
0a50: 65 74 75 72 6e 20 76 61 6c 75 65 20 31 2c 20 66 eturn value 1, f
0a60: 61 69 6c 20 66 6f 72 20 65 72 72 6f 72 20 6f 72 ail for error or
0a70: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 30 20 return value 0
0a80: 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 */. Tcl_Reset
0a90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
0aa0: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 code = Tcl_E
0ab0: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c valObjEx(interp,
0ac0: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 cmdPtr, TCL_EVA
0ad0: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 64 L_GLOBAL);. d
0ae0: 70 72 69 6e 74 66 28 22 45 76 61 6c 43 61 6c 6c printf("EvalCall
0af0: 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f 64 65 29 back: %d", code)
0b00: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d ;. if (code =
0b10: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 = TCL_OK) {../*
0b20: 43 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72 Check result for
0b30: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f return value */
0b40: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c ..Tcl_Obj *resul
0b50: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 t = Tcl_GetObjRe
0b60: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 sult(interp);..i
0b70: 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c f (result == NUL
0b80: 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 L || Tcl_GetIntF
0b90: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 romObj(interp, r
0ba0: 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54 esult, &ok) != T
0bb0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b CL_OK) {.. ok
0bc0: 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 69 6e 74 = 1;..}..dprint
0bd0: 66 28 22 52 65 73 75 6c 74 3a 20 25 64 22 2c 20 f("Result: %d",
0be0: 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ok);. } else
0bf0: 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20 72 65 {../* Error - re
0c00: 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 66 69 ject the certifi
0c10: 63 61 74 65 20 2a 2f 0a 09 64 70 72 69 6e 74 66 cate */..dprintf
0c20: 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ("Tcl_Background
0c30: 45 72 72 6f 72 22 29 3b 0a 23 69 66 20 28 54 43 Error");.#if (TC
0c40: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MAJOR_VERSION
0c50: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 == 8) && (TCL_MI
0c60: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 NOR_VERSION < 6)
0c70: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
0c80: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 Error(interp);.#
0c90: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 else..Tcl_Backgr
0ca0: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e oundException(in
0cb0: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e terp, code);.#en
0cc0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 dif. }.. T
0cd0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
0ce0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
0cf0: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 );. Tcl_Relea
0d00: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
0d10: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 interp);. ret
0d20: 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 urn ok;.}.../*.
0d30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d70: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 ----. *. * InfoC
0d80: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a allback --. *. *
0d90: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f .Monitors SSL co
0da0: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 nnection process
0db0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
0dc0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
0dd0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
0de0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
0df0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e40: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 ---. */.static v
0e50: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b oid.InfoCallback
0e60: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c (const SSL *ssl,
0e70: 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20 int where, int
0e80: 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65 ret) {. State
0e90: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
0ea0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 ate*)SSL_get_app
0eb0: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c _data((SSL *)ssl
0ec0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 );. Tcl_Inter
0ed0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
0ee0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
0ef0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
0f00: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 r;. const cha
0f10: 72 20 2a 6d 61 6a 6f 72 2c 20 2a 6d 69 6e 6f 72 r *major, *minor
0f20: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
0f30: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
0f40: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
0f50: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
0f60: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 j*)NULL) {..retu
0f70: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 rn;. }.. i
0f80: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0f90: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 B_HANDSHAKE_STAR
0fa0: 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 T) {..major = "h
0fb0: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f andshake";..mino
0fc0: 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 r = "start";.
0fd0: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 } else if (wher
0fe0: 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 e & SSL_CB_HANDS
0ff0: 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 HAKE_DONE) {..ma
1000: 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 jor = "handshake
1010: 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e ";..minor = "don
1020: 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b e";. } else {
1030: 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 ..if (where & SS
1040: 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a L_CB_ALERT)..maj
1050: 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 or = "alert";..e
1060: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 lse if (where &
1070: 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 SSL_ST_CONNECT).
1080: 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 major = "connect
1090: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 ";..else if (whe
10a0: 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 re & SSL_ST_ACCE
10b0: 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 PT)..major = "ac
10c0: 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 cept";..else....
10d0: 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 .major = "unknow
10e0: 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 n";...if (where
10f0: 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 & SSL_CB_READ)..
1100: 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a minor = "read";.
1110: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 .else if (where
1120: 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 & SSL_CB_WRITE).
1130: 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 .minor = "write"
1140: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
1150: 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 e & SSL_CB_LOOP)
1160: 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 ..minor = "loop"
1170: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
1180: 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 e & SSL_CB_EXIT)
1190: 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 ..minor = "exit"
11a0: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f ;..else.....mino
11b0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 r = "unknown";.
11c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
11d0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
11e0: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 val with fn, cha
11f0: 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c n, major, minor,
1200: 20 6d 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79 message, and ty
1210: 70 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 pe args */. c
1220: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
1230: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
1240: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 r->callback);.
1250: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
1260: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1270: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
1280: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 ewStringObj("inf
1290: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 o", -1));. Tc
12a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
12b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
12c0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
12d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
12e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
12f0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
1300: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
1310: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1320: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1330: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
1340: 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 gObj(major, -1))
1350: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1360: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1370: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
1380: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1390: 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 minor, -1));..
13a0: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 if (where & SS
13b0: 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54 L_CB_ALERT) {..T
13c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
13d0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
13e0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
13f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
1400: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 L_alert_desc_str
1410: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d ing_long(ret), -
1420: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
1430: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1440: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
1450: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
1460: 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74 gObj(SSL_alert_t
1470: 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 ype_string_long(
1480: 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ret), -1));.
1490: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 } else {..Tcl_Li
14a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
14b0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
14c0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
14d0: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 tringObj(SSL_sta
14e0: 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 te_string_long(s
14f0: 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f sl), -1));..Tcl_
1500: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1510: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1520: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
1530: 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 ngObj("info", -1
1540: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ));. }.. /
1550: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
1560: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
1570: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
1580: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 cmdPtr);. Eva
1590: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
15a0: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
15b0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 tr);. Tcl_Dec
15c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
15d0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
1620: 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c *. * MessageCal
1630: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d lback --. *. *.M
1640: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74 onitors SSL prot
1650: 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a ocol messages. *
1660: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
1670: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
1680: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
1690: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
16a0: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d efined). *. *---
16b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 . */.#ifndef OPE
1700: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 NSSL_NO_SSL_TRAC
1710: 45 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65 E.static void.Me
1720: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e ssageCallback(in
1730: 74 20 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76 t write_p, int v
1740: 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74 ersion, int cont
1750: 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 ent_type, const
1760: 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f void *buf, size_
1770: 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c t len, SSL *ssl,
1780: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 void *arg) {.
1790: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
17a0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b r = (State*)arg;
17b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
17c0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
17d0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
17e0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
17f0: 0a 20 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20 . char *ver,
1800: 2a 74 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a *type;. BIO *
1810: 62 69 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75 bio;. char bu
1820: 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20 20 ffer[15000];.
1830: 20 62 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a buffer[0] = 0;.
1840: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
1850: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
1860: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
1870: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a ack == (Tcl_Obj*
1880: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
1890: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 ;. }.. swi
18a0: 74 63 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23 tch(version) {.#
18b0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
18c0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
18d0: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 100000L && !defi
18e0: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 ned(NO_SSL2) &&
18f0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
1900: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 _NO_SSL2). ca
1910: 73 65 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a se SSL2_VERSION:
1920: 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b ..ver = "SSLv2";
1930: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
1940: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
1950: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
1960: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
1970: 33 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 3). case SSL3
1980: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d _VERSION:..ver =
1990: 20 22 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b "SSLv3";..break
19a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 ;.#endif. cas
19b0: 65 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a e TLS1_VERSION:.
19c0: 09 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a .ver = "TLSv1";.
19d0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 .break;. case
19e0: 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a TLS1_1_VERSION:
19f0: 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31 ..ver = "TLSv1.1
1a00: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 ";..break;. c
1a10: 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49 ase TLS1_2_VERSI
1a20: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 ON:..ver = "TLSv
1a30: 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 1.2";..break;.
1a40: 20 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45 case TLS1_3_VE
1a50: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 RSION:..ver = "T
1a60: 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b LSv1.3";..break;
1a70: 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65 . case 0:..ve
1a80: 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 r = "none";..bre
1a90: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a ak;. default:
1aa0: 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e ..ver = "unknown
1ab0: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d ";..break;. }
1ac0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 63 6f .. switch (co
1ad0: 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20 ntent_type) {.
1ae0: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 case SSL3_RT_H
1af0: 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22 EADER:..type = "
1b00: 48 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b Header";..break;
1b10: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 . case SSL3_R
1b20: 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f T_INNER_CONTENT_
1b30: 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49 TYPE:..type = "I
1b40: 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70 nner Content Typ
1b50: 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 e";..break;.
1b60: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41 case SSL3_RT_CHA
1b70: 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a NGE_CIPHER_SPEC:
1b80: 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65 ..type = "Change
1b90: 20 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b Cipher";..break
1ba0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f ;. case SSL3_
1bb0: 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 RT_ALERT:..type
1bc0: 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61 = "Alert";..brea
1bd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 k;. case SSL3
1be0: 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 _RT_HANDSHAKE:..
1bf0: 74 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b type = "Handshak
1c00: 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 e";..break;.
1c10: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 case SSL3_RT_APP
1c20: 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 LICATION_DATA:..
1c30: 74 79 70 65 20 3d 20 22 41 70 70 20 44 61 74 61 type = "App Data
1c40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20 4f ";..break;.#if O
1c50: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
1c60: 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
1c70: 30 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54 4c 00L. case DTL
1c80: 53 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54 3a S1_RT_HEARTBEAT:
1c90: 0a 09 74 79 70 65 20 3d 20 22 48 65 61 72 74 62 ..type = "Heartb
1ca0: 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 eat";..break;.#e
1cb0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 ndif. default
1cc0: 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f :..type = "unkno
1cd0: 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 wn";. }..
1ce0: 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65 /* Needs compile
1cf0: 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e time option "en
1d00: 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e able-ssl-trace".
1d10: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f */. if ((bio
1d20: 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 = BIO_new(BIO_s
1d30: 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c _mem())) != NULL
1d40: 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c ) {..int n;..SSL
1d50: 5f 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20 _trace(write_p,
1d60: 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 version, content
1d70: 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c _type, buf, len,
1d80: 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69 ssl, (void *)bi
1d90: 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61 o);..n = BIO_rea
1da0: 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 d(bio, buffer, B
1db0: 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20 IO_pending(bio)
1dc0: 3c 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70 65 < 15000 ? BIO_pe
1dd0: 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34 39 nding(bio) : 149
1de0: 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 99);..n = (n<0)
1df0: 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65 72 ? 0 : n;..buffer
1e00: 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64 29 [n] = 0;..(void)
1e10: 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a BIO_flush(bio);.
1e20: 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a .BIO_free(bio);.
1e30: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
1e40: 66 28 22 4d 65 73 73 61 67 65 20 64 69 72 65 63 f("Message direc
1e50: 74 69 6f 6e 3d 25 64 2c 20 76 65 72 3d 25 73 2c tion=%d, ver=%s,
1e60: 20 74 79 70 65 3d 25 73 2c 20 6d 65 73 73 61 67 type=%s, messag
1e70: 65 3d 25 73 22 2c 20 77 72 69 74 65 5f 70 2c 20 e=%s", write_p,
1e80: 76 65 72 2c 20 74 79 70 65 2c 20 26 62 75 66 66 ver, type, &buff
1e90: 65 72 5b 30 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 er[0]);.. /*
1ea0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
1eb0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
1ec0: 63 68 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e 2c chan, direction,
1ed0: 20 76 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c 20 version, type,
1ee0: 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 73 and message args
1ef0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
1f00: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
1f10: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c j(statePtr->call
1f20: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c back);. Tcl_L
1f30: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1f40: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1f50: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
1f60: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20 gObj("message",
1f70: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
1f80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1f90: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1fa0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
1fb0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
1fc0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
1fd0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
1fe0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
1ff0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2000: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2010: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2020: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74 (write_p ? "Sent
2030: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20 " : "Received",
2040: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
2050: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2060: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2070: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2080: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20 Obj(ver, -1));.
2090: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
20a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
20b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
20c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70 NewStringObj(typ
20d0: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c e, -1));. Tcl
20e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
20f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
2100: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
2110: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d ingObj(buffer, -
2120: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 1));.. /* Eva
2130: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
2140: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
2150: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
2160: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
2170: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
2180: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
2190: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
21a0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a ount(cmdPtr);.}.
21b0: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d #endif.../*. *--
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2200: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 -. *. * VerifyCa
2210: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 llback --. *. *.
2220: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 Monitors SSL cer
2230: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 tificate validat
2240: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65 ion process. Use
2250: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 d to control the
2260: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65 . *.behavior whe
2270: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59 n the SSL_VERIFY
2280: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65 _PEER flag is se
2290: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 t. This is calle
22a0: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20 d. *.whenever a
22b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 certificate is i
22c0: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69 nspected or deci
22d0: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c ded invalid. Cal
22e0: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20 led for. *.each
22f0: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74 certificate in t
2300: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20 he cert chain..
2310: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 *. * Checks:. *.
2320: 54 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 The certificate
2330: 63 68 61 69 6e 20 69 73 20 63 68 65 63 6b 65 64 chain is checked
2340: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 starting with t
2350: 68 65 20 64 65 65 70 65 73 74 20 6e 65 73 74 69 he deepest nesti
2360: 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74 ng level. *. (t
2370: 68 65 20 72 6f 6f 74 20 43 41 20 63 65 72 74 69 he root CA certi
2380: 66 69 63 61 74 65 29 20 61 6e 64 20 77 6f 72 6b ficate) and work
2390: 65 64 20 75 70 77 61 72 64 20 74 6f 20 74 68 65 ed upward to the
23a0: 20 70 65 65 72 27 73 20 63 65 72 74 69 66 69 63 peer's certific
23b0: 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e ate.. *.All sign
23c0: 61 74 75 72 65 73 20 61 72 65 20 76 61 6c 69 64 atures are valid
23d0: 2c 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 69 , current time i
23e0: 73 20 77 69 74 68 69 6e 20 66 69 72 73 74 20 61 s within first a
23f0: 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 69 74 79 nd last validity
2400: 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20 time.. *.Check
2410: 74 68 61 74 20 74 68 65 20 63 65 72 74 69 66 69 that the certifi
2420: 63 61 74 65 20 69 73 20 69 73 73 75 65 64 20 62 cate is issued b
2430: 79 20 74 68 65 20 69 73 73 75 65 72 20 63 65 72 y the issuer cer
2440: 74 69 66 69 63 61 74 65 20 69 73 73 75 65 72 2e tificate issuer.
2450: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 72 65 . *.Check the re
2460: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 20 vocation status
2470: 66 6f 72 20 65 61 63 68 20 63 65 72 74 69 66 69 for each certifi
2480: 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 cate.. *.Check t
2490: 68 65 20 76 61 6c 69 64 69 74 79 20 6f 66 20 74 he validity of t
24a0: 68 65 20 67 69 76 65 6e 20 43 52 4c 20 61 6e 64 he given CRL and
24b0: 20 74 68 65 20 63 65 72 74 20 72 65 76 6f 63 61 the cert revoca
24c0: 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09 tion status.. *.
24d0: 43 68 65 63 6b 20 74 68 65 20 70 6f 6c 69 63 69 Check the polici
24e0: 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 65 es of all the ce
24f0: 72 74 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a rtificates. *. *
2500: 20 41 72 67 73 0a 20 2a 09 70 72 65 76 65 72 69 Args. *.preveri
2510: 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73 20 fy_ok indicates
2520: 77 68 65 74 68 65 72 20 74 68 65 20 63 65 72 74 whether the cert
2530: 69 66 69 63 61 74 65 20 76 65 72 69 66 69 63 61 ificate verifica
2540: 74 69 6f 6e 20 70 61 73 73 65 64 20 28 31 29 20 tion passed (1)
2550: 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a or not (0). *. *
2560: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 Results:. *.A c
2570: 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f allback bound to
2580: 20 74 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 the socket may
2590: 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 return one of:.
25a0: 2a 09 20 20 20 20 30 09 09 09 2d 20 74 68 65 20 *. 0...- the
25b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64 certificate is d
25c0: 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20 73 eemed invalid, s
25d0: 65 6e 64 20 76 65 72 69 66 69 63 61 74 69 6f 6e end verification
25e0: 0a 20 2a 09 09 09 09 20 20 66 61 69 6c 75 72 65 . *.... failure
25f0: 20 61 6c 65 72 74 20 74 6f 20 70 65 65 72 2c 20 alert to peer,
2600: 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 20 68 61 and terminate ha
2610: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 ndshake.. *.
2620: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 1...- the certif
2630: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 icate is deemed
2640: 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20 valid, continue
2650: 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a with handshake..
2660: 20 2a 09 20 20 20 20 65 6d 70 74 79 20 73 74 72 *. empty str
2670: 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20 ing.- no change
2680: 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 20 76 to certificate v
2690: 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 alidation. *. *
26a0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
26b0: 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f .The err field o
26c0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 f the currently
26d0: 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20 operative State
26e0: 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 is set. *. to a
26f0: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 string describi
2700: 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 ng the SSL negot
2710: 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 iation failure r
2720: 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d eason. *. *-----
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2770: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 */.static int.Ve
2780: 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74 rifyCallback(int
2790: 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f ok, X509_STORE_
27a0: 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 20 20 20 CTX *ctx) {.
27b0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
27c0: 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 . SSL *ssl.
27d0: 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 .= (SSL*)X509_ST
27e0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 ORE_CTX_get_ex_d
27f0: 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 ata(ctx, SSL_get
2800: 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 _ex_data_X509_ST
2810: 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a ORE_CTX_idx());.
2820: 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74 09 X509 *cert.
2830: 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 .= X509_STORE_CT
2840: 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 X_get_current_ce
2850: 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61 rt(ctx);. Sta
2860: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 te *statePtr.= (
2870: 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 State*)SSL_get_a
2880: 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 pp_data(ssl);.
2890: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
28a0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
28b0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 >interp;. int
28c0: 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 depth..= X509_S
28d0: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 TORE_CTX_get_err
28e0: 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 or_depth(ctx);.
28f0: 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 int err..= X5
2900: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
2910: 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20 _error(ctx);..
2920: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
2930: 64 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 d");. dprintf
2940: 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b ("VerifyCallback
2950: 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 : %d", ok);..
2960: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
2970: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a cmd == (Tcl_Obj*
2980: 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65 )NULL) {../* Use
2990: 20 6f 6b 20 76 61 6c 75 65 20 69 66 20 76 65 72 ok value if ver
29a0: 69 66 69 63 61 74 69 6f 6e 20 69 73 20 72 65 71 ification is req
29b0: 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 28 73 74 uired */..if (st
29c0: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 atePtr->vflags &
29d0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
29e0: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
29f0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ) {.. return
2a00: 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 ok;..} else {..
2a10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a return 1;..}.
2a20: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
2a30: 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 ert == NULL || s
2a40: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 sl == NULL) {..r
2a50: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a eturn 0;. }..
2a60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 dprintf("Ver
2a70: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61 ifyCallback: eva
2a80: 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 l callback");..
2a90: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
2aa0: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 mand to eval wit
2ab0: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74 h fn, chan, dept
2ac0: 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c 69 73 h, cert info lis
2ad0: 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 20 65 t, status, and e
2ae0: 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20 20 rror args */.
2af0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
2b00: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
2b10: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 Ptr->vcmd);.
2b20: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2b30: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2b40: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
2b50: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 StringObj("verif
2b60: 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 y", -1));. Tc
2b70: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2b80: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
2b90: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 mdPtr,..Tcl_NewS
2ba0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
2bb0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
2bc0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
2bd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2be0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2bf0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2c00: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 Tcl_NewIntObj(de
2c10: 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c pth));. Tcl_L
2c20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2c30: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2c40: 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f tr, Tls_NewX509O
2c50: 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 bj(interp, cert)
2c60: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2c70: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2c80: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2c90: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b Tcl_NewIntObj(ok
2ca0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2cb0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2cc0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2cd0: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f ..Tcl_NewStringO
2ce0: 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76 bj((char*)X509_v
2cf0: 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 erify_cert_error
2d00: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 _string(err), -1
2d10: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 ));.. /* Prev
2d20: 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 ent I/O while ca
2d30: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72 6f llback is in pro
2d40: 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 gress */. /*
2d50: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
2d60: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 |= TLS_TCL_CALLB
2d70: 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 ACK; */.. /*
2d80: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
2d90: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
2da0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
2db0: 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 dPtr);. ok =
2dc0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
2dd0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
2de0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f mdPtr);. Tcl_
2df0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
2e00: 50 74 72 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e Ptr);.. dprin
2e10: 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 tf("VerifyCallba
2e20: 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72 65 73 75 ck: command resu
2e30: 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a lt = %d", ok);..
2e40: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d /* statePtr-
2e50: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f >flags &= ~(TLS_
2e60: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a TCL_CALLBACK); *
2e70: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b /. return ok;
2e80: 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 ./* By default,
2e90: 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 69 leave verificati
2ea0: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f on unchanged. */
2eb0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
2f00: 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d . * Tls_Error --
2f10: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c . *. *.Calls cal
2f20: 6c 62 61 63 6b 20 77 69 74 68 20 65 72 72 6f 72 lback with error
2f30: 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 message.. *. *
2f40: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
2f50: 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f .The err field o
2f60: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 f the currently
2f70: 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20 operative State
2f80: 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 is set. *. to a
2f90: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 string describi
2fa0: 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 ng the SSL negot
2fb0: 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 iation failure r
2fc0: 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d eason. *. *-----
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
3010: 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f */.void.Tls_Erro
3020: 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 r(State *statePt
3030: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d r, const char *m
3040: 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e sg) {. Tcl_In
3050: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
3060: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
3070: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
3080: 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a dPtr, *listPtr;.
3090: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e unsigned lon
30a0: 67 20 65 72 72 3b 0a 20 20 20 20 73 74 61 74 65 g err;. state
30b0: 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a Ptr->err = msg;.
30c0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
30d0: 6c 6c 65 64 20 77 69 74 68 20 6d 65 73 73 61 67 lled with messag
30e0: 65 20 25 73 22 2c 20 6d 73 67 29 3b 0a 0a 20 20 e %s", msg);..
30f0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
3100: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c callback == (Tcl
3110: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 _Obj*)NULL) {..r
3120: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 eturn;. }..
3130: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
3140: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 and to eval with
3150: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d fn, chan, and m
3160: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 essage args */.
3170: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
3180: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
3190: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
31a0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
31b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
31c0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
31d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
31e0: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 "error", -1));.
31f0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3200: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3210: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
3220: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3230: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
3240: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
3250: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
3260: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 if (msg != NULL)
3270: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
3280: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3290: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
32a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 _NewStringObj(ms
32b0: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 g, -1));.. }
32c0: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 else if ((msg =
32d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63 Tcl_GetString(Tc
32e0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
32f0: 6e 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c nterp))) != NULL
3300: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ) {..Tcl_ListObj
3310: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3320: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
3330: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
3340: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d sg, -1));.. }
3350: 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72 else {..listPtr
3360: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
3370: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 j(0, NULL);..whi
3380: 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67 le ((err = ERR_g
3390: 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30 et_error()) != 0
33a0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
33b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
33c0: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 t(interp, listPt
33d0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
33e0: 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65 Obj(ERR_reason_e
33f0: 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 rror_string(err)
3400: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f , -1));..}..Tcl_
3410: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3420: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3430: 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 Ptr, listPtr);.
3440: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 }.. /* Eva
3450: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
3460: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
3470: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
3480: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
3490: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
34a0: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
34b0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
34c0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a ount(cmdPtr);.}.
34d0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
3520: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 KeyLogCallback
3530: 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 --. *. *.Write r
3540: 65 63 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 eceived key data
3550: 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a to log file.. *
3560: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
3570: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d :. *.none. *. *-
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35c0: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c --. */.void KeyL
35d0: 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 ogCallback(const
35e0: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 SSL *ssl, const
35f0: 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 char *line) {.
3600: 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67 char *str = g
3610: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 etenv(SSLKEYLOGF
3620: 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a ILE);. FILE *
3630: 66 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 fd;.. dprintf
3640: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
3650: 20 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 if (str) {..fd
3660: 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 = fopen(str, "a"
3670: 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 );..fprintf(fd,
3680: 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 "%s\n",line);..f
3690: 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d close(fd);. }
36a0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
36f0: 0a 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c . * Password Cal
3700: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 lback --. *. *.C
3710: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 alled when a pas
3720: 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 sword is needed
3730: 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65 for a private ke
3740: 79 20 77 68 65 6e 20 6c 6f 61 64 69 6e 67 0a 20 y when loading.
3750: 2a 09 6f 72 20 73 74 6f 72 69 6e 67 20 61 20 50 *.or storing a P
3760: 45 4d 20 63 65 72 74 69 66 69 63 61 74 65 20 77 EM certificate w
3770: 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20 ith encryption.
3780: 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 0a 20 Evals callback.
3790: 2a 09 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 *.script and ret
37a0: 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 urns the result
37b0: 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 64 20 as the password
37c0: 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a 20 string in buf..
37d0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
37e0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
37f0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
3800: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
3810: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 defined). *. * R
3820: 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73 77 eturns:. *.Passw
3830: 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 ord size in byte
3840: 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 65 s or -1 for an e
3850: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d rror.. *. *-----
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
38a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61 */.static int.Pa
38b0: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 sswordCallback(c
38c0: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 har *buf, int si
38d0: 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c 20 ze, int rwflag,
38e0: 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a 20 void *udata) {.
38f0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
3900: 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75 tr.= (State *) u
3910: 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e data;. Tcl_In
3920: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
3930: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
3940: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
3950: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f dPtr;. int co
3960: 64 65 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 de;. Tcl_Size
3970: 20 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e len;.. dprin
3980: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
3990: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c /* If no call
39a0: 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c back, use defaul
39b0: 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 t callback */.
39c0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
39d0: 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c password == NULL
39e0: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 ) {..if (Tcl_Eva
39f0: 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 lEx(interp, "tls
3a00: 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c ::password", -1,
3a10: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
3a20: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) == TCL_OK) {..
3a30: 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 char *ret =
3a40: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
3a50: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 StringFromObj(Tc
3a60: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
3a70: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 nterp), &len);..
3a80: 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 28 54 if (len > (T
3a90: 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 29 cl_Size) size-1)
3aa0: 20 7b 0a 09 09 6c 65 6e 20 3d 20 28 54 63 6c 5f {...len = (Tcl_
3ab0: 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 20 Size) size-1;..
3ac0: 20 20 20 7d 0a 09 20 20 20 20 73 74 72 6e 63 70 }.. strncp
3ad0: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a y(buf, ret, (siz
3ae0: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 e_t) len);..
3af0: 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b buf[len] = '\0';
3b00: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e .. return (in
3b10: 74 29 20 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65 20 t) len;..} else
3b20: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 {.. return -1
3b30: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
3b40: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
3b50: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 d to eval with f
3b60: 6e 2c 20 72 77 66 6c 61 67 2c 20 61 6e 64 20 73 n, rwflag, and s
3b70: 69 7a 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 ize args */.
3b80: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
3b90: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
3ba0: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20 tr->password);.
3bb0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3bc0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3bd0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
3be0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61 NewStringObj("pa
3bf0: 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20 ssword", -1));.
3c00: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3c10: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3c20: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
3c30: 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67 NewIntObj(rwflag
3c40: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
3c50: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3c60: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3c70: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 Tcl_NewIntObj(s
3c80: 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ize));.. Tcl_
3c90: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
3ca0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
3cb0: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
3cc0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
3cd0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 tePtr);.. /*
3ce0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
3cf0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
3d00: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
3d10: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 dPtr);. code
3d20: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 = Tcl_EvalObjEx(
3d30: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3d40: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
3d50: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 ;. if (code !
3d60: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 = TCL_OK) {.#if
3d70: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 (TCL_MAJOR_VERSI
3d80: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c ON == 8) && (TCL
3d90: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MINOR_VERSION <
3da0: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 6)..Tcl_Backgro
3db0: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 undError(interp)
3dc0: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 ;.#else..Tcl_Bac
3dd0: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e kgroundException
3de0: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a (interp, code);.
3df0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 #endif. }.
3e00: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
3e10: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 t(cmdPtr);..
3e20: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
3e30: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
3e40: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 r);.. /* If s
3e50: 75 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 uccessful, pass
3e60: 62 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 back password st
3e70: 72 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 ring and truncat
3e80: 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f e if too long */
3e90: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d . if (code ==
3ea0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 TCL_OK) {..char
3eb0: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 *ret = (char *)
3ec0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
3ed0: 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a omObj(Tcl_GetObj
3ee0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 Result(interp),
3ef0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 &len);..if (len
3f00: 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a > (Tcl_Size) siz
3f10: 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 e-1) {.. len
3f20: 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a = (Tcl_Size) siz
3f30: 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 e-1;..}..strncpy
3f40: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 (buf, ret, (size
3f50: 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c _t) len);..buf[l
3f60: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c en] = '\0';..Tcl
3f70: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
3f80: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 Data) interp);..
3f90: 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e return (int) len
3fa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
3fb0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
3fc0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
3fd0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c return -1;.}..
3fe0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
4030: 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b Session Callback
4040: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a for Clients --.
4050: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 *. *.Called whe
4060: 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 n a new session
4070: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 is added to the
4080: 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e cache. In TLS 1.
4090: 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 3. *.this may be
40a0: 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 received multip
40b0: 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 le times after t
40c0: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f he handshake. Fo
40d0: 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 r. *.earlier ver
40e0: 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c sions, this will
40f0: 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72 be received dur
4100: 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b ing the handshak
4110: 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 e.. *.This is th
4120: 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20 e preferred way
4130: 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 to obtain a resu
4140: 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 mable session..
4150: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
4160: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
4170: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
4180: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
4190: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 defined). *. * R
41a0: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 eturn codes:. *.
41b0: 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 0 = error where
41c0: 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 session will be
41d0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f immediately remo
41e0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 ved from the int
41f0: 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 ernal cache.. *.
4200: 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 1 = success wher
4210: 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 e app retains se
4220: 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e ssion in session
4230: 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 cache, and must
4240: 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f call SSL_SESSIO
4250: 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f N_free() when do
4260: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
42b0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 .static int.Sess
42c0: 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 ionCallback(SSL
42d0: 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f *ssl, SSL_SESSIO
42e0: 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 N *session) {.
42f0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
4300: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f r = (State*)SSL_
4310: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 get_app_data((SS
4320: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 L *)ssl);. Tc
4330: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
4340: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
4350: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
4360: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f *cmdPtr;. co
4370: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
4380: 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 r *ticket;. c
4390: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
43a0: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a ar *session_id;.
43b0: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b size_t len2;
43c0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e . unsigned in
43d0: 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 t ulen;.. dpr
43e0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
43f0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
4400: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 r->callback == (
4410: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b Tcl_Obj*)NULL) {
4420: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
4430: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
4440: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d } else if (ssl =
4450: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
4460: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
4470: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
4480: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
4490: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 mand to eval wit
44a0: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73 73 h fn, chan, sess
44b0: 69 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e 20 ion id, session
44c0: 74 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66 65 ticket, and life
44d0: 74 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 time args */.
44e0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
44f0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
4500: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
4510: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4520: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4530: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
4540: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
4550: 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 ession", -1));.
4560: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
4570: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4580: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
4590: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
45a0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
45b0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
45c0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 elf), -1));..
45d0: 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a /* Session id *
45e0: 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64 /. session_id
45f0: 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
4600: 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 et_id(session, &
4610: 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c ulen);. Tcl_L
4620: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4630: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
4640: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 tr, Tcl_NewByteA
4650: 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f rrayObj(session_
4660: 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 id, (Tcl_Size) u
4670: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 len));.. /* S
4680: 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f ession ticket */
4690: 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e . SSL_SESSION
46a0: 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 _get0_ticket(ses
46b0: 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 sion, &ticket, &
46c0: 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c len2);. Tcl_L
46d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
46e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
46f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 tr, Tcl_NewByteA
4700: 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 rrayObj(ticket,
4710: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 (Tcl_Size) len2)
4720: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 );.. /* Lifet
4730: 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 ime - number of
4740: 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 seconds */. T
4750: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
4760: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
4770: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 cmdPtr,..Tcl_New
4780: 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 LongObj((long) S
4790: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 SL_SESSION_get_t
47a0: 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 icket_lifetime_h
47b0: 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a int(session)));.
47c0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
47d0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
47e0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
47f0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
4800: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 EvalCallback(
4810: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
4820: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 , cmdPtr);. T
4830: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
4840: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a cmdPtr);.. /*
4850: 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 6e 6f Return 0 for no
4860: 77 20 75 6e 74 69 6c 20 73 65 73 73 69 6f 6e 20 w until session
4870: 68 61 6e 64 6c 69 6e 67 20 69 73 20 63 6f 6d 70 handling is comp
4880: 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 lete */. retu
4890: 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d rn 0;.}.../*. *-
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48e0: 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 --. *. * ALPN Ca
48f0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 llback for Serve
4900: 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 rs and NPN Callb
4910: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 ack for Clients
4920: 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d --. *. *.Perform
4930: 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f protocol (http/
4940: 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 63 1.1, h2, h3, etc
4950: 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 .) selection for
4960: 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 the. *.incoming
4970: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c connection. Cal
4980: 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f 20 led after Hello
4990: 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c 62 and server callb
49a0: 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 27 acks.. *.Where '
49b0: 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 65 64 out' is selected
49c0: 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69 protocol and 'i
49d0: 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 20 61 n' is the peer a
49e0: 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e 0a dvertised list..
49f0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
4a00: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
4a10: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
4a20: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
4a30: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
4a40: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a Return codes:. *
4a50: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
4a60: 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f OK: ALPN protoco
4a70: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 l selected. The
4a80: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
4a90: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
4aa0: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 EXT_ERR_ALERT_FA
4ab0: 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 6e TAL: There was n
4ac0: 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 o overlap betwee
4ad0: 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 n the client's.
4ae0: 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 6c *. supplied l
4af0: 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 76 ist and the serv
4b00: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e er configuration
4b10: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
4b20: 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 will be aborted
4b30: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
4b40: 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 ERR_NOACK: ALPN
4b50: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c protocol not sel
4b60: 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 ected, e.g., bec
4b70: 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 ause no ALPN. *.
4b80: 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 protocols ar
4b90: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 e configured for
4ba0: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e this connection
4bb0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
4bc0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 continues.. *.
4bd0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
4be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c10: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
4c20: 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b int.ALPNCallback
4c30: 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 (SSL *ssl, const
4c40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
4c50: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 *out, unsigned c
4c60: 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f har *outlen,..co
4c70: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
4c80: 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 r *in, unsigned
4c90: 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 int inlen, void
4ca0: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 *arg) {. Stat
4cb0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
4cc0: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 tate*)arg;. T
4cd0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
4ce0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
4cf0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
4d00: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
4d10: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 nt code, res;..
4d20: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
4d30: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
4d40: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 sl == NULL || ar
4d50: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 g == NULL) {..re
4d60: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
4d70: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
4d80: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 .. /* Select
4d90: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 protocol */.
4da0: 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e if (SSL_select_n
4db0: 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69 67 ext_proto((unsig
4dc0: 6e 65 64 20 63 68 61 72 20 2a 2a 29 20 6f 75 74 ned char **) out
4dd0: 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 , outlen, stateP
4de0: 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 tr->protos, stat
4df0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e ePtr->protos_len
4e00: 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d ,..in, inlen) ==
4e10: 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 OPENSSL_NPN_NEG
4e20: 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d OTIATED) {../* M
4e30: 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 atch found */..r
4e40: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
4e50: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c ERR_OK;. } el
4e60: 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c se {../* OPENSSL
4e70: 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 _NPN_NO_OVERLAP
4e80: 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f = No overlap, so
4e90: 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 use first item
4ea0: 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 from client prot
4eb0: 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 ocol list */..re
4ec0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
4ed0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
4ee0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
4ef0: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f r->vcmd == (Tcl_
4f00: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 Obj*)NULL) {..re
4f10: 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a turn res;. }.
4f20: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
4f30: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 ommand to eval w
4f40: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 ith fn, chan, de
4f50: 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c pth, cert info l
4f60: 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 ist, status, and
4f70: 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 error args */.
4f80: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
4f90: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
4fa0: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 tePtr->vcmd);.
4fb0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
4fc0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
4fd0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
4fe0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 ewStringObj("alp
4ff0: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 n", -1));. Tc
5000: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
5010: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
5020: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
5030: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
5040: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
5050: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
5060: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
5070: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5080: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
5090: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
50a0: 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 72 gObj((const char
50b0: 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a *) *out, -1));.
50c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
50d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
50e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
50f0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 _NewBooleanObj(r
5100: 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54 es == SSL_TLSEXT
5110: 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20 _ERR_OK));..
5120: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
5130: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
5140: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
5150: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 (cmdPtr);. if
5160: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 ((code = EvalCa
5170: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 llback(interp, s
5180: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 tatePtr, cmdPtr)
5190: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 ) > 1) {..res =
51a0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
51b0: 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 OACK;. } else
51c0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 if (code == 1)
51d0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
51e0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
51f0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
5200: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
5210: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20 LERT_FATAL;.
5220: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 }. Tcl_DecrRe
5230: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
5240: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a return res;.
5250: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
5260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
52a0: 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f * Advertise Pro
52b0: 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20 tocols Callback
52c0: 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f for Next Protoco
52d0: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e l Negotiation (N
52e0: 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c PN) in ServerHel
52f0: 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c lo --. *. *.call
5300: 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65 ed when a TLS se
5310: 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73 rver needs a lis
5320: 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70 t of supported p
5330: 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78 rotocols for Nex
5340: 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65 t. *.Protocol Ne
5350: 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a gotiation.. *. *
5360: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
5370: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
5380: 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75 ects:. *. * Retu
5390: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c rn codes:. *.SSL
53a0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 _TLSEXT_ERR_OK:
53b0: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c NPN protocol sel
53c0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 ected. The conne
53d0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
53e0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
53f0: 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72 RR_NOACK: NPN pr
5400: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 otocol not selec
5410: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
5420: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
5430: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 -------. */.#ifd
5480: 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69 ef USE_NPN.stati
5490: 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63 c int.NPNCallbac
54a0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
54b0: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 , const unsigned
54c0: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 char **out, uns
54d0: 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65 igned int *outle
54e0: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a n, void *arg) {.
54f0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
5500: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
5510: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 g;.. dprintf(
5520: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
5530: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 if (ssl == NULL
5540: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 || arg == NULL)
5550: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
5560: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
5570: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
5580: 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 t protocols list
5590: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
55a0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
55b0: 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20 NULL) {..*out =
55c0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
55d0: 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61 ;..*outlen = sta
55e0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 tePtr->protos_le
55f0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a n;. } else {.
5600: 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a .*out = NULL;..*
5610: 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74 outlen = 0;..ret
5620: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
5630: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
5640: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 return SSL_T
5650: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a LSEXT_ERR_OK;.}.
5660: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d #endif.../*. *--
5670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56b0: 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c -. *. * SNI Call
56c0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 back for Servers
56d0: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 --. *. *.Perfor
56e0: 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e m server-side SN
56f0: 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63 I hostname selec
5700: 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69 tion after recei
5710: 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69 ving SNI extensi
5720: 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20 on. *.in Client
5730: 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66 Hello. Called af
5740: 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 ter hello callba
5750: 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c ck but before AL
5760: 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a PN callback.. *.
5770: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
5780: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
5790: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
57a0: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
57b0: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
57c0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
57d0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a L_TLSEXT_ERR_OK:
57e0: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 SNI hostname is
57f0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 accepted. The c
5800: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
5810: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 ues.. *.SSL_TLSE
5820: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 XT_ERR_ALERT_FAT
5830: 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 AL: SNI hostname
5840: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 is not accepted
5850: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
5860: 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 . *. is abort
5870: 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 ed. Default for
5880: 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f alert is SSL_AD_
5890: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d UNRECOGNIZED_NAM
58a0: 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 E.. *.SSL_TLSEXT
58b0: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 _ERR_ALERT_WARNI
58c0: 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 NG: SNI hostname
58d0: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 is not accepted
58e0: 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a , warning alert.
58f0: 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 *. sent (not
5900: 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c supported in TL
5910: 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e Sv1.3). The conn
5920: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
5930: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
5940: 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 ERR_NOACK: SNI h
5950: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 ostname is not a
5960: 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 ccepted and not
5970: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a acknowledged,. *
5980: 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 . e.g. if SNI
5990: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f has not been co
59a0: 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f nfigured. The co
59b0: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
59c0: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d es.. *. *-------
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
5a10: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 .static int.SNIC
5a20: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
5a30: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
5a40: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
5a50: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
5a60: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
5a70: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
5a80: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
5a90: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
5aa0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
5ab0: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
5ac0: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 , res;. const
5ad0: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
5ae0: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 e = NULL;.. d
5af0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
5b00: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d ;.. if (ssl =
5b10: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d = NULL || arg ==
5b20: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
5b30: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5b40: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 NOACK;. }..
5b50: 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 /* Only works
5b60: 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20 for TLS 1.2 and
5b70: 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73 earlier */. s
5b80: 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f ervername = SSL_
5b90: 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 get_servername(s
5ba0: 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 sl, TLSEXT_NAMET
5bb0: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a YPE_host_name);.
5bc0: 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e if (!servern
5bd0: 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d ame || servernam
5be0: 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a e[0] == '\0') {.
5bf0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
5c00: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
5c10: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 }.. if (sta
5c20: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 tePtr->vcmd == (
5c30: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b Tcl_Obj*)NULL) {
5c40: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
5c50: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
5c60: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 }.. /* Create
5c70: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c command to eval
5c80: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 with fn, chan,
5c90: 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 and server name
5ca0: 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 args */. cmdP
5cb0: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
5cc0: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
5cd0: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
5ce0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5cf0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
5d00: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
5d10: 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 gObj("sni", -1))
5d20: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
5d30: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5d40: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
5d50: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
5d60: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
5d70: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
5d80: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 ->self), -1));.
5d90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
5da0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5db0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
5dc0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 NewStringObj(ser
5dd0: 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a vername , -1));.
5de0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
5df0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
5e00: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
5e10: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
5e20: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 if ((code = E
5e30: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
5e40: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
5e50: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 dPtr)) > 1) {..r
5e60: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
5e70: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e ERR_ALERT_WARNIN
5e80: 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c G;..*alert = SSL
5e90: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 _AD_UNRECOGNIZED
5ea0: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 _NAME; /* Not su
5eb0: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 pported by TLS 1
5ec0: 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 .3 */. } else
5ed0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 if (code == 1)
5ee0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
5ef0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
5f00: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
5f10: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
5f20: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c LERT_FATAL;..*al
5f30: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 ert = SSL_AD_UNR
5f40: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 ECOGNIZED_NAME;
5f50: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 /* Not supported
5f60: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 by TLS 1.3 */.
5f70: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
5f80: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
5f90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 );. return re
5fa0: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d s;.}.../*. *----
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
5ff0: 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c *. * ClientHell
6000: 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c o Handshake Call
6010: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 back for Servers
6020: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 --. *. *.Used b
6030: 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d y server to exam
6040: 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e ine the server n
6050: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 ame indication (
6060: 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 SNI) extension.
6070: 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 *.provided by th
6080: 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 e client in orde
6090: 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 r to select an a
60a0: 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 ppropriate certi
60b0: 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 ficate to. *.pre
60c0: 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f sent, and make o
60d0: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 ther configurati
60e0: 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 on adjustments r
60f0: 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 elevant to that
6100: 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 server. *.name a
6110: 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 nd its configura
6120: 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 tion. This inclu
6130: 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 des swapping out
6140: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a the associated.
6150: 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 *.SSL_CTX point
6160: 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 er, modifying th
6170: 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 e server's list
6180: 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 of permitted TLS
6190: 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 versions,. *.ch
61a0: 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 anging the serve
61b0: 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 r's cipher list
61c0: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 in response to t
61d0: 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 he client's ciph
61e0: 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a er list, etc.. *
61f0: 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 .Called before S
6200: 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c NI and ALPN call
6210: 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 backs.. *. * Res
6220: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
6230: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
6240: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
6250: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
6260: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
6270: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 des:. *.SSL_CLIE
6280: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 NT_HELLO_RETRY:
6290: 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 suspend the hand
62a0: 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 shake, and the h
62b0: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f andshake functio
62c0: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d n will return im
62d0: 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c mediately. *.SSL
62e0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
62f0: 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 ROR: failure, te
6300: 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 rminate connecti
6310: 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f on. Set alert to
6320: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 error code.. *.
6330: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
6340: 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 _SUCCESS: succes
6350: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d s. *. *---------
6360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
63a0: 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 tatic int.HelloC
63b0: 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c allback(SSL *ssl
63c0: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f , int *alert, vo
63d0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
63e0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
63f0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 (State*)arg;.
6400: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
6410: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
6420: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
6430: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
6440: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b int code, res;
6450: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
6460: 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 *servername;.
6470: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
6480: 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a char *p;. siz
6490: 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 e_t len, remaini
64a0: 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 ng;.. dprintf
64b0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
64c0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
64d0: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a cmd == (Tcl_Obj*
64e0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
64f0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6500: 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d O_SUCCESS;. }
6510: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d else if (ssl ==
6520: 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 (const SSL *)NU
6530: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f LL || arg == (vo
6540: 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 id *)NULL) {..re
6550: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
6560: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
6570: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e }.. /* Get n
6580: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 ames */. if (
6590: 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c !SSL_client_hell
65a0: 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 o_get0_ext(ssl,
65b0: 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 TLSEXT_TYPE_serv
65c0: 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 er_name, &p, &re
65d0: 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 maining) || rema
65e0: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a ining <= 2) {..*
65f0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 alert = SSL_R_SS
6600: 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 LV3_ALERT_ILLEGA
6610: 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 L_PARAMETER;..re
6620: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
6630: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
6640: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 }.. /* Extra
6650: 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 ct the length of
6660: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 the supplied li
6670: 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a st of names. */.
6680: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b len = (*(p++
6690: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e ) << 8);. len
66a0: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 += *(p++);.
66b0: 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 if (len + 2 != r
66c0: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c emaining) {..*al
66d0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 ert = SSL_R_SSLV
66e0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 3_ALERT_ILLEGAL_
66f0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 PARAMETER;..retu
6700: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
6710: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
6720: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d . remaining =
6730: 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 len;.. /* Th
6740: 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 e list in practi
6750: 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 ce only has a si
6760: 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f ngle element, so
6770: 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 we only conside
6780: 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e r the first one.
6790: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 */. if (rema
67a0: 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 ining == 0 || *p
67b0: 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d ++ != TLSEXT_NAM
67c0: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 ETYPE_host_name)
67d0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
67e0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
67f0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 NTERNAL_ERROR;..
6800: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6810: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
6820: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
6830: 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f ng--;.. /* No
6840: 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 w we can finally
6850: 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 pull out the by
6860: 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 te array with th
6870: 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d e actual hostnam
6880: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 e. */. if (re
6890: 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a maining <= 2) {.
68a0: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f .*alert = SSL_R_
68b0: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 TLSV1_ALERT_INTE
68c0: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 RNAL_ERROR;..ret
68d0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
68e0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
68f0: 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 }. len = (*(p
6900: 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c ++) << 8);. l
6910: 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 en += *(p++);.
6920: 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 if (len + 2 >
6930: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 remaining) {..*a
6940: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 lert = SSL_R_TLS
6950: 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 V1_ALERT_INTERNA
6960: 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e L_ERROR;..return
6970: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6980: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 O_ERROR;. }.
6990: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c remaining = l
69a0: 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 en;. serverna
69b0: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 me = (const char
69c0: 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 *)p;.. /* Cr
69d0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
69e0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 eval with fn, ch
69f0: 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e an, and server n
6a00: 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 ame args */.
6a10: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
6a20: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
6a30: 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 tr->vcmd);. T
6a40: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6a50: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
6a60: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
6a70: 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 tringObj("hello"
6a80: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
6a90: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
6aa0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
6ab0: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
6ac0: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
6ad0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
6ae0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
6af0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
6b00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
6b10: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
6b20: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
6b30: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 bj(servername, (
6b40: 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 3b Tcl_Size) len));
6b50: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
6b60: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
6b70: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
6b80: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
6b90: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 if ((code =
6ba0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
6bb0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
6bc0: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 mdPtr)) > 1) {..
6bd0: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 res = SSL_CLIENT
6be0: 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a _HELLO_RETRY;..*
6bf0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c alert = SSL_R_TL
6c00: 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 SV1_ALERT_USER_C
6c10: 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 ANCELLED;. }
6c20: 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d else if (code ==
6c30: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 1) {..res = SSL
6c40: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 _CLIENT_HELLO_SU
6c50: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 CCESS;. } els
6c60: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 e {..res = SSL_C
6c70: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6c80: 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c R;..*alert = SSL
6c90: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
6ca0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 NTERNAL_ERROR;.
6cb0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
6cc0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
6cd0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 );. return re
6ce0: 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a s;.}.../********
6cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a ************/./*
6d00: 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 Commands
6d10: 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./**********
6d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a **********/../*.
6d30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d70: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 -----. *. * Ciph
6d80: 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 ersObjCmd -- lis
6d90: 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 t available ciph
6da0: 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 ers. *. *.This p
6db0: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
6dc0: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 ked to process t
6dd0: 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 he "tls::ciphers
6de0: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 " command. *.to
6df0: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 list available c
6e00: 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70 iphers, based up
6e10: 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 on protocol sele
6e20: 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 cted.. *. * Resu
6e30: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
6e40: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 rd Tcl result li
6e50: 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 st.. *. * Side e
6e60: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 ffects:. *.const
6e70: 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f ructs and destro
6e80: 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 ys SSL context (
6e90: 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d CTX). *. *------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
6ee0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 /.static const c
6ef0: 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d har *protocols[]
6f00: 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 73 = {.."ssl2", "s
6f10: 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 74 sl3", "tls1", "t
6f20: 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22 ls1.1", "tls1.2"
6f30: 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c , "tls1.3", NULL
6f40: 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f .};.enum protoco
6f50: 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32 l {. TLS_SSL2
6f60: 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f , TLS_SSL3, TLS_
6f70: 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31 TLS1, TLS_TLS1_1
6f80: 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c , TLS_TLS1_2, TL
6f90: 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f S_TLS1_3, TLS_NO
6fa0: 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e NE.};..static in
6fb0: 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 t.CiphersObjCmd(
6fc0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
6fd0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
6fe0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
6ff0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
7000: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
7010: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
7020: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 r = NULL;. SS
7030: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c L_CTX *ctx = NUL
7040: 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 L;. SSL *ssl
7050: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 = NULL;. STAC
7060: 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29 K_OF(SSL_CIPHER)
7070: 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 62 *sk;. char b
7080: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 uf[BUFSIZ];.
7090: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f int index, verbo
70a0: 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 se = 0, use_supp
70b0: 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 orted = 0;. c
70c0: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 onst SSL_METHOD
70d0: 2a 6d 65 74 68 6f 64 3b 0a 20 20 20 20 28 76 6f *method;. (vo
70e0: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a id) clientData;.
70f0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
7100: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
7110: 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 ((objc < 2) || (
7120: 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 objc > 4)) {..Tc
7130: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
7140: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
7150: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f "protocol ?verbo
7160: 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 se? ?supported?"
7170: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
7180: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
7190: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
71a0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
71b0: 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f objv[1], protoco
71c0: 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 ls, "protocol",
71d0: 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 0, &index) != TC
71e0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
71f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7200: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e . if ((objc >
7210: 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 2) && Tcl_GetBo
7220: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 oleanFromObj(int
7230: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 erp, objv[2], &v
7240: 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f erbose) != TCL_O
7250: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
7260: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
7270: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 if ((objc > 3)
7280: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 && Tcl_GetBoole
7290: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 anFromObj(interp
72a0: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f , objv[3], &use_
72b0: 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 supported) != TC
72c0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
72d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
72e0: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f .. ERR_clear_
72f0: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 error();.. sw
7300: 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 itch ((enum prot
7310: 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 ocol)index) {..c
7320: 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 ase TLS_SSL2:.#i
7330: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
7340: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 N_NUMBER >= 0x10
7350: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 100000L || defin
7360: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 ed(NO_SSL2) || d
7370: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7380: 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c O_SSL2).. Tcl
7390: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
73a0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
73b0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
73c0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
73d0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
73e0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
73f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
7400: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 .. method = S
7410: 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 SLv2_method(); b
7420: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 reak;.#endif..ca
7430: 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 se TLS_SSL3:.#if
7440: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 defined(NO_SSL3
7450: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
7460: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c NSSL_NO_SSL3) ||
7470: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
7480: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 _NO_SSL3_METHOD)
7490: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
74a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
74b0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
74c0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
74d0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
74e0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
74f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
7500: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
7510: 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 ethod = SSLv3_me
7520: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 thod(); break;.#
7530: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
7540: 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 TLS1:.#if define
7550: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 d(NO_TLS1) || de
7560: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7570: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 _TLS1) || define
7580: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
7590: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 1_METHOD).. T
75a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
75b0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
75c0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
75d0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
75e0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ted", (char *) N
75f0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ULL);.. retur
7600: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c n TCL_ERROR;.#el
7610: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d se.. method =
7620: 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b TLSv1_method();
7630: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
7640: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a case TLS_TLS1_1:
7650: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
7660: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
7670: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7680: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
7690: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
76a0: 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 _1_METHOD)..
76b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
76c0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
76d0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
76e0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
76f0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
7700: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
7710: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
7720: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 lse.. method
7730: 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 = TLSv1_1_method
7740: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 (); break;.#endi
7750: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
7760: 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _2:.#if defined(
7770: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 NO_TLS1_2) || de
7780: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7790: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
77a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
77b0: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 LS1_2_METHOD)..
77c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
77d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
77e0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
77f0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
7800: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
7810: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 *) NULL);.. r
7820: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7830: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
7840: 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 od = TLSv1_2_met
7850: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 hod(); break;.#e
7860: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
7870: 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e LS1_3:.#if defin
7880: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c ed(NO_TLS1_3) ||
7890: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
78a0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 _NO_TLS1_3)..
78b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
78c0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
78d0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
78e0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
78f0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
7900: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
7910: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
7920: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 else.. method
7930: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b = TLS_method();
7940: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
7950: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 t_min_proto_vers
7960: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
7970: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 VERSION);.. S
7980: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 SL_CTX_set_max_p
7990: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
79a0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
79b0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 );.. break;.#
79c0: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a endif..default:.
79d0: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c . method = TL
79e0: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 S_method();..
79f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 break;. }..
7a00: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 ctx = SSL_CTX
7a10: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 _new(method);.
7a20: 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c if (ctx == NUL
7a30: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
7a40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 Result(interp, G
7a50: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
7a60: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
7a70: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7a80: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 OR;. }.. s
7a90: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 sl = SSL_new(ctx
7aa0: 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d );. if (ssl =
7ab0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 = NULL) {..Tcl_A
7ac0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7ad0: 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 rp, GET_ERR_REAS
7ae0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
7af0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
7b00: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
7b10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
7b20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c }.. /* Use l
7b30: 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 ist and order as
7b40: 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 would be sent i
7b50: 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 n a ClientHello
7b60: 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 or all available
7b70: 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 ciphers */.
7b80: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 if (use_supporte
7b90: 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 d) {..sk = SSL_g
7ba0: 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 et1_supported_ci
7bb0: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 phers(ssl);.
7bc0: 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 } else {..sk = S
7bd0: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 SL_get_ciphers(s
7be0: 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 sl);. }..
7bf0: 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 if (sk != NULL)
7c00: 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 {..if (!verbose)
7c10: 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68 {.. const ch
7c20: 61 72 20 2a 63 70 3b 0a 09 20 20 20 20 6f 62 6a ar *cp;.. obj
7c30: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
7c40: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 tObj(0, NULL);..
7c50: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d for (int i =
7c60: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 0; i < sk_SSL_C
7c70: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 IPHER_num(sk); i
7c80: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 ++) {...const SS
7c90: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b L_CIPHER *c = sk
7ca0: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 _SSL_CIPHER_valu
7cb0: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 e(sk, i);...if (
7cc0: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 c == NULL) conti
7cd0: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 nue;..../* ciphe
7ce0: 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 r name or (NONE)
7cf0: 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 */...cp = SSL_C
7d00: 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 IPHER_get_name(c
7d10: 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e );...if (cp == N
7d20: 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 ULL) break;...Tc
7d30: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
7d40: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
7d50: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
7d60: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 ringObj((char *)
7d70: 20 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 cp, -1));..
7d80: 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 }...} else {..
7d90: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
7da0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 ewStringObj("",0
7db0: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 );.. for (int
7dc0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 i = 0; i < sk_S
7dd0: 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b SL_CIPHER_num(sk
7de0: 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 ); i++) {...cons
7df0: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 t SSL_CIPHER *c
7e00: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f = sk_SSL_CIPHER_
7e10: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 value(sk, i);...
7e20: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 if (c == NULL) c
7e30: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 ontinue;..../* t
7e40: 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 extual descripti
7e50: 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 on of the cipher
7e60: 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 */...if (SSL_CI
7e70: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e PHER_description
7e80: 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 (c, buf, sizeof(
7e90: 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b buf)) != NULL) {
7ea0: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ... Tcl_Appen
7eb0: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 dToObj(objPtr, b
7ec0: 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 uf, (Tcl_Size) s
7ed0: 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d trlen(buf));...}
7ee0: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 else {... Tc
7ef0: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 l_AppendToObj(ob
7f00: 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e jPtr, "UNKNOWN\n
7f10: 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 ", 8);...}..
7f20: 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 }..}..if (use_su
7f30: 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 pported) {..
7f40: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 sk_SSL_CIPHER_fr
7f50: 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d ee(sk);..}. }
7f60: 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 . SSL_free(ss
7f70: 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f l);. SSL_CTX_
7f80: 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 free(ctx);..
7f90: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
7fa0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
7fb0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
7fc0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8010: 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c -. *. * Protocol
8020: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 sObjCmd -- list
8030: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 available protoc
8040: 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 ols. *. *.This p
8050: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
8060: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 ked to process t
8070: 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f he "tls::protoco
8080: 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 ls" command. *.t
8090: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 o list available
80a0: 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 protocols.. *.
80b0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
80c0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
80d0: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 ult list.. *. *
80e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
80f0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .none. *. *-----
8100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
8140: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 */.static int.Pr
8150: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c otocolsObjCmd(Cl
8160: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
8170: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
8180: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
8190: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
81a0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
81b0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
81c0: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 . (void) clie
81d0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ntData;.. dpr
81e0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
81f0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
8200: 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 1) {..Tcl_Wrong
8210: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
8220: 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 1, objv, "");..r
8230: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8240: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
8250: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
8260: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
8270: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
8280: 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 ULL);..#if OPENS
8290: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
82a0: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 R < 0x10100000L
82b0: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 && !defined(NO_S
82c0: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL2) && !defined
82d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
82e0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
82f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
8300: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
8310: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
8320: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 protocols[TLS_SS
8330: 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 L2], -1));.#endi
8340: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
8350: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
8360: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
8370: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
8380: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
8390: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c _METHOD). Tcl
83a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
83b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
83c0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
83d0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
83e0: 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 [TLS_SSL3], -1))
83f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
8400: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 fined(NO_TLS1) &
8410: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
8420: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 SL_NO_TLS1) && !
8430: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8440: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a NO_TLS1_METHOD).
8450: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
8460: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
8470: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
8480: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
8490: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
84a0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
84b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
84c0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
84d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
84e0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
84f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
8500: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_1_METHOD).
8510: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
8520: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
8530: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
8540: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
8550: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d cols[TLS_TLS1_1]
8560: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
8570: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
8580: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
8590: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
85a0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
85b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
85c0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_2_METHOD).
85d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
85e0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
85f0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
8600: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 StringObj(protoc
8610: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c ols[TLS_TLS1_2],
8620: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 -1));.#endif.#i
8630: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
8640: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
8650: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
8660: 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1_3). Tcl_Lis
8670: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
8680: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
8690: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
86a0: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
86b0: 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a _TLS1_3], -1));.
86c0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f #endif.. Tcl_
86d0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
86e0: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
86f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
8700: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
8710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
8750: 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a . * HandshakeObj
8760: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
8770: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 s command is use
8780: 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 d to verify whet
8790: 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b her the handshak
87a0: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a e is complete. *
87b0: 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 .or not.. *. * R
87c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
87d0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
87e0: 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 . 1 means handsh
87f0: 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 ake complete, 0
8800: 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 means pending..
8810: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
8820: 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 s:. *.May force
8830: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 SSL negotiation
8840: 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 to take place..
8850: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
8860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8890: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
88a0: 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 ic int Handshake
88b0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
88c0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
88d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
88e0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
88f0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
8900: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
8910: 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 nnel chan;
8920: 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c /* The channel
8930: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
8940: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 n. */. State
8950: 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20 *statePtr;
8960: 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 /* client stat
8970: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 e for ssl socket
8980: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 */. const ch
8990: 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c ar *errStr = NUL
89a0: 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d L;. int ret =
89b0: 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 1;. int err
89c0: 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 = 0;. (void)
89d0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
89e0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
89f0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
8a00: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
8a10: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
8a20: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
8a30: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
8a40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8a50: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
8a60: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 _error();.. c
8a70: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
8a80: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c nnel(interp, Tcl
8a90: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
8aa0: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 1]), NULL);.
8ab0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
8ac0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
8ad0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
8ae0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
8af0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
8b00: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
8b10: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
8b20: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
8b30: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
8b40: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 han);. if (Tc
8b50: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
8b60: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
8b70: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
8b80: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
8b90: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
8ba0: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
8bb0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
8bc0: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e an),.. "\": n
8bd0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
8be0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
8bf0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
8c00: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
8c10: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c S", "HANDSHAKE",
8c20: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
8c30: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
8c40: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
8c50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
8c60: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
8c70: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
8c80: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
8c90: 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 ta(chan);.. d
8ca0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 printf("Calling
8cb0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
8cc0: 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 ct");. ret =
8cd0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
8ce0: 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 ct(statePtr, &er
8cf0: 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e r, 1);. dprin
8d00: 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 tf("Tls_WaitForC
8d10: 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a onnect returned:
8d20: 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 %i", ret);..
8d30: 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 if (ret < 0 &&
8d40: 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ((statePtr->flag
8d50: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e s & TLS_TCL_ASYN
8d60: 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 C) && (err == EA
8d70: 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e GAIN))) {..dprin
8d80: 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e tf("Async set an
8d90: 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 d err = EAGAIN")
8da0: 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 ;..ret = 0;.
8db0: 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c } else if (ret <
8dc0: 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 0) {..long resu
8dd0: 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 74 lt;..errStr = st
8de0: 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 atePtr->err;..Tc
8df0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e l_ResetResult(in
8e00: 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 terp);..Tcl_SetE
8e10: 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 rrno(err);...if
8e20: 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 (!errStr || (*er
8e30: 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 rStr == 0)) {..
8e40: 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f errStr = Tcl_
8e50: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 PosixError(inter
8e60: 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 p);..}...Tcl_App
8e70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
8e80: 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69 , "handshake fai
8e90: 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 led: ", errStr,
8ea0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
8eb0: 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20 53 .if ((result = S
8ec0: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 SL_get_verify_re
8ed0: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 sult(statePtr->s
8ee0: 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f sl)) != X509_V_O
8ef0: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 K) {.. Tcl_Ap
8f00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
8f10: 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22 22 2c p, " due to \"",
8f20: 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 X509_verify_cer
8f30: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72 t_error_string(r
8f40: 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20 28 63 esult), "\"", (c
8f50: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d har *) NULL);..}
8f60: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
8f70: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
8f80: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 , "HANDSHAKE", "
8f90: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
8fa0: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 ) NULL);..dprint
8fb0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c f("Returning TCL
8fc0: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 _ERROR with hand
8fd0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 shake failed: %s
8fe0: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 ", errStr);..ret
8ff0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
9000: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
9010: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 (err != 0) {..
9020: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 dprintf("Got a
9030: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 n error with a c
9040: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 ompleted handsha
9050: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 ke: err = %i", e
9060: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 rr);..}..ret = 1
9070: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
9080: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 intf("Returning
9090: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 TCL_OK with data
90a0: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a \"%i\"", ret);.
90b0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
90c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
90d0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 _NewIntObj(ret))
90e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
90f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d _OK;.}../*. *---
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9140: 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a . *. * ImportObj
9150: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
9160: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
9170: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
9180: 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d s the "ssl" comm
9190: 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 and. *. *.The ss
91a0: 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 l command pushes
91b0: 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 SSL over a (new
91c0: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 ly connected) tc
91d0: 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 p socket. *. * R
91e0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
91f0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
9200: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
9210: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 ects:. *.May mod
9220: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 ify the behavior
9230: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 of an IO channe
9240: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d l.. *. *--------
9250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
9290: 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 static int.Impor
92a0: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 tObjCmd(ClientDa
92b0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
92c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
92d0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
92e0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
92f0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
9300: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 annel chan;../*
9310: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
9320: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f et a mode on. */
9330: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
9340: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 ePtr;../* client
9350: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
9360: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c ocket */. SSL
9370: 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c _CTX *ctx..= NUL
9380: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a L;. Tcl_Obj *
9390: 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b 0a script..= NULL;.
93a0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 Tcl_Obj *pas
93b0: 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 sword..= NULL;.
93c0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 Tcl_Obj *vcmd
93d0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 ..= NULL;. Tc
93e0: 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 l_DString upperC
93f0: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
9400: 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 n, upperChannelB
9410: 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 locking, upperCh
9420: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 annelEncoding, u
9430: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
9440: 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b ar;. int idx;
9450: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 . Tcl_Size le
9460: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 n;. int flags
9470: 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 ...= TLS_TCL_INI
9480: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 T;. int serve
9490: 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63 r...= 0;./* is c
94a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 onnection incomi
94b0: 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 ng or outgoing?
94c0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 */. char *key
94d0: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 file..= NULL;.
94e0: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 char *certfile
94f0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e ..= NULL;. un
9500: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 signed char *key
9510: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 ..= NULL;. Tc
9520: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09 l_Size key_len..
9530: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 = 0;. unsigne
9540: 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d 20 d char *cert..=
9550: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 NULL;. Tcl_Si
9560: 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30 ze cert_len..= 0
9570: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 ;. char *ciph
9580: 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ers..= NULL;.
9590: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 char *ciphersui
95a0: 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 tes..= NULL;.
95b0: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09 3d char *CAfile..=
95c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
95d0: 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b *CApath..= NULL;
95e0: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 73 74 6f . char *CAsto
95f0: 72 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 re..= NULL;.
9600: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 09 char *DHparams..
9610: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
9620: 20 2a 6d 6f 64 65 6c 09 09 09 3d 20 4e 55 4c 4c *model...= NULL
9630: 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 ;. char *serv
9640: 65 72 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09 ername..= NULL;.
9650: 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 /* hostname for
9660: 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 Server Name Indi
9670: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 68 cation */. ch
9680: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 09 09 ar *session_id..
9690: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
96a0: 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c Obj *alpn..= NUL
96b0: 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 L;. int ssl2
96c0: 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 = 0, ssl3 = 0;.
96d0: 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c int tls1 = 1,
96e0: 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 tls1_1 = 1, tls
96f0: 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 1_2 = 1, tls1_3
9700: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f = 1;. int pro
9710: 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 to = 0, level =
9720: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 -1;. int veri
9730: 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 fy = 0, require
9740: 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 = 0, request = 1
9750: 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 , post_handshake
9760: 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 = 0;. (void)
9770: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 clientData;..
9780: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
9790: 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 d");..#if define
97a0: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 d(NO_TLS1) || de
97b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
97c0: 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 _TLS1). tls1
97d0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 0;.#endif.#if
97e0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
97f0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
9800: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
9810: 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b . tls1_1 = 0;
9820: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
9830: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c ned(NO_TLS1_2) |
9840: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
9850: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 L_NO_TLS1_2).
9860: 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e tls1_2 = 0;.#en
9870: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
9880: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
9890: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
98a0: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 _TLS1_3). tls
98b0: 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 1_3 = 0;.#endif.
98c0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 . if (objc <
98d0: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
98e0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
98f0: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c , objv, "channel
9900: 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 ?options?");..r
9910: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
9920: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
9930: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
9940: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
9950: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
9960: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 , Tcl_GetString(
9970: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b objv[1]), NULL);
9980: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
9990: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
99a0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
99b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
99c0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
99d0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
99e0: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
99f0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
9a00: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
9a10: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 nel(chan);..
9a20: 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 for (idx = 2; id
9a30: 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 x < objc; idx++)
9a40: 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 {..char *opt =
9a50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
9a60: 6a 76 5b 69 64 78 5d 29 3b 0a 0a 09 69 66 20 28 jv[idx]);...if (
9a70: 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 opt[0] != '-')..
9a80: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 break;...OPT
9a90: 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 OBJ("-alpn", alp
9aa0: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 n);..OPTSTR("-ca
9ab0: 64 69 72 22 2c 20 43 41 70 61 74 68 29 3b 0a 09 dir", CApath);..
9ac0: 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 OPTSTR("-cafile"
9ad0: 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 53 , CAfile);..OPTS
9ae0: 54 52 28 22 2d 63 61 73 74 6f 72 65 22 2c 20 43 TR("-castore", C
9af0: 41 73 74 6f 72 65 29 3b 0a 09 4f 50 54 42 59 54 Astore);..OPTBYT
9b00: 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c E("-cert", cert,
9b10: 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 cert_len);..OPT
9b20: 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c STR("-certfile",
9b30: 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 certfile);..OPT
9b40: 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63 STR("-cipher", c
9b50: 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 iphers);..OPTSTR
9b60: 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70 ("-ciphers", cip
9b70: 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 hers);..OPTSTR("
9b80: 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 20 -ciphersuites",
9b90: 63 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09 ciphersuites);..
9ba0: 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 OPTOBJ("-command
9bb0: 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 ", script);..OPT
9bc0: 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c STR("-dhparams",
9bd0: 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 DHparams);..OPT
9be0: 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 BYTE("-key", key
9bf0: 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 , key_len);..OPT
9c00: 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 STR("-keyfile",
9c10: 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 keyfile);..OPTST
9c20: 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 R("-model", mode
9c30: 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 l);..OPTOBJ("-pa
9c40: 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 ssword", passwor
9c50: 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 d);..OPTBOOL("-p
9c60: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20 ost_handshake",
9c70: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b post_handshake);
9c80: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 ..OPTBOOL("-requ
9c90: 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a est", request);.
9ca0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 .OPTBOOL("-requi
9cb0: 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 re", require);..
9cc0: 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74 OPTINT("-securit
9cd0: 79 5f 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 y_level", level)
9ce0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 ;..OPTBOOL("-ser
9cf0: 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 ver", server);..
9d00: 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e OPTSTR("-servern
9d10: 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 ame", servername
9d20: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 );..OPTSTR("-ses
9d30: 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f sion_id", sessio
9d40: 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 n_id);..OPTBOOL(
9d50: 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a "-ssl2", ssl2);.
9d60: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 .OPTBOOL("-ssl3"
9d70: 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f , ssl3);..OPTBOO
9d80: 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 L("-tls1", tls1)
9d90: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
9da0: 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 1.1", tls1_1);..
9db0: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 OPTBOOL("-tls1.2
9dc0: 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 ", tls1_2);..OPT
9dd0: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 BOOL("-tls1.3",
9de0: 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a tls1_3);..OPTOBJ
9df0: 28 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 ("-validatecomma
9e00: 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 nd", vcmd);..OPT
9e10: 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d OBJ("-vcmd", vcm
9e20: 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 d);...OPTBAD("op
9e30: 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d tion", "-alpn, -
9e40: 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 cadir, -cafile,
9e50: 2d 63 61 73 74 6f 72 65 2c 20 2d 63 65 72 74 2c -castore, -cert,
9e60: 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 -certfile, -cip
9e70: 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 her, -ciphersuit
9e80: 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 es, -command, -d
9e90: 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d hparams, -key, -
9ea0: 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c keyfile, -model,
9eb0: 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 -password, -pos
9ec0: 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 t_handshake, -re
9ed0: 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c quest, -require,
9ee0: 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c -security_level
9ef0: 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 , -server, -serv
9f00: 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e ername, -session
9f10: 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c _id, -ssl2, -ssl
9f20: 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 3, -tls1, -tls1.
9f30: 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 1, -tls1.2, -tls
9f40: 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 1.3, or -validat
9f50: 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 ecommand");...re
9f60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9f70: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 }. if (re
9f80: 71 75 65 73 74 29 09 09 76 65 72 69 66 79 20 7c quest)..verify |
9f90: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 = SSL_VERIFY_CLI
9fa0: 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 ENT_ONCE | SSL_V
9fb0: 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 ERIFY_PEER;.
9fc0: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72 if (request && r
9fd0: 65 71 75 69 72 65 29 09 76 65 72 69 66 79 20 7c equire).verify |
9fe0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 = SSL_VERIFY_FAI
9ff0: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 L_IF_NO_PEER_CER
a000: 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 T;. if (reque
a010: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 st && post_hands
a020: 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 hake).verify |=
a030: 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f SSL_VERIFY_POST_
a040: 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 HANDSHAKE;. i
a050: 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 f (verify == 0).
a060: 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 .verify = SSL_VE
a070: 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 RIFY_NONE;..
a080: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f proto |= (ssl2 ?
a090: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 TLS_PROTO_SSL2
a0a0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
a0b0: 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 |= (ssl3 ? TLS_P
a0c0: 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a ROTO_SSL3 : 0);.
a0d0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
a0e0: 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 s1 ? TLS_PROTO_T
a0f0: 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 LS1 : 0);. pr
a100: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f oto |= (tls1_1 ?
a110: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
a120: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 1 : 0);. prot
a130: 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 o |= (tls1_2 ? T
a140: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 LS_PROTO_TLS1_2
a150: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
a160: 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 |= (tls1_3 ? TLS
a170: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 _PROTO_TLS1_3 :
a180: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 0);.. /* rese
a190: 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 t to NULL if bla
a1a0: 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 nk string provid
a1b0: 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 ed */. if (ce
a1c0: 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 rt && !*cert)..
a1d0: 20 20 20 20 20 20 20 63 65 72 74 09 20 20 20 20 cert.
a1e0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a1f0: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 if (key && !*key
a200: 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 ).. key.
a210: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a220: 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 if (certfile
a230: 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 && !*certfile)
a240: 20 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 certfile.
a250: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
a260: 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 keyfile && !*key
a270: 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 file)..keyfile.
a280: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a290: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26 if (ciphers &
a2a0: 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 & !*ciphers).
a2b0: 20 20 20 20 20 63 69 70 68 65 72 73 09 20 20 20 ciphers.
a2c0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
a2d0: 20 69 66 20 28 63 69 70 68 65 72 73 75 69 74 65 if (ciphersuite
a2e0: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 s && !*ciphersui
a2f0: 74 65 73 29 20 63 69 70 68 65 72 73 75 69 74 65 tes) ciphersuite
a300: 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 s = NULL;.
a310: 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 if (CAfile && !
a320: 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 *CAfile).
a330: 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 CAfile.
a340: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
a350: 43 41 70 61 74 68 20 26 26 20 21 2a 43 41 70 61 CApath && !*CApa
a360: 74 68 29 09 20 20 20 20 20 20 20 20 43 41 70 61 th). CApa
a370: 74 68 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c th. = NUL
a380: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 73 74 6f L;. if (CAsto
a390: 72 65 20 26 26 20 21 2a 43 41 73 74 6f 72 65 29 re && !*CAstore)
a3a0: 09 20 20 20 20 20 20 20 20 43 41 73 74 6f 72 65 . CAstore
a3b0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
a3c0: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d . if (DHparam
a3d0: 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 s && !*DHparams)
a3e0: 09 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d . DHparam
a3f0: 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b s = NULL;
a400: 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c .. /* new SSL
a410: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 state */. st
a420: 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 atePtr..= (State
a430: 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 *) ckalloc((uns
a440: 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 igned) sizeof(St
a450: 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 ate));. memse
a460: 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 t(statePtr, 0, s
a470: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a izeof(State));..
a480: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c statePtr->fl
a490: 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 ags.= flags;.
a4a0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
a4b0: 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 p.= interp;.
a4c0: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 statePtr->vflags
a4d0: 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 .= verify;. s
a4e0: 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 tatePtr->err.= "
a4f0: 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 ";.. /* alloc
a500: 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 ate script */.
a510: 20 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a if (script) {.
a520: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 .(void) Tcl_GetS
a530: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 tringFromObj(scr
a540: 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 ipt, &len);..if
a550: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 (len) {.. sta
a560: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
a570: 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 = script;.. T
a580: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
a590: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
a5a0: 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ck);..}. }..
a5b0: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 /* allocate p
a5c0: 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 assword */. i
a5d0: 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 f (password) {..
a5e0: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 (void) Tcl_GetSt
a5f0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 ringFromObj(pass
a600: 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 word, &len);..if
a610: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 (len) {.. st
a620: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
a630: 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 = password;..
a640: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
a650: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 nt(statePtr->pas
a660: 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d sword);..}. }
a670: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 .. /* allocat
a680: 65 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 e validate comma
a690: 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 nd */. if (vc
a6a0: 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 md) {..(void) Tc
a6b0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
a6c0: 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a bj(vcmd, &len);.
a6d0: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 .if (len) {..
a6e0: 20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 statePtr->vcmd
a6f0: 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c = vcmd;.. Tcl
a700: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _IncrRefCount(st
a710: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 atePtr->vcmd);..
a720: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 }. }.. if
a730: 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 (model != NULL)
a740: 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a {..int mode;../*
a750: 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 Get the "model"
a760: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 context */..cha
a770: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
a780: 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c el(interp, model
a790: 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 , &mode);..if (c
a7a0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
a7b0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 nel) NULL) {..
a7c0: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f Tls_Free((tls_
a7d0: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 free_type *) sta
a7e0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
a7f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
a800: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 }.../*.. * Make
a810: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
a820: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
a830: 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 hannel.. */..cha
a840: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
a850: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 annel(chan);..if
a860: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
a870: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
a880: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
a890: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
a8a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
a8b0: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
a8c0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
a8d0: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 lName(chan),..."
a8e0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
a8f0: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 annel", (char *)
a900: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c NULL);.. Tcl
a910: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
a920: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
a930: 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 PORT", "CHANNEL"
a940: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
a950: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
a960: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f Tls_Free((tls_
a970: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 free_type *) sta
a980: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
a990: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
a9a0: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 }..ctx = ((State
a9b0: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *)Tcl_GetChanne
a9c0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
a9d0: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d an))->ctx;. }
a9e0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 else {..if ((ct
a9f0: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 x = CTX_Init(sta
aa00: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 tePtr, server, p
aa10: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 roto, keyfile, c
aa20: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 ertfile, key, ce
aa30: 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 rt, key_len,..
aa40: 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61 cert_len, CApa
aa50: 74 68 2c 20 43 41 73 74 6f 72 65 2c 20 43 41 66 th, CAstore, CAf
aa60: 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 ile, ciphers, ci
aa70: 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 phersuites, leve
aa80: 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d l, DHparams)) ==
aa90: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c NULL) {.. Tl
aaa0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 s_Free((tls_free
aab0: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 _type *) statePt
aac0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
aad0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
aae0: 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 }.. statePt
aaf0: 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 r->ctx = ctx;..
ab00: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 /*. * We
ab10: 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 need to make sur
ab20: 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e e that the chann
ab30: 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 el works in bina
ab40: 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 ry (for the.
ab50: 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f * encryption no
ab60: 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 t to get goofed
ab70: 75 70 29 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 up).. */.
ab80: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
ab90: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 (&upperChannelTr
aba0: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 anslation);.
abb0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
abc0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f &upperChannelBlo
abd0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f cking);. Tcl_
abe0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 DStringInit(&upp
abf0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
ac00: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
ac10: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
ac20: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 nnelEncoding);.
ac30: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
ac40: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
ac50: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 chan, "-eofchar"
ac60: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 , &upperChannelE
ac70: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c OFChar);. Tcl
ac80: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
ac90: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
aca0: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 "-encoding", &up
acb0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
acc0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ng);. Tcl_Get
acd0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
ace0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 terp, chan, "-tr
acf0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 anslation", &upp
ad00: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
ad10: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 tion);. Tcl_G
ad20: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
ad30: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
ad40: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 blocking", &uppe
ad50: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
ad60: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
ad70: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
ad80: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e rp, chan, "-tran
ad90: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 slation", "binar
ada0: 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 y");. Tcl_Set
adb0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
adc0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c terp, chan, "-bl
add0: 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 ocking", "true")
ade0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 ;. dprintf("C
adf0: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 onsuming Tcl cha
ae00: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 nnel %s", Tcl_Ge
ae10: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
ae20: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 n));. statePt
ae30: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 r->self = Tcl_St
ae40: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 ackChannel(inter
ae50: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 p, Tls_ChannelTy
ae60: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 pe(), (ClientDat
ae70: 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54 a) statePtr,..(T
ae80: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 CL_READABLE | TC
ae90: 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 L_WRITABLE), cha
aea0: 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 n);. dprintf(
aeb0: 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c "Created channel
aec0: 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f named %s", Tcl_
aed0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
aee0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b tatePtr->self));
aef0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
af00: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f r->self == (Tcl_
af10: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
af20: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 ../*.. * No use
af30: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c of Tcl_Eventuall
af40: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f yFree because no
af50: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 possible Tcl_Pr
af60: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c eserve... */..Tl
af70: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 s_Free((tls_free
af80: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 _type *) statePt
af90: 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 r);..Tcl_DString
afa0: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e Free(&upperChann
afb0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
afc0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
afd0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e (&upperChannelEn
afe0: 63 6f 64 69 6e 67 29 3b 0a 09 54 63 6c 5f 44 53 coding);..Tcl_DS
aff0: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
b000: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
b010: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
b020: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 e(&upperChannelB
b030: 6c 6f 63 6b 69 6e 67 29 3b 0a 09 72 65 74 75 72 locking);..retur
b040: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
b050: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 }.. Tcl_SetC
b060: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
b070: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
b080: 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 elf, "-translati
b090: 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 on", Tcl_DString
b0a0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
b0b0: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 nelTranslation))
b0c0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
b0d0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
b0e0: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
b0f0: 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 f, "-encoding",
b100: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
b110: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e (&upperChannelEn
b120: 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 coding));. Tc
b130: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
b140: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 on(interp, state
b150: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 Ptr->self, "-eof
b160: 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 char", Tcl_DStri
b170: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
b180: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a annelEOFChar));.
b190: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
b1a0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
b1b0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c statePtr->self,
b1c0: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 "-blocking", Tc
b1d0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
b1e0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
b1f0: 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f king));. Tcl_
b200: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 DStringFree(&upp
b210: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
b220: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 tion);. Tcl_D
b230: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 StringFree(&uppe
b240: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
b250: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
b260: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 ngFree(&upperCha
b270: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 nnelEOFChar);.
b280: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
b290: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 e(&upperChannelB
b2a0: 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f locking);.. /
b2b0: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 *. * SSL Ini
b2c0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 tialization.
b2d0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
b2e0: 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 ->ssl = SSL_new(
b2f0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a statePtr->ctx);.
b300: 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 if (!statePt
b310: 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 r->ssl) {../* SS
b320: 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 L library error
b330: 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 */..Tcl_AppendRe
b340: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f sult(interp, "co
b350: 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 uldn't construct
b360: 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c ssl session: ",
b370: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
b380: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
b390: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
b3a0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
b3b0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
b3c0: 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 , "INIT", "FAILE
b3d0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
b3e0: 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 74 L);..Tls_Free((t
b3f0: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 ls_free_type *)
b400: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 statePtr);..retu
b410: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
b420: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 }.. /* Set
b430: 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 host server name
b440: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 */. if (serv
b450: 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 ername) {../* Se
b460: 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 ts the server na
b470: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 me indication (S
b480: 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c NI) in ClientHel
b490: 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a lo extension */.
b4a0: 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 ./* Per RFC 6066
b4b0: 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 , hostname is a
b4c0: 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 ASCII encoded st
b4d0: 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43 ring, though RFC
b4e0: 20 34 33 36 36 20 73 61 79 73 20 55 54 46 2d 38 4366 says UTF-8
b4f0: 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 . */..if (!SSL_s
b500: 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e et_tlsext_host_n
b510: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ame(statePtr->ss
b520: 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 l, servername) &
b530: 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 & require) {..
b540: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
b550: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 lt(interp, "Set
b560: 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 SNI extension fa
b570: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 iled: ", GET_ERR
b580: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 _REASON(), (char
b590: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
b5a0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
b5b0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
b5c0: 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c "IMPORT", "SNI",
b5d0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
b5e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
b5f0: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 Tls_Free((tls_fr
b600: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 ee_type *) state
b610: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
b620: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
b630: 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d ../* Set hostnam
b640: 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 e for peer certi
b650: 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 ficate hostname
b660: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 verification in
b670: 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e clients... Don
b680: 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 't use SSL_set1_
b690: 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68 61 host since it ha
b6a0: 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a s limitations. *
b6b0: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 /..if (!SSL_add1
b6c0: 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e _host(statePtr->
b6d0: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 ssl, servername)
b6e0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
b6f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
b700: 2c 20 22 53 65 74 20 44 4e 53 20 68 6f 73 74 6e , "Set DNS hostn
b710: 61 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 ame failed: ", G
b720: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
b730: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b740: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
b750: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
b760: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
b770: 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 "HOSTNAME", "FAI
b780: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
b790: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
b7a0: 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 ree((tls_free_ty
b7b0: 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b pe *) statePtr);
b7c0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
b7d0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
b7e0: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 .. /* Resume
b7f0: 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 session id */.
b800: 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 if (session_id
b810: 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 && strlen(sessi
b820: 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 on_id) <= SSL_MA
b830: 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 X_SID_CTX_LENGTH
b840: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f ) {../* SSL_set_
b850: 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 session() */..if
b860: 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 (!SSL_SESSION_s
b870: 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 et1_id_context(S
b880: 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 SL_get_session(s
b890: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 0a 09 tatePtr->ssl),..
b8a0: 09 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 .(const unsigned
b8b0: 20 63 68 61 72 20 2a 29 20 73 65 73 73 69 6f 6e char *) session
b8c0: 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 _id, (unsigned i
b8d0: 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69 nt) strlen(sessi
b8e0: 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20 on_id))) {..
b8f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
b900: 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65 (interp, "Resume
b910: 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64 3a session failed:
b920: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 ", GET_ERR_REAS
b930: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
b940: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 ULL);.. Tcl_S
b950: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
b960: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
b970: 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 RT", "SESSION",
b980: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
b990: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b9a0: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 ls_Free((tls_fre
b9b0: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 e_type *) stateP
b9c0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
b9d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
b9e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 }.. /* Ena
b9f0: 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d ble Application-
ba00: 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e Layer Protocol N
ba10: 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d egotiation. Exam
ba20: 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f 31 ples are: http/1
ba30: 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 .0,..http/1.1, h
ba40: 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2, h3, ftp, imap
ba50: 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 , pop3, xmpp-cli
ba60: 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 ent, xmpp-server
ba70: 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 63 , mqtt, irc, etc
ba80: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 . */. if (alp
ba90: 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 n) {../* Convert
baa0: 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f a TCL list into
bab0: 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 a protocol-list
bac0: 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 in wire-format
bad0: 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 */..unsigned cha
bae0: 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 r *protos, *p;..
baf0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f unsigned int pro
bb00: 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 tos_len = 0;..Tc
bb10: 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 l_Size cnt, i;..
bb20: 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 int j;..Tcl_Obj
bb30: 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 **list;...if (Tc
bb40: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d l_ListObjGetElem
bb50: 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 ents(interp, alp
bb60: 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 n, &cnt, &list)
bb70: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
bb80: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f Tls_Free((tls_
bb90: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 free_type *) sta
bba0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
bbb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
bbc0: 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 }.../* Determine
bbd0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 the memory requ
bbe0: 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f ired for the pro
bbf0: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 tocol-list */..f
bc00: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 or (i = 0; i < c
bc10: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 nt; i++) {..
bc20: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
bc30: 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c mObj(list[i], &l
bc40: 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 en);.. if (le
bc50: 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c n > 255) {...Tcl
bc60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
bc70: 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 terp, "ALPN prot
bc80: 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 6c ocol names too l
bc90: 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ong", (char *) N
bca0: 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 ULL);...Tcl_SetE
bcb0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
bcc0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
bcd0: 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 , "ALPN", "FAILE
bce0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
bcf0: 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 L);...Tls_Free((
bd00: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 tls_free_type *)
bd10: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 statePtr);...re
bd20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
bd30: 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 . }.. prot
bd40: 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 os_len += 1 + (i
bd50: 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a nt) len;..}.../*
bd60: 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c Build the compl
bd70: 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 ete protocol-lis
bd80: 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 t */..protos = c
bd90: 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 kalloc(protos_le
bda0: 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c n);../* protocol
bdb0: 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f -lists consist o
bdc0: 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 f 8-bit length-p
bdd0: 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 refixed, byte st
bde0: 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a rings */..for (j
bdf0: 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 = 0, p = protos
be00: 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 ; j < cnt; j++)
be10: 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 {.. char *str
be20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
be30: 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c FromObj(list[j],
be40: 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b &len);.. *p+
be50: 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 + = (unsigned ch
be60: 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 ar) len;.. me
be70: 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 mcpy(p, str, (si
be80: 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 ze_t) len);..
be90: 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 p += len;..}...
bea0: 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f /* SSL_set_alpn_
beb0: 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 protos makes a c
bec0: 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f opy of the proto
bed0: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 col-list */../*
bee0: 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 Note: This funct
bef0: 69 6f 6e 20 72 65 76 65 72 73 65 73 20 74 68 65 ion reverses the
bf00: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f return value co
bf10: 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 nvention */..if
bf20: 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 (SSL_set_alpn_pr
bf30: 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 otos(statePtr->s
bf40: 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 sl, protos, prot
bf50: 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 os_len)) {..
bf60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
bf70: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c (interp, "Set AL
bf80: 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 PN protocols fai
bf90: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f led: ", GET_ERR_
bfa0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
bfb0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
bfc0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
bfd0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
bfe0: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c IMPORT", "ALPN",
bff0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
c000: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
c010: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 Tls_Free((tls_fr
c020: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 ee_type *) state
c030: 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 Ptr);.. ckfre
c040: 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 e(protos);..
c050: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
c060: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 ;..}.../* Store
c070: 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a protocols list *
c080: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f /..statePtr->pro
c090: 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 tos = protos;..s
c0a0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f tatePtr->protos_
c0b0: 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e len = protos_len
c0c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
c0d0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
c0e0: 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 = NULL;..stateP
c0f0: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d tr->protos_len =
c100: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 0;. }.. /
c110: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c *. * SSL Cal
c120: 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 lbacks. */.
c130: 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 SSL_set_app_d
c140: 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ata(statePtr->ss
c150: 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 l, (void *)state
c160: 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 Ptr);./* point b
c170: 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 ack to us */.
c180: 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 SSL_set_verify(
c190: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 statePtr->ssl, v
c1a0: 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c erify, VerifyCal
c1b0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 2f 2a 53 53 lback);. /*SS
c1c0: 4c 5f 73 65 74 5f 76 65 72 69 66 79 5f 64 65 70 L_set_verify_dep
c1d0: 74 68 28 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 th(SSL_set_verif
c1e0: 79 5f 64 65 70 74 68 2c 20 30 29 3b 2a 2f 0a 20 y_depth, 0);*/.
c1f0: 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f SSL_set_info_
c200: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 callback(statePt
c210: 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c r->ssl, InfoCall
c220: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 back);.. /* C
c230: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 allback for obse
c240: 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d rving protocol m
c250: 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 essages */.#ifnd
c260: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ef OPENSSL_NO_SS
c270: 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 L_TRACE. /* v
c280: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f oid SSL_CTX_set_
c290: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 msg_callback_arg
c2a0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c2b0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
c2c0: 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f );. void SSL_
c2d0: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c CTX_set_msg_call
c2e0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 back(statePtr->c
c2f0: 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 tx, MessageCallb
c300: 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c ack); */. SSL
c310: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 _set_msg_callbac
c320: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e k_arg(statePtr->
c330: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ssl, (void *)sta
c340: 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f tePtr);. SSL_
c350: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
c360: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c370: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 MessageCallback)
c380: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a ;.#endif.. /*
c390: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e Create Tcl_Chan
c3a0: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 nel BIO Handler
c3b0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
c3c0: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 >p_bio.= BIO_new
c3d0: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 _tcl(statePtr, B
c3e0: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 IO_NOCLOSE);.
c3f0: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d statePtr->bio.=
c400: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 BIO_new(BIO_f_s
c410: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 sl());.. if (
c420: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 server) {../* Se
c430: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a rver callbacks *
c440: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 /..SSL_CTX_set_t
c450: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 lsext_servername
c460: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 _arg(statePtr->c
c470: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 tx, (void *)stat
c480: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f ePtr);..SSL_CTX_
c490: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 set_tlsext_serve
c4a0: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 rname_callback(s
c4b0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e tatePtr->ctx, SN
c4c0: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c ICallback);..SSL
c4d0: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
c4e0: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 hello_cb(statePt
c4f0: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c r->ctx, HelloCal
c500: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 lback, (void *)s
c510: 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 tatePtr);..if (s
c520: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
c530: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
c540: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e SSL_CTX_set_alpn
c550: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 _select_cb(state
c560: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 Ptr->ctx, ALPNCa
c570: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
c580: 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 statePtr);.#ifde
c590: 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 f USE_NPN.. i
c5a0: 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 f (tls1_2 == 0 &
c5b0: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b & tls1_3 == 0) {
c5c0: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e ...SSL_CTX_set_n
c5d0: 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 ext_protos_adver
c5e0: 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 tised_cb(statePt
c5f0: 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 r->ctx, NPNCallb
c600: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ack, (void *)sta
c610: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 tePtr);.. }.#
c620: 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e endif..}.../* En
c630: 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 able server to s
c640: 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74 end cert request
c650: 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 after handshake
c660: 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 (TLS 1.3 only)
c670: 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f */../* A write o
c680: 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 peration must ta
c690: 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 ke place for the
c6a0: 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71 Certificate Req
c6b0: 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 uest to be.. s
c6c0: 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e ent to the clien
c6d0: 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 t, this can be d
c6e0: 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f one with SSL_do_
c6f0: 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a handshake(). */.
c700: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 .if (request &&
c710: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 post_handshake &
c720: 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 & tls1_3) {..
c730: 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 SSL_verify_clie
c740: 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b nt_post_handshak
c750: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
c760: 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 ;..}.../* set au
c770: 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 tomatic curve se
c780: 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f lection */..SSL_
c790: 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 set_ecdh_auto(st
c7a0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b atePtr->ssl, 1);
c7b0: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 .../* Set server
c7c0: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 mode */..stateP
c7d0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 tr->flags |= TLS
c7e0: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 _TCL_SERVER;..SS
c7f0: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 L_set_accept_sta
c800: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
c810: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
c820: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 ./* Client callb
c830: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 acks */.#ifdef U
c840: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 SE_NPN..if (stat
c850: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
c860: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d NULL && tls1_2 =
c870: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d = 0 && tls1_3 ==
c880: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 0) {.. SSL_C
c890: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 TX_set_next_prot
c8a0: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 o_select_cb(stat
c8b0: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 ePtr->ctx, ALPNC
c8c0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
c8d0: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 )statePtr);..}.#
c8e0: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 endif.../* Sessi
c8f0: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 on caching */..S
c900: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 SL_CTX_set_sessi
c910: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 on_cache_mode(st
c920: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c atePtr->ctx, SSL
c930: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 _SESS_CACHE_CLIE
c940: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 NT | SSL_SESS_CA
c950: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f CHE_NO_INTERNAL_
c960: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 STORE);..SSL_CTX
c970: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 _sess_set_new_cb
c980: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c990: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 SessionCallback)
c9a0: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f ;.../* Enable po
c9b0: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 st handshake Aut
c9c0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 hentication exte
c9d0: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f nsion. TLS 1.3 o
c9e0: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e nly, not http/2.
c9f0: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 */..if (request
ca00: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 && post_handsha
ca10: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 ke) {.. SSL_s
ca20: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b et_post_handshak
ca30: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d e_auth(statePtr-
ca40: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f >ssl, 1);..}.../
ca50: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 * Set client mod
ca60: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f e */..SSL_set_co
ca70: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 nnect_state(stat
ca80: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
ca90: 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 }. SSL_set_bi
caa0: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c o(statePtr->ssl,
cab0: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
cac0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 , statePtr->p_bi
cad0: 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f o);. BIO_set_
cae0: 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 ssl(statePtr->bi
caf0: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c o, statePtr->ssl
cb00: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a , BIO_NOCLOSE);.
cb10: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 . /*. * E
cb20: 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 nd of SSL Init.
cb30: 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e */. dprin
cb40: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 tf("Returning %s
cb50: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
cb60: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
cb70: 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f self));. Tcl_
cb80: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
cb90: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 , (char *) Tcl_G
cba0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
cbb0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 atePtr->self), T
cbc0: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 CL_VOLATILE);..
cbd0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
cbe0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
cc30: 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a *. * UnimportObj
cc40: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
cc50: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
cc60: 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 nvoked to remove
cc70: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
cc80: 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a nnel filter.. *.
cc90: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
cca0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
ccb0: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
ccc0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 effects:. *.May
ccd0: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 modify the beha
cce0: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 vior of an IO ch
ccf0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d annel.. *. *----
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
cd40: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 */.static int.U
cd50: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c nimportObjCmd(Cl
cd60: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
cd70: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
cd80: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
cd90: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
cda0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
cdb0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
cdc0: 2c 20 63 68 69 6c 64 3b 09 2f 2a 20 54 68 65 20 , child;./* The
cdd0: 73 74 61 63 6b 65 64 20 61 6e 64 20 75 6e 64 65 stacked and unde
cde0: 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 73 20 rlying channels
cdf0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 */. Tcl_DStri
ce00: 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 ng upperChannelT
ce10: 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 ranslation, uppe
ce20: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
ce30: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e , upperChannelEn
ce40: 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 coding, upperCha
ce50: 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 nnelEOFChar;.
ce60: 20 69 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f 4f int res = TCL_O
ce70: 4b 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c K;. (void) cl
ce80: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 ientData;.. d
ce90: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
cea0: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
ceb0: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
cec0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
ced0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
cee0: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 nel");..return T
cef0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
cf00: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 . /* Validate
cf10: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 2a 2f channel name */
cf20: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
cf30: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
cf40: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
cf50: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 (objv[1]), NULL)
cf60: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
cf70: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
cf80: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
cf90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
cfa0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
cfb0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
cfc0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
cfd0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
cfe0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
cff0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
d000: 63 68 69 6c 64 20 3d 20 54 63 6c 5f 47 65 74 53 child = Tcl_GetS
d010: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 63 68 tackedChannel(ch
d020: 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 an);.. /* Ver
d030: 69 66 79 20 69 73 20 61 20 73 74 61 63 6b 65 64 ify is a stacked
d040: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
d050: 69 66 20 28 63 68 69 6c 64 20 3d 3d 20 4e 55 4c if (child == NUL
d060: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
d070: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
d080: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
d090: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
d0a0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
d0b0: 3a 20 6e 6f 74 20 61 20 73 74 61 63 6b 65 64 20 : not a stacked
d0c0: 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 channel", (char
d0d0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
d0e0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
d0f0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
d100: 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e UNIMPORT", "CHAN
d110: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c NEL", "INVALID",
d120: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d130: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
d140: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
d150: 2a 20 46 6c 75 73 68 20 61 6e 79 20 70 65 6e 64 * Flush any pend
d160: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 ing data */.
d170: 69 66 20 28 54 63 6c 5f 46 6c 75 73 68 28 63 68 if (Tcl_Flush(ch
d180: 61 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b an) != TCL_OK) {
d190: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
d1a0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
d1b0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
d1c0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
d1d0: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 slation);. Tc
d1e0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
d1f0: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
d200: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ing);. Tcl_DS
d210: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
d220: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
d230: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d240: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
d250: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 0a 20 20 elEncoding);..
d260: 20 20 2f 2a 20 47 65 74 20 63 75 72 72 65 6e 74 /* Get current
d270: 20 63 6f 6e 66 69 67 20 2d 20 45 4f 4c 20 74 72 config - EOL tr
d280: 61 6e 73 6c 61 74 69 6f 6e 2c 20 65 6e 63 6f 64 anslation, encod
d290: 69 6e 67 20 61 6e 64 20 62 75 66 66 65 72 69 6e ing and bufferin
d2a0: 67 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 73 68 g options are sh
d2b0: 61 72 65 64 20 62 65 74 77 65 65 6e 20 61 6c 6c ared between all
d2c0: 20 63 68 61 6e 6e 65 6c 73 20 69 6e 20 74 68 65 channels in the
d2d0: 20 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20 54 63 stack */. Tc
d2e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_GetChannelOpti
d2f0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
d300: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 "-blocking", &u
d310: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
d320: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 ing);. Tcl_Ge
d330: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
d340: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 nterp, chan, "-e
d350: 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 ncoding", &upper
d360: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
d370: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 ;. Tcl_GetCha
d380: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
d390: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 p, chan, "-eofch
d3a0: 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e ar", &upperChann
d3b0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 elEOFChar);.
d3c0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
d3d0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
d3e0: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
d3f0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
d400: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 0a 20 Translation);..
d410: 20 20 20 2f 2a 20 55 6e 73 74 61 63 6b 20 74 68 /* Unstack th
d420: 65 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20 72 65 e channel and re
d430: 73 74 6f 72 65 20 75 6e 64 65 72 6c 79 69 6e 67 store underlying
d440: 20 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 channel config
d450: 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 */. if (Tcl_U
d460: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e nstackChannel(in
d470: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 terp, chan) == T
d480: 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 65 CL_OK) {..Tcl_Se
d490: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
d4a0: 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c 20 22 2d nterp, child, "-
d4b0: 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 encoding", Tcl_D
d4c0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
d4d0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
d4e0: 67 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43 68 61 g));..Tcl_SetCha
d4f0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
d500: 70 2c 20 63 68 69 6c 64 2c 20 22 2d 65 6f 66 63 p, child, "-eofc
d510: 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e har", Tcl_DStrin
d520: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
d530: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 09 nnelEOFChar));..
d540: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
d550: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 69 tion(interp, chi
d560: 6c 64 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f ld, "-translatio
d570: 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 n", Tcl_DStringV
d580: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
d590: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b elTranslation));
d5a0: 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c ..Tcl_SetChannel
d5b0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
d5c0: 68 69 6c 64 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 hild, "-blocking
d5d0: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 ", Tcl_DStringVa
d5e0: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 lue(&upperChanne
d5f0: 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 lBlocking));.
d600: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
d610: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
d620: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d }.. /* Clean-
d630: 75 70 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 up */. Tcl_DS
d640: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
d650: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
d660: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 on);. Tcl_DSt
d670: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 ringFree(&upperC
d680: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b hannelEncoding);
d690: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d6a0: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e Free(&upperChann
d6b0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 elEOFChar);.
d6c0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
d6d0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f &upperChannelBlo
d6e0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 72 65 74 75 cking);. retu
d6f0: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 rn res;.}.../*.
d700: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
d710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d740: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 ----. *. * CTX_I
d750: 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 nit -- construct
d760: 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 a SSL_CTX insta
d770: 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 nce. *. * Result
d780: 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 s:. *.A valid SS
d790: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f L_CTX instance o
d7a0: 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 r NULL.. *. * Si
d7b0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 de effects:. *.c
d7c0: 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f onstructs SSL co
d7d0: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 ntext (CTX). *.
d7e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
d7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d820: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
d830: 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e SSL_CTX *.CTX_In
d840: 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 it(State *stateP
d850: 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 tr, int isServer
d860: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 , int proto, cha
d870: 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 r *keyfile, char
d880: 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 *certfile,.
d890: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b unsigned char *k
d8a0: 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ey, unsigned cha
d8b0: 72 20 2a 63 65 72 74 2c 20 54 63 6c 5f 53 69 7a r *cert, Tcl_Siz
d8c0: 65 20 6b 65 79 5f 6c 65 6e 2c 20 54 63 6c 5f 53 e key_len, Tcl_S
d8d0: 69 7a 65 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 ize cert_len, ch
d8e0: 61 72 20 2a 43 41 70 61 74 68 2c 0a 20 20 20 20 ar *CApath,.
d8f0: 63 68 61 72 20 2a 43 41 73 74 6f 72 65 2c 20 63 char *CAstore, c
d900: 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 har *CAfile, cha
d910: 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 r *ciphers, char
d920: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 *ciphersuites,
d930: 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 int level, char
d940: 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 *DHparams) {.
d950: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
d960: 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e erp = statePtr->
d970: 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f interp;. SSL_
d980: 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b CTX *ctx = NULL;
d990: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d9a0: 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 ds;. int off
d9b0: 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b = 0, abort = 0;
d9c0: 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 . int load_pr
d9d0: 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 ivate_key;. c
d9e0: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 onst SSL_METHOD
d9f0: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 *method;.. dp
da00: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
da10: 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f .. if (!proto
da20: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
da30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e esult(interp, "n
da40: 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c o valid protocol
da50: 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61 selected", (cha
da60: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
da70: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
da80: 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 . /* create S
da90: 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 SL context */.#i
daa0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
dab0: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 N_NUMBER >= 0x10
dac0: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 100000L || defin
dad0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 ed(NO_SSL2) || d
dae0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
daf0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 O_SSL2). if (
db00: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
db10: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 LS_PROTO_SSL2))
db20: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
db30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c ult(interp, "SSL
db40: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 2 protocol not s
db50: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
db60: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
db70: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
db80: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
db90: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 d(NO_SSL3) || de
dba0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
dbb0: 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 _SSL3). if (E
dbc0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
dbd0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b S_PROTO_SSL3)) {
dbe0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
dbf0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 lt(interp, "SSL3
dc00: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
dc10: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
dc20: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
dc30: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
dc40: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
dc50: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 (NO_TLS1) || def
dc60: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
dc70: 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e TLS1). if (EN
dc80: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
dc90: 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a _PROTO_TLS1)) {.
dca0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
dcb0: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
dcc0: 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .0 protocol not
dcd0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
dce0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
dcf0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
dd00: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
dd10: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
dd20: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
dd30: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 _NO_TLS1_1).
dd40: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
dd50: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
dd60: 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 1_1)) {..Tcl_App
dd70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
dd80: 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f , "TLS 1.1 proto
dd90: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
dda0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
ddb0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
ddc0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
ddd0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
dde0: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_2) || defined
ddf0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
de00: 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 _2). if (ENAB
de10: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
de20: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a ROTO_TLS1_2)) {.
de30: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
de40: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
de50: 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .2 protocol not
de60: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
de70: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
de80: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
de90: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
dea0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c ed(NO_TLS1_3) ||
deb0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
dec0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 _NO_TLS1_3).
ded0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
dee0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
def0: 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 1_3)) {..Tcl_App
df00: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
df10: 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f , "TLS 1.3 proto
df20: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
df30: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
df40: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
df50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 ;. }.#endif.
df60: 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 if (proto ==
df70: 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 0) {../* Use ful
df80: 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f l range */..SSL_
df90: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 CTX_set_min_prot
dfa0: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 o_version(ctx, 0
dfb0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
dfc0: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f max_proto_versio
dfd0: 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d n(ctx, 0);. }
dfe0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72 .. switch (pr
dff0: 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 oto) {.#if OPENS
e000: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
e010: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 R < 0x10100000L
e020: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 && !defined(NO_S
e030: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL2) && !defined
e040: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
e050: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
e060: 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 ROTO_SSL2:..meth
e070: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
e080: 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 SSLv2_server_met
e090: 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c hod() : SSLv2_cl
e0a0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
e0b0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
e0c0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
e0d0: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
e0e0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
e0f0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
e100: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 NSSL_NO_SSL3_MET
e110: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c HOD). case TL
e120: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d S_PROTO_SSL3:..m
e130: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
e140: 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f ? SSLv3_server_
e150: 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 method() : SSLv3
e160: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
e170: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
e180: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
e190: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e _TLS1) && !defin
e1a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e1b0: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
e1c0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
e1d0: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 METHOD). case
e1e0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a TLS_PROTO_TLS1:
e1f0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
e200: 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 ver ? TLSv1_serv
e210: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c er_method() : TL
e220: 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f Sv1_client_metho
e230: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
e240: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
e250: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 (NO_TLS1_1) && !
e260: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e270: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
e280: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e290: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 O_TLS1_1_METHOD)
e2a0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
e2b0: 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 OTO_TLS1_1:..met
e2c0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
e2d0: 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f TLSv1_1_server_
e2e0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 method() : TLSv1
e2f0: 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 _1_client_method
e300: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
e310: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
e320: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
e330: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e340: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
e350: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e360: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a _TLS1_2_METHOD).
e370: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
e380: 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 TO_TLS1_2:..meth
e390: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
e3a0: 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d TLSv1_2_server_m
e3b0: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f ethod() : TLSv1_
e3c0: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 2_client_method(
e3d0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
e3e0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
e3f0: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 O_TLS1_3) && !de
e400: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e410: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 _TLS1_3). cas
e420: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
e430: 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 _3:../* Use the
e440: 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 generic method a
e450: 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 nd constraint ra
e460: 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 nge after contex
e470: 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a t is created */.
e480: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
e490: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f er ? TLS_server_
e4a0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 method() : TLS_c
e4b0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
e4c0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 .break;.#endif.
e4d0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 default:../*
e4e0: 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 Negotiate highes
e4f0: 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f t available SSL/
e500: 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 TLS version */..
e510: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
e520: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d r ? TLS_server_m
e530: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c ethod() : TLS_cl
e540: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 ient_method();.#
e550: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
e560: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
e570: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 100000L && !defi
e580: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 ned(NO_SSL2) &&
e590: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e5a0: 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c _NO_SSL2)..off |
e5b0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
e5c0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 , TLS_PROTO_SSL2
e5d0: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 ) ? 0 : SSL_OP
e5e0: 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 _NO_SSLv2);.#end
e5f0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
e600: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
e610: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
e620: 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 SSL3)..off |= (E
e630: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
e640: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 S_PROTO_SSL3)
e650: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
e660: 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 SSLv3);.#endif.#
e670: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
e680: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
e690: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
e6a0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
e6b0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
e6c0: 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 OTO_TLS1) ? 0
e6d0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
e6e0: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 1);.#endif.#if !
e6f0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
e700: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
e710: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
e720: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
e730: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
e740: 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 OTO_TLS1_1) ? 0
e750: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
e760: 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 1_1);.#endif.#if
e770: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
e780: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
e790: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
e7a0: 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 _2)..off |= (ENA
e7b0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
e7c0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 PROTO_TLS1_2) ?
e7d0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 0 : SSL_OP_NO_TL
e7e0: 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 Sv1_2);.#endif.#
e7f0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
e800: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
e810: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e820: 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 S1_3)..off |= (E
e830: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
e840: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 S_PROTO_TLS1_3)
e850: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
e860: 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 TLSv1_3);.#endif
e870: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a ..break;. }..
e880: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
e890: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 ror();.. ctx
e8a0: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 = SSL_CTX_new(me
e8b0: 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 thod);. if (!
e8c0: 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e ctx) {..return N
e8d0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
e8e0: 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 if (getenv(SSLKE
e8f0: 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 YLOGFILE)) {..SS
e900: 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 L_CTX_set_keylog
e910: 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b _callback(ctx, K
e920: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a eyLogCallback);.
e930: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 }..#if !defi
e940: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
e950: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
e960: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
e970: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 if (proto == T
e980: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
e990: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
e9a0: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f min_proto_versio
e9b0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
e9c0: 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 RSION);..SSL_CTX
e9d0: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 _set_max_proto_v
e9e0: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
e9f0: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 _3_VERSION);.
ea00: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f }.#endif.. /
ea10: 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 * Force cipher s
ea20: 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 election order b
ea30: 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 y server */.
ea40: 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b if (!isServer) {
ea50: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 ..SSL_CTX_set_op
ea60: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
ea70: 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f P_CIPHER_SERVER_
ea80: 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 PREFERENCE);.
ea90: 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f }..#if OPENSSL_
eaa0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
eab0: 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 0x10100000L.
eac0: 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c OpenSSL_add_all
ead0: 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f _algorithms(); /
eae0: 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 * Load ciphers a
eaf0: 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 nd digests */.#e
eb00: 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 ndif.. SSL_CT
eb10: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 X_set_app_data(c
eb20: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 tx, (void*)inter
eb30: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 p);./* remember
eb40: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
eb50: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
eb60: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
eb70: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 SSL_OP_ALL);./*
eb80: 45 6e 61 62 6c 65 20 61 6c 6c 20 53 53 4c 20 62 Enable all SSL b
eb90: 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a ug workarounds *
eba0: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 /. SSL_CTX_se
ebb0: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 t_options(ctx, S
ebc0: 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 SL_OP_NO_COMPRES
ebd0: 53 49 4f 4e 29 3b 09 2f 2a 20 44 69 73 61 62 6c SION);./* Disabl
ebe0: 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76 e compression ev
ebf0: 65 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 20 en if supported
ec00: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
ec10: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
ec20: 6f 66 66 29 3b 09 09 2f 2a 20 44 69 73 61 62 6c off);../* Disabl
ec30: 65 20 73 70 65 63 69 66 69 65 64 20 70 72 6f 74 e specified prot
ec40: 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f ocol versions */
ec50: 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 20 77 .. /* Allow w
ec60: 72 69 74 65 73 20 74 6f 20 72 65 70 6f 72 74 20 rites to report
ec70: 73 75 63 63 65 73 73 20 77 68 65 6e 20 6c 65 73 success when les
ec80: 73 20 74 68 61 6e 20 61 6c 6c 20 72 65 63 6f 72 s than all recor
ec90: 64 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 ds have been wri
eca0: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f tten */. SSL_
ecb0: 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 CTX_set_mode(ctx
ecc0: 2c 20 53 53 4c 5f 4d 4f 44 45 5f 45 4e 41 42 4c , SSL_MODE_ENABL
ecd0: 45 5f 50 41 52 54 49 41 4c 5f 57 52 49 54 45 29 E_PARTIAL_WRITE)
ece0: 3b 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 62 6c ;.. /* Disabl
ecf0: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 74 72 e attempts to tr
ed00: 79 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 y to process the
ed10: 20 6e 65 78 74 20 72 65 63 6f 72 64 20 69 6e 73 next record ins
ed20: 74 65 61 64 20 6f 66 20 72 65 74 75 72 6e 69 6e tead of returnin
ed30: 67 20 61 66 74 65 72 20 61 0a 20 20 20 20 20 20 g after a.
ed40: 20 6e 6f 6e 2d 61 70 70 20 72 65 63 6f 72 64 2e non-app record.
ed50: 20 41 76 6f 69 64 73 20 68 61 6e 67 73 20 69 6e Avoids hangs in
ed60: 20 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 blocking mode,
ed70: 77 68 65 6e 20 75 73 69 6e 67 20 53 53 4c 5f 72 when using SSL_r
ed80: 65 61 64 28 29 20 61 6e 64 20 61 0a 20 20 20 20 ead() and a.
ed90: 20 20 20 6e 6f 6e 2d 61 70 70 6c 69 63 61 74 69 non-applicati
eda0: 6f 6e 20 72 65 63 6f 72 64 20 77 61 73 20 73 65 on record was se
edb0: 6e 74 20 61 6e 64 20 6e 6f 20 61 70 70 6c 69 63 nt and no applic
edc0: 61 74 69 6f 6e 20 64 61 74 61 20 77 61 73 20 73 ation data was s
edd0: 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f ent. */. SSL_
ede0: 43 54 58 5f 63 6c 65 61 72 5f 6d 6f 64 65 28 63 CTX_clear_mode(c
edf0: 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 tx, SSL_MODE_AUT
ee00: 4f 5f 52 45 54 52 59 29 3b 0a 0a 20 20 20 20 53 O_RETRY);.. S
ee10: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f SL_CTX_sess_set_
ee20: 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 cache_size(ctx,
ee30: 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 128);.. /* Se
ee40: 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 t user defined c
ee50: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 iphers, cipher s
ee60: 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 uites, and secur
ee70: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 ity level */.
ee80: 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d if ((ciphers !=
ee90: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 NULL) && !SSL_C
eea0: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 TX_set_cipher_li
eeb0: 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 st(ctx, ciphers)
eec0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
eed0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
eee0: 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 et ciphers faile
eef0: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 d: No valid ciph
ef00: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ers", (char *) N
ef10: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
ef20: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
ef30: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 n NULL;. }.
ef40: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69 if ((ciphersui
ef50: 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 tes != NULL) &&
ef60: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 !SSL_CTX_set_cip
ef70: 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 hersuites(ctx, c
ef80: 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a iphersuites)) {.
ef90: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
efa0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 t(interp, "Set c
efb0: 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69 ipher suites fai
efc0: 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 led: No valid ci
efd0: 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 phers", (char *)
efe0: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
eff0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
f000: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
f010: 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 . /* Set secu
f020: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 rity level */.
f030: 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 if (level > -1
f040: 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b && level < 6) {
f050: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 ../* SSL_set_sec
f060: 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 urity_level */..
f070: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 SSL_CTX_set_secu
f080: 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 rity_level(ctx,
f090: 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 level);. }..
f0a0: 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 /* set some c
f0b0: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 allbacks */.
f0c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 SSL_CTX_set_defa
f0d0: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 ult_passwd_cb(ct
f0e0: 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 x, PasswordCallb
f0f0: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 ack);. SSL_CT
f100: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 X_set_default_pa
f110: 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 sswd_cb_userdata
f120: 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 (ctx, (void *)st
f130: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a atePtr);.. /*
f140: 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 read a Diffie-H
f150: 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 ellman parameter
f160: 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 s file, or use t
f170: 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 he built-in one
f180: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 */. Tcl_DStri
f190: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 23 69 66 ngInit(&ds);.#if
f1a0: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 def OPENSSL_NO_D
f1b0: 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 H. if (DHpara
f1c0: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 ms != NULL) {..T
f1d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
f1e0: 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 interp, "DH para
f1f0: 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f meter support no
f200: 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 t available", (c
f210: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 har *) NULL);..S
f220: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
f230: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
f240: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 }.#else.
f250: 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 {..DH* dh;..if (
f260: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c DHparams != NULL
f270: 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 ) {.. BIO *bi
f280: 6f 3b 0a 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 o;... bio = B
f290: 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 IO_new_file(F2N(
f2a0: 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 DHparams, &ds),
f2b0: 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 "r");.. if (!
f2c0: 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 bio) {...Tcl_DSt
f2d0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
f2e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
f2f0: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 t(interp, "Could
f300: 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 not find DH par
f310: 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 ameters file", (
f320: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
f330: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
f340: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c x);...return NUL
f350: 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 L;.. }...
f360: 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 dh = PEM_read_bi
f370: 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 o_DHparams(bio,
f380: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c NULL, NULL, NULL
f390: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 );.. BIO_free
f3a0: 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f (bio);.. Tcl_
f3b0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
f3c0: 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20 ;.. if (!dh)
f3d0: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {...Tcl_AppendRe
f3e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f sult(interp, "Co
f3f0: 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 uld not read DH
f400: 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 parameters from
f410: 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 file", (char *)
f420: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
f430: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
f440: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
f450: 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 }.. SSL_CTX_s
f460: 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 et_tmp_dh(ctx, d
f470: 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65 h);.. DH_free
f480: 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b (dh);...} else {
f490: 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c .. /* Use wel
f4a0: 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d l known DH param
f4b0: 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65 20 eters that have
f4c0: 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 built-in support
f4d0: 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 in OpenSSL */..
f4e0: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 if (!SSL_CTX
f4f0: 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 _set_dh_auto(ctx
f500: 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 , 1)) {...Tcl_Ap
f510: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f520: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e p, "Could not en
f530: 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f able set DH auto
f540: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
f550: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
f560: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
f570: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
f580: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
f590: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 }..}. }.#endi
f5a0: 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 f.. /* set ou
f5b0: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f r certificate */
f5c0: 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 . load_privat
f5d0: 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 e_key = 0;. i
f5e0: 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e f (certfile != N
f5f0: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 ULL) {..load_pri
f600: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 vate_key = 1;...
f610: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f if (SSL_CTX_use_
f620: 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 certificate_file
f630: 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 (ctx, F2N(certfi
f640: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 le, &ds), SSL_FI
f650: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 LETYPE_PEM) <= 0
f660: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 ) {.. Tcl_DSt
f670: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
f680: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
f690: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e sult(interp, "un
f6a0: 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 able to set cert
f6b0: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 ificate file ",
f6c0: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a certfile, ": ",.
f6d0: 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e ..GET_ERR_REASON
f6e0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
f6f0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
f700: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
f710: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d return NULL;..}
f720: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
f730: 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d 20 65 e(&ds);.. } e
f740: 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 lse if (cert !=
f750: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 NULL) {..load_pr
f760: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 ivate_key = 1;..
f770: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f if (SSL_CTX_use_
f780: 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 certificate_ASN1
f790: 28 63 74 78 2c 20 28 69 6e 74 29 20 63 65 72 74 (ctx, (int) cert
f7a0: 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 _len, cert) <= 0
f7b0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
f7c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
f7d0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 , "unable to set
f7e0: 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c certificate: ",
f7f0: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f ...GET_ERR_REASO
f800: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
f810: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
f820: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
f830: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 return NULL;..
f840: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 }. } else {..
f850: 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72 certfile = (char
f860: 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 *)X509_get_defau
f870: 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a lt_cert_file();.
f880: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 ..if (SSL_CTX_us
f890: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 e_certificate_fi
f8a0: 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65 le(ctx, certfile
f8b0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 , SSL_FILETYPE_P
f8c0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 EM) <= 0) {.#if
f8d0: 30 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 0.. Tcl_Appen
f8e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
f8f0: 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 "unable to use d
f900: 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 efault certifica
f910: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 te file ", certf
f920: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 ile, ": ",...GET
f930: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
f940: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
f950: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
f960: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 (ctx);.. retu
f970: 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a rn NULL;.#endif.
f980: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
f990: 20 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 set our private
f9a0: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 key */. if (
f9b0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 load_private_key
f9c0: 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 ) {..if (keyfile
f9d0: 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 == NULL && key
f9e0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 == NULL) {..
f9f0: 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 keyfile = certfi
fa00: 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 le;..}...if (key
fa10: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
fa20: 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 . /* get the
fa30: 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f private key asso
fa40: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 ciated with this
fa50: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a certificate */.
fa60: 09 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 . if (keyfile
fa70: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 == NULL) {...ke
fa80: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 yfile = certfile
fa90: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 ;.. }... i
faa0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 f (SSL_CTX_use_P
fab0: 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 rivateKey_file(c
fac0: 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c tx, F2N(keyfile,
fad0: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 &ds), SSL_FILET
fae0: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b YPE_PEM) <= 0) {
faf0: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ...Tcl_DStringFr
fb00: 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c ee(&ds);.../* fl
fb10: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 ush the passphra
fb20: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 se which might b
fb30: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 e left in the re
fb40: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 sult */...Tcl_Se
fb50: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
fb60: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 NULL, TCL_STATIC
fb70: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 );...Tcl_AppendR
fb80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
fb90: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 nable to set pub
fba0: 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 lic key file ",
fbb0: 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 keyfile, " ",...
fbc0: 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41 53 GET_ERR_REAS
fbd0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
fbe0: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
fbf0: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
fc00: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d urn NULL;.. }
fc10: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
fc20: 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 gFree(&ds);...}
fc30: 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20 else if (key !=
fc40: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 NULL) {.. if
fc50: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 (SSL_CTX_use_Pri
fc60: 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 vateKey_ASN1(EVP
fc70: 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 _PKEY_RSA, ctx,
fc80: 6b 65 79 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c key, (int) key_l
fc90: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a en) <= 0) {.../*
fca0: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 flush the passp
fcb0: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 hrase which migh
fcc0: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 t be left in the
fcd0: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c result */...Tcl
fce0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
fcf0: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 p, NULL, TCL_STA
fd00: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 TIC);...Tcl_Appe
fd10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
fd20: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
fd30: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 public key: ", G
fd40: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
fd50: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
fd60: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
fd70: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e ctx);...return N
fd80: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 ULL;.. }..}..
fd90: 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 /* Now we know t
fda0: 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 hat a key and ce
fdb0: 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 rt have been set
fdc0: 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 against.. * the
fdd0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
fde0: 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 .if (!SSL_CTX_ch
fdf0: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 eck_private_key(
fe00: 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c ctx)) {.. Tcl
fe10: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
fe20: 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b terp, "private k
fe30: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 ey does not matc
fe40: 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 h the certificat
fe50: 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 e public key",..
fe60: 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 .. (char *)
fe70: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
fe80: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
fe90: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
fea0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
feb0: 2a 20 53 65 74 20 74 6f 20 75 73 65 20 74 68 65 * Set to use the
fec0: 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f default locatio
fed0: 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 n and file for C
fee0: 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f ertificate Autho
fef0: 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69 66 rity (CA) certif
ff00: 69 63 61 74 65 73 2e 0a 20 20 20 20 20 2a 20 54 icates.. * T
ff10: 68 65 20 64 65 66 61 75 6c 74 20 43 41 20 63 65 he default CA ce
ff20: 72 74 69 66 69 63 61 74 65 73 20 64 69 72 65 63 rtificates direc
ff30: 74 6f 72 79 20 69 73 20 63 61 6c 6c 65 64 20 63 tory is called c
ff40: 65 72 74 73 20 69 6e 20 74 68 65 20 64 65 66 61 erts in the defa
ff50: 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 20 20 20 20 ult OpenSSL.
ff60: 20 2a 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74 * directory. It
ff70: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 41 contains the CA
ff80: 20 63 65 72 74 69 66 69 63 61 74 65 73 20 69 6e certificates in
ff90: 20 50 45 4d 20 66 6f 72 6d 61 74 2c 20 77 69 74 PEM format, wit
ffa0: 68 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74 h one certificat
ffb0: 65 20 70 65 72 0a 20 20 20 20 20 2a 20 66 69 6c e per. * fil
ffc0: 65 2e 20 54 68 65 20 76 65 72 69 66 79 20 70 61 e. The verify pa
ffd0: 74 68 20 61 6e 64 20 73 74 6f 72 65 20 63 61 6e th and store can
ffe0: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 be overridden b
fff0: 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 y the SSL_CERT_D
10000 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68 65 0a IR env var. The.
10010 20 20 20 20 20 2a 20 64 65 66 61 75 6c 74 20 43 * default C
10020 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20 66 A certificates f
10030 69 6c 65 20 69 73 20 63 61 6c 6c 65 64 20 63 65 ile is called ce
10040 72 74 2e 70 65 6d 20 69 6e 20 74 68 65 20 64 65 rt.pem in the de
10050 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c 20 64 69 fault OpenSSL di
10060 72 65 63 74 6f 72 79 2e 0a 20 20 20 20 20 2a 20 rectory.. *
10070 54 68 65 20 76 65 72 69 66 79 20 66 69 6c 65 20 The verify file
10080 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 can be overridde
10090 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 n by the SSL_CER
100a0 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 T_FILE env var.
100b0 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f */. if (!SSL_
100c0 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
100d0 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 verify_paths(ctx
100e0 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 )) {..abort++;.
100f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 }.. /* Ove
10100 72 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 43 rrides for the C
10110 41 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e A verify path an
10120 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a d file */. {.
10130 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
10140 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
10150 30 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41 0000000L..if (CA
10160 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 path != NULL ||
10170 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 CAfile != NULL)
10180 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 {.. Tcl_DStri
10190 6e 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63 6c ng ds1;.. Tcl
101a0 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 _DStringInit(&ds
101b0 31 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 53 1);... if (!S
101c0 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 SL_CTX_load_veri
101d0 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 fy_locations(ctx
101e0 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 , F2N(CAfile, &d
101f0 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 s), F2N(CApath,
10200 26 64 73 31 29 29 29 20 7b 0a 09 09 54 63 6c 5f &ds1))) {...Tcl_
10210 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
10220 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 erp, GET_ERR_REA
10230 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
10240 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
10250 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 54 63 _free(ctx);...Tc
10260 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
10270 73 29 3b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e s);...Tcl_DStrin
10280 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 09 72 gFree(&ds1);...r
10290 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
102a0 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 }.. Tcl_DStr
102b0 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
102c0 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
102d0 65 65 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 ee(&ds1);...
102e0 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 /* Set list of C
102f0 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c As to send to cl
10300 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 ient when reques
10310 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 ting a client ce
10320 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 rtificate */..
10330 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 /* https://sou
10340 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 rceforge.net/p/t
10350 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 09 ls/bugs/57/ */..
10360 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a /* XXX:TODO:
10370 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 Let the user su
10380 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 pply values here
10390 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 instead of some
103a0 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 thing that exist
103b0 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 s on the filesys
103c0 74 65 6d 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 tem */.. STAC
103d0 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 K_OF(X509_NAME)
103e0 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c *certNames = SSL
103f0 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f _load_client_CA_
10400 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c file(F2N(CAfile,
10410 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 &ds));.. if
10420 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 (certNames != NU
10430 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f LL) {...SSL_CTX_
10440 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 set_client_CA_li
10450 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 st(ctx, certName
10460 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 s);.. }..
10470 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
10480 26 64 73 29 3b 0a 09 7d 0a 0a 23 65 6c 73 65 0a &ds);..}..#else.
10490 09 2f 2a 20 53 65 74 20 64 69 72 65 63 74 6f 72 ./* Set director
104a0 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 43 41 20 y containing CA
104b0 63 65 72 74 69 66 69 63 61 74 65 73 20 69 6e 20 certificates in
104c0 50 45 4d 20 66 6f 72 6d 61 74 2e 20 2a 2f 0a 09 PEM format. */..
104d0 69 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55 if (CApath != NU
104e0 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 LL) {.. if (!
104f0 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 SSL_CTX_load_ver
10500 69 66 79 5f 64 69 72 28 63 74 78 2c 20 46 32 4e ify_dir(ctx, F2N
10510 28 43 41 70 61 74 68 2c 20 26 64 73 29 29 29 20 (CApath, &ds)))
10520 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {...Tcl_AppendRe
10530 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 45 54 sult(interp, GET
10540 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
10550 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
10560 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
10570 78 29 3b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e x);...Tcl_DStrin
10580 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 72 65 gFree(&ds);...re
10590 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
105a0 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
105b0 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a ngFree(&ds);..}.
105c0 09 0a 09 2f 2a 20 53 65 74 20 55 52 49 20 66 6f .../* Set URI fo
105d0 72 20 74 6f 20 61 20 73 74 6f 72 65 2c 20 77 68 r to a store, wh
105e0 69 63 68 20 6d 61 79 20 62 65 20 61 20 73 69 6e ich may be a sin
105f0 67 6c 65 20 63 6f 6e 74 61 69 6e 65 72 20 6f 72 gle container or
10600 20 61 20 63 61 74 61 6c 6f 67 20 6f 66 20 63 6f a catalog of co
10610 6e 74 61 69 6e 65 72 73 2e 20 2a 2f 0a 09 69 66 ntainers. */..if
10620 20 28 43 41 73 74 6f 72 65 20 21 3d 20 4e 55 4c (CAstore != NUL
10630 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 L) {.. if (!S
10640 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 SL_CTX_load_veri
10650 66 79 5f 73 74 6f 72 65 28 63 74 78 2c 20 46 32 fy_store(ctx, F2
10660 4e 28 43 41 73 74 6f 72 65 2c 20 26 64 73 29 29 N(CAstore, &ds))
10670 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
10680 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 Result(interp, G
10690 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
106a0 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
106b0 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
106c0 63 74 78 29 3b 0a 09 09 54 63 6c 5f 44 53 74 72 ctx);...Tcl_DStr
106d0 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 ingFree(&ds);...
106e0 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 return NULL;..
106f0 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
10700 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
10710 7d 0a 09 0a 09 2f 2a 20 53 65 74 20 66 69 6c 65 }..../* Set file
10720 20 6f 66 20 43 41 20 63 65 72 74 69 66 69 63 61 of CA certifica
10730 74 65 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d 61 tes in PEM forma
10740 74 2e 20 20 2a 2f 0a 09 69 66 20 28 43 41 66 69 t. */..if (CAfi
10750 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 le != NULL) {..
10760 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f if (!SSL_CTX_
10770 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 69 6c 65 load_verify_file
10780 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 (ctx, F2N(CAfile
10790 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 54 63 6c , &ds))) {...Tcl
107a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
107b0 74 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 terp, GET_ERR_RE
107c0 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
107d0 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
107e0 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 54 X_free(ctx);...T
107f0 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
10800 64 73 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 ds);...return NU
10810 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 LL;.. }..
10820 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
10830 26 64 73 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 &ds);... /* S
10840 65 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74 et list of CAs t
10850 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 o send to client
10860 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 when requesting
10870 20 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66 a client certif
10880 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 53 54 icate */.. ST
10890 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 ACK_OF(X509_NAME
108a0 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 ) *certNames = S
108b0 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 SL_load_client_C
108c0 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c A_file(F2N(CAfil
108d0 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69 e, &ds));.. i
108e0 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 f (certNames !=
108f0 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 NULL) {...SSL_CT
10900 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f X_set_client_CA_
10910 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 list(ctx, certNa
10920 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 mes);.. }..
10930 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
10940 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65 6e 64 69 e(&ds);..}.#endi
10950 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 f. }.. ret
10960 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a urn ctx;.}.../*.
10970 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
10980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
109a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
109b0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 -----. *. * Stat
109c0 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 usObjCmd -- retu
109d0 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66 rn certificate f
109e0 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 or connected pee
109f0 72 20 69 6e 66 6f 2e 0a 20 2a 0a 20 2a 20 52 65 r info.. *. * Re
10a00 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
10a10 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
10a20 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
10a30 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
10a40 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
10a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a80 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
10a90 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 c int.StatusObjC
10aa0 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
10ab0 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
10ac0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
10ad0 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
10ae0 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
10af0 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
10b00 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a ePtr;. X509 *
10b10 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 peer;. Tcl_Ob
10b20 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 j *objPtr;. T
10b30 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
10b40 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e . char *chann
10b50 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 elName, *ciphers
10b60 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a ;. int mode;.
10b70 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
10b80 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a ed char *proto;.
10b90 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
10ba0 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 len;. int ni
10bb0 64 2c 20 72 65 73 3b 0a 20 20 20 20 28 76 6f 69 d, res;. (voi
10bc0 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a d) clientData;..
10bd0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
10be0 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
10bf0 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 objc < 2 || objc
10c00 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d > 3 || (objc ==
10c10 20 33 20 26 26 20 21 73 74 72 63 6d 70 28 54 63 3 && !strcmp(Tc
10c20 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
10c30 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 [1]), "-local"))
10c40 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
10c50 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
10c60 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f objv, "?-local?
10c70 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 channel");..ret
10c80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
10c90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 }.. /* Get
10ca0 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 channel Id */.
10cb0 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d channelName =
10cc0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
10cd0 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f bjv[(objc == 2 ?
10ce0 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63 1 : 2)]);. c
10cf0 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
10d00 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 nnel(interp, cha
10d10 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 nnelName, &mode)
10d20 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
10d30 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
10d40 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
10d50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
10d60 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
10d70 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
10d80 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
10d90 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
10da0 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
10db0 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
10dc0 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
10dd0 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
10de0 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
10df0 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
10e00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
10e10 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
10e20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
10e30 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
10e40 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
10e50 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e nel", (char *) N
10e60 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 ULL);..Tcl_SetEr
10e70 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
10e80 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c "TLS", "STATUS",
10e90 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
10ea0 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
10eb0 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
10ec0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
10ed0 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
10ee0 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 State *) Tcl_Get
10ef0 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
10f00 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 ata(chan);..
10f10 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61 /* Get certifica
10f20 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 te for peer or s
10f30 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f elf */. if (o
10f40 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 bjc == 2) {..pee
10f50 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 r = SSL_get_peer
10f60 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 _certificate(sta
10f70 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
10f80 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 } else {..peer
10f90 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 = SSL_get_certif
10fa0 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e icate(statePtr->
10fb0 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ssl);. }.
10fc0 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 74 /* Get X509 cert
10fd0 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a ificate info */.
10fe0 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a if (peer) {.
10ff0 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 .objPtr = Tls_Ne
11000 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c wX509Obj(interp,
11010 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a peer);..if (obj
11020 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 c == 2) {.. X
11030 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 509_free(peer);.
11040 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c . peer = NULL
11050 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
11060 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f {..objPtr = Tcl_
11070 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
11080 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 LL);. }..
11090 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a /* Peer name */.
110a0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
110b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
110c0 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f "peername", SSL_
110d0 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 get0_peername(st
110e0 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 atePtr->ssl), -1
110f0 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 );. LAPPEND_I
11100 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
11110 72 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f r, "sbits", SSL_
11120 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 get_cipher_bits(
11130 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e statePtr->ssl, N
11140 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 ULL));.. ciph
11150 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c ers = (char*)SSL
11160 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 _get_cipher(stat
11170 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
11180 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11190 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
111a0 68 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d her", ciphers, -
111b0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 1);.. /* Veri
111c0 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 fy the X509 cert
111d0 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 ificate presente
111e0 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f d by the peer */
111f0 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
11200 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11210 20 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c "verifyResult",
11220 0a 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 ..X509_verify_ce
11230 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 rt_error_string(
11240 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 SSL_get_verify_r
11250 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e esult(statePtr->
11260 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 ssl)), -1);..
11270 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 /* Verify mode
11280 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 */. mode = SS
11290 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 L_get_verify_mod
112a0 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
112b0 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 ;. if (mode &
112c0 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e & SSL_VERIFY_NON
112d0 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 E) {..LAPPEND_ST
112e0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
112f0 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 , "verifyMode",
11300 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 "none", -1);.
11310 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f } else {..Tcl_O
11320 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d bj *listObjPtr =
11330 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
11340 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 0, NULL);..if (m
11350 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
11360 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 Y_PEER) {.. T
11370 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
11380 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
11390 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f listObjPtr, Tcl_
113a0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 NewStringObj("pe
113b0 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 er", -1));..}..i
113c0 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 f (mode && SSL_V
113d0 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f ERIFY_FAIL_IF_NO
113e0 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 _PEER_CERT) {..
113f0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
11400 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
11410 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 rp, listObjPtr,
11420 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
11430 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 ("fail if no pee
11440 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 r cert", -1));..
11450 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 }..if (mode && S
11460 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 SL_VERIFY_CLIENT
11470 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 _ONCE) {.. Tc
11480 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
11490 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
114a0 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e istObjPtr, Tcl_N
114b0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 ewStringObj("cli
114c0 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b ent once", -1));
114d0 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 ..}..if (mode &&
114e0 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 SSL_VERIFY_POST
114f0 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 _HANDSHAKE) {..
11500 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
11510 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
11520 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 rp, listObjPtr,
11530 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
11540 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 ("post handshake
11550 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 ", -1));..}..LAP
11560 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c PEND_OBJ(interp,
11570 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 objPtr, "verify
11580 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 Mode", listObjPt
11590 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a r). }.. /*
115a0 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 Verify mode dep
115b0 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e th */. LAPPEN
115c0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
115d0 6a 50 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 jPtr, "verifyDep
115e0 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 th", SSL_get_ver
115f0 69 66 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 ify_depth(stateP
11600 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 tr->ssl));..
11610 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 /* Report the se
11620 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
11630 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 as a result of t
11640 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a he negotiation *
11650 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 /. SSL_get0_a
11660 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 lpn_selected(sta
11670 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f tePtr->ssl, &pro
11680 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c to, &len);. L
11690 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
116a0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e p, objPtr, "alpn
116b0 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f ", (char *)proto
116c0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e , (Tcl_Size) len
116d0 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 );. LAPPEND_S
116e0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
116f0 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 r, "protocol", S
11700 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 SL_get_version(s
11710 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d tatePtr->ssl), -
11720 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 1);.. /* Vali
11730 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 d for non-RSA si
11740 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 gnature and TLS
11750 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 1.3 */. if (o
11760 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 bjc == 2) {..res
11770 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f = SSL_get_peer_
11780 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 signature_nid(st
11790 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
117a0 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b d);. } else {
117b0 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f ..res = SSL_get_
117c0 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 signature_nid(st
117d0 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
117e0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 d);. }. if
117f0 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 (!res) {nid = 0
11800 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 ;}. LAPPEND_S
11810 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11820 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 r, "signatureHas
11830 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a hAlgorithm", OBJ
11840 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 _nid2ln(nid), -1
11850 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 65 64 );.. /* Added
11860 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e in OpenSSL 1.1.
11870 31 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 1a */.#if OPENSS
11880 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
11890 20 3e 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20 > 0x10101000L.
118a0 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 if (objc == 2
118b0 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 ) {..res = SSL_g
118c0 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 et_peer_signatur
118d0 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 e_type_nid(state
118e0 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b Ptr->ssl, &nid);
118f0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 . } else {..r
11900 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 es = SSL_get_sig
11910 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 nature_type_nid(
11920 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
11930 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 nid);. }.
11940 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d if (!res) {nid =
11950 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 0;}. LAPPEND
11960 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11970 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54 Ptr, "signatureT
11980 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e ype", OBJ_nid2ln
11990 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 23 65 6e 64 (nid), -1);.#end
119a0 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f if.. Tcl_SetO
119b0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
119c0 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 objPtr);. re
119d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
119e0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
119f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
11a30 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 ConnectionInfoOb
11a40 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 jCmd -- return c
11a50 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 onnection info f
11a60 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a rom OpenSSL.. *.
11a70 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
11a80 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 list of connect
11a90 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d ion info. *. *-
11aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ae0 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 --. */..static i
11af0 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 nt ConnectionInf
11b00 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 oObjCmd(ClientDa
11b10 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
11b20 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
11b30 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
11b40 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
11b50 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
11b60 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 annel chan;../*
11b70 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
11b80 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a et a mode on */.
11b90 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
11ba0 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 Ptr;../* client
11bb0 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f state for ssl so
11bc0 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f cket */. Tcl_
11bd0 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 Obj *objPtr, *li
11be0 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 stPtr;. const
11bf0 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 SSL *ssl;. c
11c00 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 onst SSL_CIPHER
11c10 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e *cipher;. con
11c20 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a st SSL_SESSION *
11c30 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e session;. con
11c40 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a 20 st EVP_MD *md;.
11c50 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 (void) client
11c60 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6f Data;.. if (o
11c70 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
11c80 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
11c90 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
11ca0 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
11cb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
11cc0 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
11cd0 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
11ce0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 nterp, Tcl_GetSt
11cf0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e ring(objv[1]), N
11d00 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 ULL);. if (ch
11d10 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
11d20 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
11d30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
11d40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b }.. /* Mak
11d50 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
11d60 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
11d70 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
11d80 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
11d90 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
11da0 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
11db0 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
11dc0 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
11dd0 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
11de0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
11df0 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
11e00 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
11e10 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
11e20 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 "\": not a T
11e30 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 LS channel", (ch
11e40 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 ar *) NULL);..Tc
11e50 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
11e60 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 nterp, "TLS", "C
11e70 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 ONNECTION", "CHA
11e80 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 NNEL", "INVALID"
11e90 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
11ea0 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
11eb0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
11ec0 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
11ed0 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
11ee0 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 ;.. /* Connec
11ef0 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 tion info */.
11f00 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
11f10 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
11f20 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
11f30 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d chan);. ssl =
11f40 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a statePtr->ssl;.
11f50 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e if (ssl != N
11f60 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e ULL) {..const un
11f70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f signed char *pro
11f80 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e to;..unsigned in
11f90 74 20 75 6c 65 6e 3b 0a 0a 09 2f 2a 20 49 6e 69 t ulen;.../* Ini
11fa0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6e 69 tialization fini
11fb0 73 68 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 shed */..LAPPEND
11fc0 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
11fd0 6a 50 74 72 2c 20 22 69 6e 69 74 5f 66 69 6e 69 jPtr, "init_fini
11fe0 73 68 65 64 22 2c 20 53 53 4c 5f 69 73 5f 69 6e shed", SSL_is_in
11ff0 69 74 5f 66 69 6e 69 73 68 65 64 28 73 73 6c 29 it_finished(ssl)
12000 29 3b 0a 09 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 );..../* connect
12010 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 ion state */..LA
12020 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12030 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65 , objPtr, "state
12040 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 ", SSL_state_str
12050 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d ing_long(ssl), -
12060 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 1);.../* Get SNI
12070 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76 65 requested serve
12080 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 r name */..LAPPE
12090 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
120a0 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61 bjPtr, "serverna
120b0 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 me", SSL_get_ser
120c0 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 vername(ssl, TLS
120d0 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 EXT_NAMETYPE_hos
120e0 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 t_name), -1);...
120f0 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 /* Report the se
12100 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
12110 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 as a result of t
12120 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a he negotiation *
12130 2f 0a 09 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e /..SSL_get0_alpn
12140 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 _selected(stateP
12150 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c tr->ssl, &proto,
12160 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e &ulen);..LAPPEN
12170 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
12180 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 jPtr, "alpn", (c
12190 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 har *)proto, (Tc
121a0 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a l_Size) ulen);..
121b0 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c ./* Get protocol
121c0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
121d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
121e0 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c "protocol", SSL
121f0 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c _get_version(ssl
12200 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e ), -1);.../* Ren
12210 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 egotiation allow
12220 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 ed */..LAPPEND_B
12230 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
12240 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69 tr, "renegotiati
12250 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c on_allowed", SSL
12260 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 _get_secure_rene
12270 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 gotiation_suppor
12280 74 28 28 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b t((SSL *) ssl));
12290 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 .../* Get securi
122a0 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 ty level */..LAP
122b0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
122c0 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69 objPtr, "securi
122d0 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 ty_level", SSL_g
122e0 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 et_security_leve
122f0 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 l(ssl));.../* Se
12300 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c ssion info */..L
12310 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
12320 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 rp, objPtr, "ses
12330 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 sion_reused", SS
12340 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 L_session_reused
12350 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 (ssl));.../* Is
12360 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 server info */..
12370 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
12380 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 erp, objPtr, "is
12390 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 _server", SSL_is
123a0 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a _server(ssl));..
123b0 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 ./* Is DTLS */..
123c0 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
123d0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 erp, objPtr, "is
123e0 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 _dtls", SSL_is_d
123f0 74 6c 73 28 73 73 6c 29 29 3b 0a 0a 23 69 66 20 tls(ssl));..#if
12400 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
12410 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33 30 32 30 NUMBER >= 0x3020
12420 30 30 30 30 4c 0a 09 2f 2a 20 49 73 20 51 55 49 0000L../* Is QUI
12430 43 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f C */..LAPPEND_BO
12440 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 OL(interp, objPt
12450 72 2c 20 22 69 73 5f 71 75 69 63 22 2c 20 53 53 r, "is_quic", SS
12460 4c 5f 69 73 5f 71 75 69 63 28 73 73 6c 29 29 3b L_is_quic(ssl));
12470 0a 0a 09 2f 2a 20 49 73 20 54 4c 53 20 2a 2f 0a .../* Is TLS */.
12480 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
12490 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 terp, objPtr, "i
124a0 73 5f 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 74 s_tls", SSL_is_t
124b0 6c 73 28 73 73 6c 29 29 3b 0a 23 65 6e 64 69 66 ls(ssl));.#endif
124c0 0a 0a 09 2f 2a 20 44 41 4e 45 20 54 4c 53 20 61 .../* DANE TLS a
124d0 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 2a 2f uthentication */
124e0 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
124f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12500 64 61 6e 65 5f 61 75 74 68 22 2c 20 53 53 4c 5f dane_auth", SSL_
12510 67 65 74 30 5f 64 61 6e 65 28 73 73 6c 29 20 21 get0_dane(ssl) !
12520 3d 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 57 61 = NULL);.../* Wa
12530 69 74 69 6e 67 20 66 6f 72 20 61 73 79 6e 63 20 iting for async
12540 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
12550 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12560 20 22 77 61 69 74 69 6e 67 5f 66 6f 72 5f 61 73 "waiting_for_as
12570 79 6e 63 22 2c 20 53 53 4c 5f 77 61 69 74 69 6e ync", SSL_waitin
12580 67 5f 66 6f 72 5f 61 73 79 6e 63 28 73 73 6c 29 g_for_async(ssl)
12590 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 2d 6f 75 74 );.../* Time-out
125a0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e */..LAPPEND_LON
125b0 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 G(interp, objPtr
125c0 2c 20 22 74 69 6d 65 2d 6f 75 74 22 2c 20 53 53 , "time-out", SS
125d0 4c 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 74 69 L_get_default_ti
125e0 6d 65 6f 75 74 28 73 73 6c 29 29 3b 0a 0a 09 2f meout(ssl));.../
125f0 2a 20 49 73 20 43 65 72 74 69 66 69 63 61 74 65 * Is Certificate
12600 20 54 72 61 6e 73 70 61 72 65 6e 63 79 20 76 61 Transparency va
12610 6c 69 64 61 74 69 6f 6e 20 65 6e 61 62 6c 65 64 lidation enabled
12620 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f */..LAPPEND_BOO
12630 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 L(interp, objPtr
12640 2c 20 22 63 74 5f 65 6e 61 62 6c 65 64 22 2c 20 , "ct_enabled",
12650 53 53 4c 5f 63 74 5f 69 73 5f 65 6e 61 62 6c 65 SSL_ct_is_enable
12660 64 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a d(ssl));. }..
12670 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e /* Cipher in
12680 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 fo */. cipher
12690 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 = SSL_get_curre
126a0 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a nt_cipher(ssl);.
126b0 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21 if (cipher !
126c0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 = NULL) {..char
126d0 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 buf[BUFSIZ] = {0
126e0 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c };..int bits, al
126f0 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 g_bits;.../* Cip
12700 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 her name */..LAP
12710 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
12720 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 objPtr, "cipher
12730 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ", SSL_CIPHER_ge
12740 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 t_name(cipher),
12750 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 -1);.../* RFC na
12760 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a me of cipher */.
12770 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
12780 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 erp, objPtr, "st
12790 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53 andard_name", SS
127a0 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 L_CIPHER_standar
127b0 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 d_name(cipher),
127c0 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 -1);.../* OpenSS
127d0 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 L name of cipher
127e0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
127f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12800 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c "openssl_name",
12810 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f OPENSSL_cipher_
12820 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f name(SSL_CIPHER_
12830 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 standard_name(ci
12840 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f pher)), -1);.../
12850 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72 * number of secr
12860 65 74 20 62 69 74 73 20 75 73 65 64 20 66 6f 72 et bits used for
12870 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73 cipher */..bits
12880 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 = SSL_CIPHER_ge
12890 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 t_bits(cipher, &
128a0 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50 alg_bits);..LAPP
128b0 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 END_INT(interp,
128c0 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f objPtr, "secret_
128d0 62 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c bits", bits);..L
128e0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
128f0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f p, objPtr, "algo
12900 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67 rithm_bits", alg
12910 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f _bits);../* alg_
12920 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b bits is actual k
12930 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 ey secret bits.
12940 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 If use bits and
12950 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 secret (algorith
12960 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a m) bits differ,.
12970 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 . the rest of
12980 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78 the bits are fix
12990 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d ed, i.e. for lim
129a0 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 ited export ciph
129b0 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 ers (bits < 56)
129c0 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 */.../* Indicate
129d0 73 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20 s which SSL/TLS
129e0 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e protocol version
129f0 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 74 first defined t
12a00 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 he cipher */..LA
12a10 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12a20 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 , objPtr, "min_v
12a30 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 ersion", SSL_CIP
12a40 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 HER_get_version(
12a50 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 cipher), -1);...
12a60 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a 2f /* Cipher NID */
12a70 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
12a80 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
12a90 69 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72 ipherNID", (char
12aa0 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 *)OBJ_nid2ln(SS
12ab0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70 L_CIPHER_get_cip
12ac0 68 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29 her_nid(cipher))
12ad0 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f , -1);..LAPPEND_
12ae0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12af0 74 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c tr, "digestNID",
12b00 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 (char *)OBJ_nid
12b10 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 2ln(SSL_CIPHER_g
12b20 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69 et_digest_nid(ci
12b30 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 pher)), -1);..LA
12b40 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12b50 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 , objPtr, "keyEx
12b60 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 changeNID", (cha
12b70 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 r *)OBJ_nid2ln(S
12b80 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 SL_CIPHER_get_kx
12b90 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d _nid(cipher)), -
12ba0 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 1);..LAPPEND_STR
12bb0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12bc0 20 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e "authentication
12bd0 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 NID", (char *)OB
12be0 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 J_nid2ln(SSL_CIP
12bf0 48 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 HER_get_auth_nid
12c00 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
12c10 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74 ../* message aut
12c20 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 hentication code
12c30 20 2d 20 43 69 70 68 65 72 20 69 73 20 41 45 41 - Cipher is AEA
12c40 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 D (e.g. GCM or C
12c50 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 haCha20/Poly1305
12c60 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 ) or not */../*
12c70 41 75 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e Authenticated En
12c80 63 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73 cryption with as
12c90 73 6f 63 69 61 74 65 64 20 64 61 74 61 20 28 41 sociated data (A
12ca0 45 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c EAD) check */..L
12cb0 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
12cc0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
12cd0 68 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 her_is_aead", SS
12ce0 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64 L_CIPHER_is_aead
12cf0 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 (cipher));.../*
12d00 44 69 67 65 73 74 20 75 73 65 64 20 64 75 72 69 Digest used duri
12d10 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68 ng the SSL/TLS h
12d20 61 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73 andshake when us
12d30 69 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e 20 ing the cipher.
12d40 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50 */..md = SSL_CIP
12d50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b HER_get_handshak
12d60 65 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 29 e_digest(cipher)
12d70 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
12d80 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12d90 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 handshake_digest
12da0 22 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d ", (char *)EVP_M
12db0 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b D_name(md), -1);
12dc0 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 .../* Get OpenSS
12dd0 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e L-specific ID, n
12de0 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c ot IANA ID */..L
12df0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
12e00 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 p, objPtr, "ciph
12e10 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 er_id", (int) SS
12e20 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 L_CIPHER_get_id(
12e30 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 cipher));.../* T
12e40 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64 20 wo-byte ID used
12e50 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f in the TLS proto
12e60 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e col of the given
12e70 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 cipher */..LAPP
12e80 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 END_INT(interp,
12e90 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f objPtr, "protoco
12ea0 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c l_id", (int) SSL
12eb0 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74 _CIPHER_get_prot
12ec0 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29 ocol_id(cipher))
12ed0 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64 ;.../* Textual d
12ee0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 escription of th
12ef0 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 20 e cipher */..if
12f00 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 (SSL_CIPHER_desc
12f10 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 ription(cipher,
12f20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 buf, sizeof(buf)
12f30 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 ) != NULL) {..
12f40 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
12f50 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 terp, objPtr, "d
12f60 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66 escription", buf
12f70 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a , -1);..}. }.
12f80 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 . /* Session
12f90 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 info */. sess
12fa0 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 ion = SSL_get_se
12fb0 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 ssion(ssl);.
12fc0 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e if (session != N
12fd0 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e ULL) {..const un
12fe0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 signed char *tic
12ff0 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e ket;..size_t len
13000 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 2;..unsigned int
13010 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e ulen;..const un
13020 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 signed char *ses
13030 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b sion_id, *proto;
13040 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
13050 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d buffer[SSL_MAX_M
13060 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 ASTER_KEY_LENGTH
13070 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 ];.../* Report t
13080 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 he selected prot
13090 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 ocol as a result
130a0 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 of the ALPN neg
130b0 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c otiation */..SSL
130c0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c _SESSION_get0_al
130d0 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 pn_selected(sess
130e0 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 ion, &proto, &le
130f0 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 n2);..LAPPEND_ST
13100 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
13110 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 , "alpn", (char
13120 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 *) proto, (Tcl_S
13130 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a ize) len2);.../*
13140 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 Report the sele
13150 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 cted protocol as
13160 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 a result of the
13170 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e NPN negotiation
13180 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e */.#ifdef USE_N
13190 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 PN..SSL_get0_nex
131a0 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 t_proto_negotiat
131b0 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 ed(ssl, &proto,
131c0 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 &ulen);..LAPPEND
131d0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
131e0 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 Ptr, "npn", (cha
131f0 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c r *) proto, (Tcl
13200 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65 _Size) ulen);.#e
13210 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 ndif.../* Resuma
13220 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 ble session */..
13230 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
13240 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 erp, objPtr, "re
13250 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 sumable", SSL_SE
13260 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 SSION_is_resumab
13270 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 le(session));...
13280 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 /* Session start
13290 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 time (seconds s
132a0 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 ince epoch) */..
132b0 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 LAPPEND_LONG(int
132c0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 erp, objPtr, "st
132d0 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 art_time", SSL_S
132e0 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 ESSION_get_time(
132f0 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 session));.../*
13300 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 Timeout value -
13310 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 SSL_CTX_get_time
13320 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 out (in seconds)
13330 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e */..LAPPEND_LON
13340 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 G(interp, objPtr
13350 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c , "timeout", SSL
13360 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d _SESSION_get_tim
13370 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a eout(session));.
13380 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 ../* Session id
13390 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 - TLSv1.2 and be
133a0 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 low only */..ses
133b0 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 sion_id = SSL_SE
133c0 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 SSION_get_id(ses
133d0 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c sion, &ulen);..L
133e0 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e APPEND_BARRAY(in
133f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
13400 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 ession_id", sess
13410 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a ion_id, (Tcl_Siz
13420 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 e) ulen);.../* S
13430 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a ession context *
13440 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 /..session_id =
13450 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
13460 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 _id_context(sess
13470 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 ion, &ulen);..LA
13480 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 PPEND_BARRAY(int
13490 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
134a0 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 ssion_context",
134b0 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c session_id, (Tcl
134c0 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 _Size) ulen);...
134d0 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 /* Session ticke
134e0 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 t - client only
134f0 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f */..SSL_SESSION_
13500 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 get0_ticket(sess
13510 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c ion, &ticket, &l
13520 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 en2);..LAPPEND_B
13530 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 ARRAY(interp, ob
13540 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 jPtr, "session_t
13550 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 icket", ticket,
13560 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 (Tcl_Size) len2)
13570 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 ;.../* Session t
13580 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 icket lifetime h
13590 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 int (in seconds)
135a0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e */..LAPPEND_LON
135b0 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 G(interp, objPtr
135c0 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 , "lifetime", SS
135d0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
135e0 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 cket_lifetime_hi
135f0 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 nt(session));...
13600 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 /* Ticket app da
13610 74 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 ta */.#if OPENSS
13620 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
13630 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
13640 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
13650 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 _ticket_appdata(
13660 28 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 29 20 (SSL_SESSION *)
13670 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 session, &ticket
13680 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 , &len2);..LAPPE
13690 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 ND_BARRAY(interp
136a0 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 , objPtr, "ticke
136b0 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63 t_app_data", tic
136c0 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 ket, (Tcl_Size)
136d0 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 len2);.#endif...
136e0 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65 /* Get master ke
136f0 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c y */..len2 = SSL
13700 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 _SESSION_get_mas
13710 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c ter_key(session,
13720 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 buffer, SSL_MAX
13730 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 _MASTER_KEY_LENG
13740 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 TH);..LAPPEND_BA
13750 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a RRAY(interp, obj
13760 50 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 Ptr, "master_key
13770 22 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c 5f ", buffer, (Tcl_
13780 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f Size) len2);.../
13790 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 * Compression id
137a0 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e */..unsigned in
137b0 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 t id = SSL_SESSI
137c0 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f ON_get_compress_
137d0 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 id(session);..LA
137e0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
137f0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 , objPtr, "compr
13800 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d ession_id", id =
13810 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 = 1 ? "zlib" : "
13820 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 none", -1);.
13830 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 }.. /* Compre
13840 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 ssion info */.
13850 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c if (ssl != NUL
13860 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 L) {.#ifdef HAVE
13870 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e _SSL_COMPRESSION
13880 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 ..const COMP_MET
13890 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e HOD *comp, *expn
138a0 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 ;..comp = SSL_ge
138b0 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 t_current_compre
138c0 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 ssion(ssl);..exp
138d0 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 n = SSL_get_curr
138e0 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 ent_expansion(ss
138f0 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 l);...LAPPEND_ST
13900 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
13910 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c , "compression",
13920 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 comp ? SSL_COMP
13930 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 _get_name(comp)
13940 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 : "none", -1);..
13950 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
13960 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 rp, objPtr, "exp
13970 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 ansion", expn ?
13980 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d SSL_COMP_get_nam
13990 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 e(expn) : "none"
139a0 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 , -1);.#else..LA
139b0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
139c0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 , objPtr, "compr
139d0 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c ession", "none",
139e0 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 -1);..LAPPEND_S
139f0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
13a00 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 r, "expansion",
13a10 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e "none", -1);.#en
13a20 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f dif. }.. /
13a30 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f * Server info */
13a40 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 . {..long mod
13a50 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f e = SSL_CTX_get_
13a60 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f session_cache_mo
13a70 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 de(statePtr->ctx
13a80 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a );..char *msg;..
13a90 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f .if (mode & SSL_
13aa0 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 SESS_CACHE_OFF)
13ab0 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 {.. msg = "of
13ac0 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 f";..} else if (
13ad0 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
13ae0 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a CACHE_CLIENT) {.
13af0 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 . msg = "clie
13b00 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 nt";..} else if
13b10 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 (mode & SSL_SESS
13b20 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b _CACHE_SERVER) {
13b30 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 .. msg = "ser
13b40 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 ver";..} else if
13b50 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 (mode & SSL_SES
13b60 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a S_CACHE_BOTH) {.
13b70 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 . msg = "both
13b80 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 ";..} else {..
13b90 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e msg = "unknown
13ba0 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 ";..}..LAPPEND_S
13bb0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
13bc0 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 r, "session_cach
13bd0 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 e_mode", msg, -1
13be0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
13bf0 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 CA List */.
13c00 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 /* IF not a serv
13c10 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f er, same as SSL_
13c20 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 get0_peer_CA_lis
13c30 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 6d t. If server sam
13c40 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 e as SSL_CTX_get
13c50 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 _client_CA_list
13c60 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d */. listPtr =
13c70 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
13c80 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 0, NULL);. ST
13c90 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 ACK_OF(X509_NAME
13ca0 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 ) *ca_list;.
13cb0 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 if ((ca_list = S
13cc0 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 SL_get_client_CA
13cd0 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e _list(ssl)) != N
13ce0 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 ULL) {..char buf
13cf0 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f fer[BUFSIZ];..fo
13d00 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 r (int i = 0; i
13d10 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e < sk_X509_NAME_n
13d20 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b um(ca_list); i++
13d30 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 ) {.. X509_NA
13d40 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 ME *name = sk_X5
13d50 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 09_NAME_value(ca
13d60 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 _list, i);..
13d70 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 if (name) {...X5
13d80 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 09_NAME_oneline(
13d90 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 name, buffer, BU
13da0 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 FSIZ);...Tcl_Lis
13db0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
13dc0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 t(interp, listPt
13dd0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
13de0 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 Obj(buffer, -1))
13df0 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 ;.. }..}.
13e00 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 }. LAPPEND_OB
13e10 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 J(interp, objPtr
13e20 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 , "caList", list
13e30 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e Ptr);. LAPPEN
13e40 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
13e50 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 jPtr, "caListCou
13e60 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d nt", sk_X509_NAM
13e70 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b E_num(ca_list));
13e80 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
13e90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
13ea0 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
13eb0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
13ec0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
13ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f00 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 -------. *. * Ve
13f10 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 rsionObjCmd -- r
13f20 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 eturn version st
13f30 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 ring from OpenSS
13f40 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 L.. *. * Results
13f50 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
13f60 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
13f70 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
13f80 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
13f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fd0 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
13fe0 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 .VersionObjCmd(C
13ff0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
14000 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
14010 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
14020 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
14030 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
14040 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
14050 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 ;. (void) cli
14060 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 28 76 6f entData;. (vo
14070 69 64 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28 76 id) objc;. (v
14080 6f 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20 20 oid) objv;..
14090 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
140a0 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d );.. objPtr =
140b0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
140c0 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f j(OPENSSL_VERSIO
140d0 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 N_TEXT, -1);.
140e0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
140f0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
14100 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
14110 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
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 2d ----------------
14150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14160 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 ---. *. * MiscOb
14170 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d jCmd -- misc com
14180 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 mands. *. * Resu
14190 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
141a0 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
141b0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
141c0 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
141d0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
141e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
141f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14210 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
14220 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 int.MiscObjCmd(C
14230 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
14240 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
14250 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
14260 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
14270 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
14280 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 static const ch
14290 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 ar *commands []
142a0 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 = { "req", "strr
142b0 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 eq", NULL };.
142c0 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 enum command {
142d0 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c C_REQ, C_STRREQ,
142e0 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 C_DUMMY };.
142f0 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 Tcl_Size cmd;.
14300 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 int isStr;.
14310 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 char buffer[163
14320 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 84];. (void)
14330 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
14340 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
14350 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
14360 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 c < 2) {..Tcl_Wr
14370 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
14380 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 p, 1, objv, "sub
14390 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 command ?args?")
143a0 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
143b0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
143c0 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 f (Tcl_GetIndexF
143d0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
143e0 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 bjv[1], commands
143f0 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 , "command", 0,
14400 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 &cmd) != TCL_OK)
14410 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
14420 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
14430 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 ERR_clear_error
14440 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d ();.. isStr =
14450 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 (cmd == C_STRRE
14460 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 Q);. switch (
14470 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 (enum command) c
14480 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 md) {..case C_RE
14490 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 Q:..case C_STRRE
144a0 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b Q: {.. EVP_PK
144b0 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 EY *pkey=NULL;..
144c0 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e X509 *cert=N
144d0 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e ULL;.. X509_N
144e0 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a AME *name=NULL;.
144f0 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c . Tcl_Obj **l
14500 69 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f 53 istv;.. Tcl_S
14510 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 20 20 ize listc;..
14520 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 49 4f int i;... BIO
14530 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 *out=NULL;...
14540 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a char *k_C="",*
14550 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c k_ST="",*k_L="",
14560 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 *k_O="",*k_OU=""
14570 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 ,*k_CN="",*k_Ema
14580 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 il="";.. char
14590 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 *keyout,*pemout
145a0 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 ,*str;.. int
145b0 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 keysize,serial=0
145c0 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 ,days=365;..#if
145d0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
145e0 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
145f0 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 000L.. BIGNUM
14600 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 *bne = NULL;..
14610 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 RSA *rsa = NU
14620 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 LL;.#else.. E
14630 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 VP_PKEY_CTX *ctx
14640 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a = NULL;.#endif.
14650 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c .. if ((objc<
14660 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 5) || (objc>6))
14670 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {...Tcl_WrongNum
14680 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 Args(interp, 2,
14690 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b objv, "keysize k
146a0 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 eyfile certfile
146b0 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 ?info?");...retu
146c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
146d0 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 }... if (T
146e0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
146f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d (interp, objv[2]
14700 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 , &keysize) != T
14710 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 CL_OK) {...retur
14720 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
14730 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d }.. keyout=
14740 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
14750 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d jv[3]);.. pem
14760 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e out=Tcl_GetStrin
14770 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 g(objv[4]);..
14780 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 if (isStr) {...
14790 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 Tcl_SetVar(inter
147a0 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a p,keyout,"",0);.
147b0 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 ..Tcl_SetVar(int
147c0 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 erp,pemout,"",0)
147d0 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 ;.. }... i
147e0 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 f (objc>=6) {...
147f0 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 if (Tcl_ListObjG
14800 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 etElements(inter
14810 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 p, objv[5], &lis
14820 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 tc, &listv) != T
14830 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 CL_OK) {... r
14840 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
14850 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 ...}....if ((lis
14860 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 tc%2) != 0) {...
14870 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
14880 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d t(interp,"Inform
14890 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 ation list must
148a0 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 have even number
148b0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e of arguments",N
148c0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 ULL);... retu
148d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
148e0 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c }...for (i=0; i<
148f0 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 listc; i+=2) {..
14900 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 . str=Tcl_Get
14910 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 String(listv[i])
14920 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63 ;... if (strc
14930 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d mp(str,"days")==
14940 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 0) {....if (Tcl_
14950 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e GetIntFromObj(in
14960 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c terp,listv[i+1],
14970 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a &days)!=TCL_OK).
14980 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
14990 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d L_ERROR;... }
149a0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
149b0 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d (str,"serial")==
149c0 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 0) {....if (Tcl_
149d0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e GetIntFromObj(in
149e0 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c terp,listv[i+1],
149f0 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b &serial)!=TCL_OK
14a00 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 ).... return
14a10 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
14a20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
14a30 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 mp(str,"C")==0)
14a40 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 {....k_C=Tcl_Get
14a50 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
14a60 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
14a70 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
14a80 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b "ST")==0) {....k
14a90 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e _ST=Tcl_GetStrin
14aa0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
14ab0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
14ac0 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d strcmp(str,"L")=
14ad0 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c =0) {....k_L=Tcl
14ae0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
14af0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
14b00 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
14b10 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 str,"O")==0) {..
14b20 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 ..k_O=Tcl_GetStr
14b30 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
14b40 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
14b50 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 (strcmp(str,"OU
14b60 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 ")==0) {....k_OU
14b70 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
14b80 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
14b90 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
14ba0 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 cmp(str,"CN")==0
14bb0 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f ) {....k_CN=Tcl_
14bc0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
14bd0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
14be0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
14bf0 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 tr,"Email")==0)
14c00 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c {....k_Email=Tcl
14c10 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
14c20 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
14c30 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 else {....Tcl_Se
14c40 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
14c50 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 Unknown paramete
14c60 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 r",NULL);....ret
14c70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
14c80 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 . }...}..
14c90 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 }..#if OPENSSL_V
14ca0 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
14cb0 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 0x30000000L..
14cc0 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b bne = BN_new();
14cd0 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f .. rsa = RSA_
14ce0 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 new();.. pkey
14cf0 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 = EVP_PKEY_new(
14d00 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 );.. if (bne
14d10 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d == NULL || rsa =
14d20 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d = NULL || pkey =
14d30 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 = NULL || !BN_se
14d40 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 t_word(bne,RSA_F
14d50 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 4) ||...!RSA_gen
14d60 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 erate_key_ex(rsa
14d70 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 , keysize, bne,
14d80 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b NULL) || !EVP_PK
14d90 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b EY_assign_RSA(pk
14da0 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 ey, rsa)) {...EV
14db0 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 P_PKEY_free(pkey
14dc0 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 );.../* RSA_free
14dd0 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 (rsa); freed by
14de0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f EVP_PKEY_free */
14df0 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b ...BN_free(bne);
14e00 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 .#else.. pkey
14e10 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 = EVP_RSA_gen((
14e20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 unsigned int) ke
14e30 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 ysize);.. ctx
14e40 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f = EVP_PKEY_CTX_
14e50 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a new(pkey,NULL);.
14e60 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d . if (pkey ==
14e70 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 NULL || ctx ==
14e80 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 NULL || !EVP_PKE
14e90 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 Y_keygen_init(ct
14ea0 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 x) ||...!EVP_PKE
14eb0 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 Y_CTX_set_rsa_ke
14ec0 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b ygen_bits(ctx, k
14ed0 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f eysize) || !EVP_
14ee0 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c PKEY_keygen(ctx,
14ef0 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 &pkey)) {...EVP
14f00 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
14f10 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 ;...EVP_PKEY_CTX
14f20 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 _free(ctx);.#end
14f30 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 if...Tcl_SetResu
14f40 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 lt(interp,"Error
14f50 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 generating priv
14f60 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a ate key",NULL);.
14f70 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
14f80 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 OR;.. } else
14f90 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b {...if (isStr) {
14fa0 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e ... out=BIO_n
14fb0 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b ew(BIO_s_mem());
14fc0 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 ... PEM_write
14fd0 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 _bio_PrivateKey(
14fe0 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 out,pkey,NULL,NU
14ff0 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b LL,0,NULL,NULL);
15000 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 ... i=BIO_rea
15010 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a d(out,buffer,siz
15020 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a eof(buffer)-1);.
15030 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 .. i=(i<0) ?
15040 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 0 : i;... buf
15050 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 fer[i]='\0';...
15060 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e Tcl_SetVar(in
15070 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 terp,keyout,buff
15080 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f er,0);... BIO
15090 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 _flush(out);...
150a0 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 BIO_free(out)
150b0 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 ;...} else {...
150c0 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
150d0 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 IO_s_file());...
150e0 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 BIO_write_fi
150f0 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 lename(out,keyou
15100 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 t);... PEM_wr
15110 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b ite_bio_PrivateK
15120 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c ey(out,pkey,NULL
15130 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c ,NULL,0,NULL,NUL
15140 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d L);... /* PEM
15150 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 _write_bio_RSAPr
15160 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 ivateKey(out, rs
15170 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 a, NULL, NULL, 0
15180 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a , NULL, NULL); *
15190 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 /... BIO_free
151a0 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a _all(out);.. .}.
151b0 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 ...if ((cert=X50
151c0 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 9_new())==NULL)
151d0 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 {... Tcl_SetR
151e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 esult(interp,"Er
151f0 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 ror generating c
15200 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75 65 ertificate reque
15210 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 st",NULL);...
15220 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 EVP_PKEY_free(p
15230 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 key);.#if OPENSS
15240 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
15250 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
15260 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 . BN_free(bne
15270 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 );.#endif...
15280 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
15290 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 ;...}....X509_se
152a0 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 t_version(cert,2
152b0 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 );...ASN1_INTEGE
152c0 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 R_set(X509_get_s
152d0 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 erialNumber(cert
152e0 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 ),serial);...X50
152f0 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 9_gmtime_adj(X50
15300 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 9_getm_notBefore
15310 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 (cert),0);...X50
15320 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 9_gmtime_adj(X50
15330 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 9_getm_notAfter(
15340 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 cert),(long)60*6
15350 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 0*24*days);...X5
15360 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 09_set_pubkey(ce
15370 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d rt,pkey);....nam
15380 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 e=X509_get_subje
15390 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a ct_name(cert);..
153a0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
153b0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
153c0 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f e,"C", MBSTRING_
153d0 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
153e0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 gned char *) k_C
153f0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
15400 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
15410 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
15420 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 "ST", MBSTRING_A
15430 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
15440 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 ned char *) k_ST
15450 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
15460 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
15470 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
15480 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 "L", MBSTRING_AS
15490 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
154a0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 ed char *) k_L,
154b0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
154c0 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
154d0 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f y_by_txt(name,"O
154e0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
154f0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
15500 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 char *) k_O, -1
15510 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
15520 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
15530 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 by_txt(name,"OU"
15540 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
15550 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
15560 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 char *) k_OU, -1
15570 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
15580 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
15590 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 by_txt(name,"CN"
155a0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
155b0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
155c0 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 char *) k_CN, -1
155d0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
155e0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
155f0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 by_txt(name,"Ema
15600 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 il", MBSTRING_AS
15610 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
15620 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 ed char *) k_Ema
15630 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a il, -1, -1, 0);.
15640 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a ...X509_set_subj
15650 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 ect_name(cert,na
15660 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 me);....if (!X50
15670 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 9_sign(cert,pkey
15680 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 20 ,EVP_sha256()))
15690 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 65 {... X509_fre
156a0 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45 e(cert);... E
156b0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 VP_PKEY_free(pke
156c0 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f y);.#if OPENSSL_
156d0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
156e0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 0x30000000L...
156f0 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b BN_free(bne);
15700 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63 .#endif... Tc
15710 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
15720 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e rp,"Error signin
15730 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e g certificate",N
15740 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 ULL);... retu
15750 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
15760 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 }....if (isStr)
15770 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f {... out=BIO_
15780 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 new(BIO_s_mem())
15790 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 ;... PEM_writ
157a0 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 e_bio_X509(out,c
157b0 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 ert);... i=BI
157c0 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 O_read(out,buffe
157d0 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 r,sizeof(buffer)
157e0 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c -1);... i=(i<
157f0 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 0) ? 0 : i;...
15800 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 buffer[i]='\0'
15810 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 ;... Tcl_SetV
15820 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 ar(interp,pemout
15830 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 ,buffer,0);...
15840 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 BIO_flush(out)
15850 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 ;... BIO_free
15860 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 (out);...} else
15870 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f {... out=BIO_
15880 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 new(BIO_s_file()
15890 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 );... BIO_wri
158a0 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c te_filename(out,
158b0 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 pemout);... P
158c0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 EM_write_bio_X50
158d0 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 9(out,cert);...
158e0 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 BIO_free_all(
158f0 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 out);...}....X50
15900 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 9_free(cert);...
15910 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
15920 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c ey);.#if OPENSSL
15930 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
15940 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 < 0x30000000L...
15950 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
15960 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 ndif.. }..}..
15970 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 break;. defau
15980 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 lt:..break;.
15990 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c }. return TCL
159a0 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a _OK;.}.../******
159b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
159c0 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 /* Init
159d0 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a */./********
159e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f ************/../
159f0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
15a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a30 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
15a40 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 s_Free --. *. *.
15a50 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 This procedure c
15a60 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 leans up when a
15a70 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 SSL socket based
15a80 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 channel. *.is c
15a90 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 losed and its re
15aa0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 ference count fa
15ab0 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 lls below 1. *.
15ac0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f * Results:. *.no
15ad0 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
15ae0 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 fects:. *.Frees
15af0 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a all the state. *
15b00 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
15b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b40 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a ------. */.void.
15b50 54 6c 73 5f 46 72 65 65 28 74 6c 73 5f 66 72 65 Tls_Free(tls_fre
15b60 65 5f 74 79 70 65 20 2a 62 6c 6f 63 6b 50 74 72 e_type *blockPtr
15b70 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
15b80 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
15b90 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 *)blockPtr;..
15ba0 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
15bb0 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c d");.. Tls_Cl
15bc0 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 ean(statePtr);.
15bd0 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 ckfree(blockP
15be0 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d tr);.}.../*. *--
15bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c30 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 -. *. * Tls_Clea
15c40 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 n --. *. *.This
15c50 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 procedure cleans
15c60 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 up when a SSL s
15c70 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e ocket based chan
15c80 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 nel. *.is closed
15c90 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e and its referen
15ca0 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 ce count falls b
15cb0 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 elow 1. This sh
15cc0 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 ould. *.be calle
15cd0 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 d synchronously
15ce0 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 by the CloseProc
15cf0 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 , not in the. *.
15d00 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 EventuallyFree c
15d10 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 allback.. *. * R
15d20 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a esults:. *.none.
15d30 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
15d40 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c ts:. *.Frees all
15d50 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a the state. *. *
15d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15da0 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 ---. */.void Tls
15db0 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 _Clean(State *st
15dc0 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 atePtr) {. dp
15dd0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
15de0 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
15df0 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 tr->ssl) {../* S
15e00 65 6e 64 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 end close_notify
15e10 20 6d 65 73 73 61 67 65 20 2a 2f 0a 09 64 70 72 message */..dpr
15e20 69 6e 74 66 28 22 53 53 4c 5f 73 68 75 74 64 6f intf("SSL_shutdo
15e30 77 6e 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 wn(%p)", statePt
15e40 72 2d 3e 73 73 6c 29 3b 0a 09 2f 2a 20 57 69 6c r->ssl);../* Wil
15e50 6c 20 72 65 74 75 72 6e 20 72 65 74 75 72 6e 20 l return return
15e60 30 20 77 68 69 6c 65 20 73 68 75 74 64 6f 77 6e 0 while shutdown
15e70 20 69 6e 20 70 72 6f 63 65 73 73 2c 20 74 68 65 in process, the
15e80 6e 20 31 20 77 68 65 6e 20 63 6f 6d 70 6c 65 74 n 1 when complet
15e90 65 20 2a 2f 0a 09 2f 2a 20 63 6c 6f 73 65 73 20 e */../* closes
15ea0 74 68 65 20 77 72 69 74 65 20 64 69 72 65 63 74 the write direct
15eb0 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 ion of the conne
15ec0 63 74 69 6f 6e 3b 20 74 68 65 20 72 65 61 64 20 ction; the read
15ed0 64 69 72 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f direction is clo
15ee0 73 65 64 20 62 79 20 74 68 65 20 70 65 65 72 2e sed by the peer.
15ef0 20 2a 2f 0a 09 2f 2a 20 44 6f 65 73 20 6e 6f 74 */../* Does not
15f00 20 61 66 66 65 63 74 20 73 6f 63 6b 65 74 20 2a affect socket *
15f10 2f 0a 09 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28 /..SSL_shutdown(
15f20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
15f30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
15f40 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d * we're assum
15f50 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65 ing here that we
15f60 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 're single-threa
15f70 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 ded. */.
15f80 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 if (statePtr->ti
15f90 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 mer != (Tcl_Time
15fa0 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a rToken) NULL) {.
15fb0 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 .Tcl_DeleteTimer
15fc0 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 Handler(statePtr
15fd0 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 ->timer);..state
15fe0 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c Ptr->timer = NUL
15ff0 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a L;. }.. /*
16000 20 52 65 6d 6f 76 65 20 63 61 6c 6c 62 61 63 6b Remove callback
16010 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 s */. if (sta
16020 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
16030 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 {..Tcl_DecrRefC
16040 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 ount(statePtr->c
16050 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 allback);..state
16060 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 Ptr->callback =
16070 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
16080 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 if (statePtr->pa
16090 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 ssword) {..Tcl_D
160a0 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ecrRefCount(stat
160b0 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b ePtr->password);
160c0 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 ..statePtr->pass
160d0 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 word = NULL;.
160e0 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
160f0 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 Ptr->vcmd) {..Tc
16100 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
16110 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a tatePtr->vcmd);.
16120 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 .statePtr->vcmd
16130 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 = NULL;. }..
16140 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
16150 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 >protos) {..ckfr
16160 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f ee(statePtr->pro
16170 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d tos);..statePtr-
16180 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a >protos = NULL;.
16190 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
161a0 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a tatePtr->bio) {.
161b0 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 ./* This will ca
161c0 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e ll SSL_shutdown.
161d0 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a Bug 1414045 */.
161e0 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 .dprintf("BIO_fr
161f0 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 ee_all(%p)", sta
16200 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 tePtr->bio);..BI
16210 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 O_free_all(state
16220 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 Ptr->bio);..stat
16230 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c ePtr->bio = NULL
16240 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
16250 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 (statePtr->ssl)
16260 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f {..dprintf("SSL_
16270 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 free(%p)", state
16280 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f Ptr->ssl);..SSL_
16290 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 free(statePtr->s
162a0 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e sl);..statePtr->
162b0 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ssl = NULL;.
162c0 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
162d0 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c Ptr->ctx) {..SSL
162e0 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 _CTX_free(stateP
162f0 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 tr->ctx);..state
16300 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b Ptr->ctx = NULL;
16310 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 . }.. dpri
16320 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 ntf("Returning")
16330 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
16340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16380 2d 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20 49 6e -. *. * Build In
16390 66 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a fo Command --. *
163a0 0a 20 2a 09 43 72 65 61 74 65 20 63 6f 6d 6d 61 . *.Create comma
163b0 6e 64 20 74 6f 20 72 65 74 75 72 6e 20 62 75 69 nd to return bui
163c0 6c 64 20 69 6e 66 6f 20 66 6f 72 20 70 61 63 6b ld info for pack
163d0 61 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c age.. *. * Resul
163e0 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
163f0 64 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a d Tcl result. *.
16400 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
16410 0a 20 2a 09 43 72 65 61 74 65 64 20 62 75 69 6c . *.Created buil
16420 64 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a d-info command..
16430 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
16440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
16480 0a 23 69 66 6e 64 65 66 20 53 54 52 49 4e 47 49 .#ifndef STRINGI
16490 46 59 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 FY.# define STR
164a0 49 4e 47 49 46 59 28 78 29 20 53 54 52 49 4e 47 INGIFY(x) STRING
164b0 49 46 59 31 28 78 29 0a 23 20 20 64 65 66 69 6e IFY1(x).# defin
164c0 65 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 20 e STRINGIFY1(x)
164d0 23 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 0a 42 #x.#endif..int.B
164e0 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 uildInfoCommand(
164f0 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65 Tcl_Interp* inte
16500 72 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 6d rp) {. Tcl_Cm
16510 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 dInfo info;..
16520 20 69 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d 6d if (Tcl_GetComm
16530 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 andInfo(interp,
16540 22 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e "::tcl::build-in
16550 66 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a 09 fo", &info)) {..
16560 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
16570 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a mand(interp, "::
16580 74 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 tls::build-info"
16590 2c 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 , info.objProc,
165a0 28 76 6f 69 64 20 2a 29 28 0a 09 09 50 41 43 4b (void *)(...PACK
165b0 41 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20 AGE_VERSION "+"
165c0 53 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 45 STRINGIFY(TLS_VE
165d0 52 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66 20 RSION_UUID).#if
165e0 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f defined(__clang_
165f0 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f _) && defined(__
16600 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 clang_major__)..
16610 09 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20 .. ".clang-"
16620 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e STRINGIFY(__clan
16630 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f g_major__).#if _
16640 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c _clang_minor__ <
16650 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 10.... "0".#
16660 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 endif.... STR
16670 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d INGIFY(__clang_m
16680 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 inor__).#endif.#
16690 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c if defined(__cpl
166a0 75 73 70 6c 75 73 29 20 26 26 20 21 64 65 66 69 usplus) && !defi
166b0 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 ned(__OBJC__)...
166c0 09 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 73 . ".cplusplus
166d0 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 ".#endif.#ifndef
166e0 20 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 NDEBUG.... "
166f0 2e 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 .debug".#endif.#
16700 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c if !defined(__cl
16710 61 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69 6e ang__) && !defin
16720 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 ed(__INTEL_COMPI
16730 4c 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 28 LER) && defined(
16740 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20 __GNUC__)....
16750 20 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 49 ".gcc-" STRINGI
16760 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 FY(__GNUC__).#if
16770 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 __GNUC_MINOR__
16780 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a < 10.... "0".
16790 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 #endif.... ST
167a0 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d RINGIFY(__GNUC_M
167b0 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 INOR__).#endif.#
167c0 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f ifdef __INTEL_CO
167d0 4d 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22 2e MPILER.... ".
167e0 69 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 icc-" STRINGIFY(
167f0 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 __INTEL_COMPILER
16800 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ).#endif.#ifdef
16810 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09 TCL_MEM_DEBUG...
16820 09 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 22 . ".memdebug"
16830 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
16840 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09 ned(_MSC_VER)...
16850 09 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 54 . ".msvc-" ST
16860 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 52 RINGIFY(_MSC_VER
16870 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ).#endif.#ifdef
16880 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20 USE_NMAKE....
16890 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66 ".nmake".#endif
168a0 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 47 .#ifndef TCL_CFG
168b0 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 20 _OPTIMIZED....
168c0 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 ".no-optimize"
168d0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f .#endif.#ifdef _
168e0 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22 _OBJC__.... "
168f0 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 69 .objective-c".#i
16900 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 f defined(__cplu
16910 73 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22 70 splus).... "p
16920 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a lusplus".#endif.
16930 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 #endif.#ifdef TC
16940 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09 L_CFG_PROFILED..
16950 09 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 22 .. ".profile"
16960 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 50 .#endif.#ifdef P
16970 55 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e 70 URIFY.... ".p
16980 75 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 69 urify".#endif.#i
16990 66 64 65 66 20 53 54 41 54 49 43 5f 42 55 49 4c fdef STATIC_BUIL
169a0 44 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74 69 D.... ".stati
169b0 63 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e c".#endif...), N
169c0 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ULL);. }.
169d0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
169e0 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
169f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
16a20 20 2a 0a 20 2a 20 54 6c 73 4c 69 62 53 68 75 74 *. * TlsLibShut
16a30 64 6f 77 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 53 68 down --. *. *.Sh
16a40 75 74 64 6f 77 6e 20 53 53 4c 20 6c 69 62 72 61 utdown SSL libra
16a50 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c ry once per appl
16a60 69 63 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 ication. *. * Re
16a70 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
16a80 64 61 72 64 20 54 43 4c 20 72 65 73 75 6c 74 0a dard TCL result.
16a90 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
16aa0 74 73 3a 0a 20 2a 09 53 68 75 74 64 6f 77 6e 20 ts:. *.Shutdown
16ab0 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 SSL library. *.
16ac0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
16ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16af0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 -------*. */.sta
16b00 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 53 68 tic int TlsLibSh
16b10 75 74 64 6f 77 6e 28 43 6c 69 65 6e 74 44 61 74 utdown(ClientDat
16b20 61 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a a clientData) {.
16b30 20 20 20 20 42 49 4f 5f 63 6c 65 61 6e 75 70 28 BIO_cleanup(
16b40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
16b50 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d L_OK;.}../*. *--
16b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b90 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c ----*. *. *.TlsL
16ba0 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 ibInit --. *. *.
16bb0 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 Initializes SSL
16bc0 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 library once per
16bd0 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 0a application. *.
16be0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
16bf0 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
16c00 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 sult. *. * Side
16c10 65 66 66 65 63 74 73 3a 0a 20 2a 09 49 6e 69 74 effects:. *.Init
16c20 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 ializes SSL libr
16c30 61 72 79 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ary. *. *-------
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 2a ---------------*
16c70 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
16c80 54 6c 73 4c 69 62 49 6e 69 74 28 29 20 7b 0a 20 TlsLibInit() {.
16c90 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e static int in
16ca0 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a itialized = 0;..
16cb0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
16cc0 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
16cd0 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a !initialized) {.
16ce0 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 ./* Initialize B
16cf0 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e OTH libcrypto an
16d00 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 09 69 66 d libssl. */..if
16d10 20 28 21 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f (!OPENSSL_init_
16d20 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 ssl(OPENSSL_INIT
16d30 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 _LOAD_SSL_STRING
16d40 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 S | OPENSSL_INIT
16d50 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 _LOAD_CRYPTO_STR
16d60 49 4e 47 53 0a 09 20 20 20 20 7c 20 4f 50 45 4e INGS.. | OPEN
16d70 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c SSL_INIT_ADD_ALL
16d80 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 _CIPHERS | OPENS
16d90 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f SL_INIT_ADD_ALL_
16da0 44 49 47 45 53 54 53 0a 09 20 20 20 20 7c 20 4f DIGESTS.. | O
16db0 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 PENSSL_INIT_LOAD
16dc0 5f 43 4f 4e 46 49 47 20 7c 20 4f 50 45 4e 53 53 _CONFIG | OPENSS
16dd0 4c 5f 49 4e 49 54 5f 41 53 59 4e 43 2c 20 4e 55 L_INIT_ASYNC, NU
16de0 4c 4c 29 29 20 7b 0a 09 20 20 20 20 72 65 74 75 LL)) {.. retu
16df0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
16e00 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 42 49 4f .../* Create BIO
16e10 20 68 61 6e 64 6c 65 72 73 20 2a 2f 0a 09 42 49 handlers */..BI
16e20 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 O_new_tcl(NULL,
16e30 30 29 3b 0a 09 0a 09 2f 2a 20 43 72 65 61 74 65 0);..../* Create
16e40 20 65 78 69 74 20 68 61 6e 64 6c 65 72 20 2a 2f exit handler */
16e50 0a 09 54 63 6c 5f 43 72 65 61 74 65 45 78 69 74 ..Tcl_CreateExit
16e60 48 61 6e 64 6c 65 72 28 54 6c 73 4c 69 62 53 68 Handler(TlsLibSh
16e70 75 74 64 6f 77 6e 2c 20 4e 55 4c 4c 29 3b 0a 09 utdown, NULL);..
16e80 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b initialized = 1;
16e90 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
16ea0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
16eb0 20 49 6e 69 74 20 73 63 72 69 70 74 20 2a 2f 0a Init script */.
16ec0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
16ed0 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 r tlsTclInitScri
16ee0 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 pt[] = {.#includ
16ef0 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 7d 3b e "tls.tcl.h".};
16f00 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
16f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
16f50 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a Tls_Init --. *.
16f60 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63 *.This is a pac
16f70 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 kage initializat
16f80 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 ion procedure, w
16f90 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 hich is called.
16fa0 2a 09 62 79 20 54 43 4c 20 77 68 65 6e 20 74 68 *.by TCL when th
16fb0 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f is package is to
16fc0 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 be added to an
16fd0 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a interpreter.. *.
16fe0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 49 * Results:. *.I
16ff0 6e 69 74 69 61 6c 69 7a 65 73 20 73 74 72 75 63 nitializes struc
17000 74 75 72 65 73 20 61 6e 64 20 63 72 65 61 74 65 tures and create
17010 73 20 63 6f 6d 6d 61 6e 64 73 2e 0a 20 2a 0a 20 s commands.. *.
17020 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
17030 20 2a 09 20 43 72 65 61 74 65 20 74 68 65 20 63 *. Create the c
17040 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d ommands. *. *---
17050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17090 0a 20 2a 2f 0a 0a 23 69 66 20 54 43 4c 5f 4d 41 . */..#if TCL_MA
170a0 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a JOR_VERSION > 8.
170b0 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 #define MIN_VERS
170c0 49 4f 4e 20 22 39 2e 30 22 0a 23 65 6c 73 65 0a ION "9.0".#else.
170d0 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 #define MIN_VERS
170e0 49 4f 4e 20 22 38 2e 35 22 0a 23 65 6e 64 69 66 ION "8.5".#endif
170f0 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 ..DLLEXPORT int
17100 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 Tls_Init(Tcl_Int
17110 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 0a erp *interp) {..
17120 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
17130 6c 65 64 22 29 3b 0a 0a 23 69 66 64 65 66 20 55 led");..#ifdef U
17140 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 SE_TCL_STUBS.
17150 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 if (Tcl_InitStu
17160 62 73 28 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56 bs(interp, MIN_V
17170 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 ERSION, 0) == NU
17180 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
17190 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 L_ERROR;. }.#
171a0 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 54 63 endif. if (Tc
171b0 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 l_PkgRequire(int
171c0 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f erp, "Tcl", MIN_
171d0 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e VERSION, 0) == N
171e0 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
171f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
17200 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 . if (TlsLibI
17210 6e 69 74 28 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 nit() != TCL_OK)
17220 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
17230 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f sult(interp, "co
17240 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 uld not initiali
17250 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c ze SSL library",
17260 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
17270 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
17280 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
17290 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
172a0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
172b0 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 ls::ciphers", Ci
172c0 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c phersObjCmd, (Cl
172d0 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
172e0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
172f0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
17300 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
17310 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
17320 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e :tls::connection
17330 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 ", ConnectionInf
17340 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 oObjCmd, (Client
17350 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c Data) NULL, (Tcl
17360 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
17370 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
17380 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
17390 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 d(interp, "::tls
173a0 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 ::handshake", Ha
173b0 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 ndshakeObjCmd, (
173c0 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
173d0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
173e0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
173f0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
17400 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
17410 22 3a 3a 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c "::tls::import",
17420 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 ImportObjCmd, (
17430 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
17440 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
17450 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
17460 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
17470 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
17480 22 3a 3a 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 "::tls::unimport
17490 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d ", UnimportObjCm
174a0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
174b0 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
174c0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
174d0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
174e0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
174f0 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 73 74 rp, "::tls::unst
17500 61 63 6b 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 ack", UnimportOb
17510 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
17520 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d a) NULL, (Tcl_Cm
17530 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
17540 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
17550 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
17560 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 nterp, "::tls::s
17570 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 tatus", StatusOb
17580 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
17590 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d a) NULL, (Tcl_Cm
175a0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
175b0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
175c0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
175d0 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 76 nterp, "::tls::v
175e0 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e ersion", Version
175f0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
17600 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f ata) NULL, (Tcl_
17610 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
17620 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
17630 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
17640 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a (interp, "::tls:
17650 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 :misc", MiscObjC
17660 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
17670 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 NULL, (Tcl_CmdD
17680 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
17690 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
176a0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
176b0 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 70 72 6f erp, "::tls::pro
176c0 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f tocols", Protoco
176d0 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e lsObjCmd, (Clien
176e0 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 tData) NULL, (Tc
176f0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
17700 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 *) NULL);.. B
17710 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 uildInfoCommand(
17720 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 interp);.. if
17730 20 28 69 6e 74 65 72 70 20 26 26 20 54 63 6c 5f (interp && Tcl_
17740 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 Eval(interp, tls
17750 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 20 21 TclInitScript) !
17760 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
17770 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
17780 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e }.. return
17790 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 Tcl_PkgProvide(
177a0 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f interp, PACKAGE_
177b0 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 NAME, PACKAGE_VE
177c0 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a RSION);.}../*. *
177d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
177e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
177f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17810 2d 2d 2d 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 ---. *. *.Tls_Sa
17820 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 feInit --. *. *.
17830 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 This is a packag
17840 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e e initialization
17850 20 70 72 6f 63 65 64 75 72 65 20 66 6f 72 20 73 procedure for s
17860 61 66 65 20 69 6e 74 65 72 70 73 2e 0a 20 2a 0a afe interps.. *.
17870 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 53 * Results:. *.S
17880 61 6d 65 20 61 73 20 6f 66 20 27 54 6c 73 5f 49 ame as of 'Tls_I
17890 6e 69 74 27 0a 20 2a 0a 20 2a 20 53 69 64 65 20 nit'. *. * Side
178a0 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 61 6d 65 effects:. *.Same
178b0 20 61 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 as of 'Tls_Init
178c0 27 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d '. *. *---------
178d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
178e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
178f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 ----------. */.D
17910 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 LLEXPORT int Tls
17920 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e _SafeInit(Tcl_In
17930 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a terp *interp) {.
17940 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
17950 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 led");. retur
17960 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 n Tls_Init(inter
17970 70 29 3b 0a 7d 0a p);.}.