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 66 69 6c 65 2c 0a 09 char *CAfile,..
0610: 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 .char *ciphers,
0620: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 char *ciphersuit
0630: 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 es, int level, c
0640: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a har *DHparams);.
0650: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f .#define TLS_PRO
0660: 54 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a 23 64 TO_SSL2..0x01.#d
0670: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f efine TLS_PROTO_
0680: 53 53 4c 33 09 09 30 78 30 32 0a 23 64 65 66 69 SSL3..0x02.#defi
0690: 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ne TLS_PROTO_TLS
06a0: 31 09 09 30 78 30 34 0a 23 64 65 66 69 6e 65 20 1..0x04.#define
06b0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 TLS_PROTO_TLS1_1
06c0: 09 30 78 30 38 0a 23 64 65 66 69 6e 65 20 54 4c .0x08.#define TL
06d0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 09 30 S_PROTO_TLS1_2.0
06e0: 78 31 30 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f x10.#define TLS_
06f0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 78 32 PROTO_TLS1_3.0x2
0700: 30 0a 23 64 65 66 69 6e 65 20 45 4e 41 42 4c 45 0.#define ENABLE
0710: 44 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09 28 28 D(flag, mask).((
0720: 28 66 6c 61 67 29 20 26 20 28 6d 61 73 6b 29 29 (flag) & (mask))
0730: 20 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23 64 65 == (mask))..#de
0740: 66 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47 46 49 fine SSLKEYLOGFI
0750: 4c 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47 46 49 LE.."SSLKEYLOGFI
0760: 4c 45 22 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a LE"..../********
0770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a ************/./*
0780: 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 20 Callbacks
0790: 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./**********
07a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a **********/../*.
07b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
07c0: 2d 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 0a 20 2a 0a 20 2a 20 45 76 61 6c -----. *. * Eval
0800: 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e Callback Comman
0810: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 d --. *. *.Eval
0820: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
0830: 20 61 6e 64 20 63 61 74 63 68 20 61 6e 79 20 65 and catch any e
0840: 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 rrors. *. * Resu
0850: 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d lts:. *.0 = Comm
0860: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 66 61 69 and returned fai
0870: 6c 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e l or eval return
0880: 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 ed TCL_ERROR. *.
0890: 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 1 = Command retu
08a0: 72 6e 65 64 20 73 75 63 63 65 73 73 20 6f 72 20 rned success or
08b0: 65 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 eval returned TC
08c0: 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64 65 20 L_OK. *. * Side
08d0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 45 76 61 6c effects:. *.Eval
08e0: 75 61 74 65 73 20 63 61 6c 6c 62 61 63 6b 20 63 uates callback c
08f0: 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d ommand. *. *----
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a ---------------.
0940: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 45 */.static int.E
0950: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54 63 6c 5f valCallback(Tcl_
0960: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
0970: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c State *statePtr,
0980: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
0990: 29 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 ) {. int code
09a0: 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 64 , ok = 0;.. d
09b0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
09c0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 ;.. Tcl_Prese
09d0: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 rve((ClientData)
09e0: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 interp);. Tc
09f0: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 l_Preserve((Clie
0a00: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
0a10: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 );.. /* Eval
0a20: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 73 75 callback with su
0a30: 63 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f 72 20 ccess for ok or
0a40: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 31 2c 20 return value 1,
0a50: 66 61 69 6c 20 66 6f 72 20 65 72 72 6f 72 20 6f fail for error o
0a60: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 30 r return value 0
0a70: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 */. Tcl_Rese
0a80: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b tResult(interp);
0a90: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f . code = Tcl_
0aa0: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 EvalObjEx(interp
0ab0: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 , cmdPtr, TCL_EV
0ac0: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 AL_GLOBAL);.
0ad0: 64 70 72 69 6e 74 66 28 22 45 76 61 6c 43 61 6c dprintf("EvalCal
0ae0: 6c 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f 64 65 lback: %d", code
0af0: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 );. if (code
0b00: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a == TCL_OK) {../*
0b10: 20 43 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f Check result fo
0b20: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a r return value *
0b30: 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 /..Tcl_Obj *resu
0b40: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 lt = Tcl_GetObjR
0b50: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 esult(interp);..
0b60: 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 if (result == NU
0b70: 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 LL || Tcl_GetInt
0b80: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
0b90: 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 result, &ok) !=
0ba0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f TCL_OK) {.. o
0bb0: 6b 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 69 6e k = 1;..}..dprin
0bc0: 74 66 28 22 52 65 73 75 6c 74 3a 20 25 64 22 2c tf("Result: %d",
0bd0: 20 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ok);. } else
0be0: 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20 72 {../* Error - r
0bf0: 65 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 66 eject the certif
0c00: 69 63 61 74 65 20 2a 2f 0a 09 64 70 72 69 6e 74 icate */..dprint
0c10: 66 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e f("Tcl_Backgroun
0c20: 64 45 72 72 6f 72 22 29 3b 0a 23 69 66 20 28 54 dError");.#if (T
0c30: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
0c40: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d == 8) && (TCL_M
0c50: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 INOR_VERSION < 6
0c60: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e )..Tcl_Backgroun
0c70: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a dError(interp);.
0c80: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 #else..Tcl_Backg
0c90: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 roundException(i
0ca0: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 nterp, code);.#e
0cb0: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ndif. }..
0cc0: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
0cd0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
0ce0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 r);. Tcl_Rele
0cf0: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
0d00: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 interp);. re
0d10: 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a turn ok;.}.../*.
0d20: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
0d30: 2d 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 0a 20 2a 0a 20 2a 20 49 6e 66 6f -----. *. * Info
0d70: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 Callback --. *.
0d80: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 *.Monitors SSL c
0d90: 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 onnection proces
0da0: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
0db0: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
0dc0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
0dd0: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
0de0: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
0df0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
0e40: 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 void.InfoCallbac
0e50: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
0e60: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 , int where, int
0e70: 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 ret) {. Stat
0e80: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
0e90: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 tate*)SSL_get_ap
0ea0: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 p_data((SSL *)ss
0eb0: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 l);. Tcl_Inte
0ec0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
0ed0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
0ee0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
0ef0: 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 tr;. const ch
0f00: 61 72 20 2a 6d 61 6a 6f 72 2c 20 2a 6d 69 6e 6f ar *major, *mino
0f10: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 r;.. dprintf(
0f20: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
0f30: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 if (statePtr->ca
0f40: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f llback == (Tcl_O
0f50: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 bj*)NULL) {..ret
0f60: 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 urn;. }..
0f70: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
0f80: 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 CB_HANDSHAKE_STA
0f90: 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 RT) {..major = "
0fa0: 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e handshake";..min
0fb0: 6f 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 or = "start";.
0fc0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 } else if (whe
0fd0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 re & SSL_CB_HAND
0fe0: 53 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d SHAKE_DONE) {..m
0ff0: 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b ajor = "handshak
1000: 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f e";..minor = "do
1010: 6e 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ne";. } else
1020: 7b 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 53 {..if (where & S
1030: 53 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 SL_CB_ALERT)..ma
1040: 6a 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 jor = "alert";..
1050: 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 else if (where &
1060: 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 SSL_ST_CONNECT)
1070: 09 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 .major = "connec
1080: 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 t";..else if (wh
1090: 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 ere & SSL_ST_ACC
10a0: 45 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 EPT)..major = "a
10b0: 63 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 ccept";..else...
10c0: 09 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f ..major = "unkno
10d0: 77 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 wn";...if (where
10e0: 20 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 & SSL_CB_READ).
10f0: 09 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b .minor = "read";
1100: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 ..else if (where
1110: 20 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 & SSL_CB_WRITE)
1120: 09 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 ..minor = "write
1130: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 ";..else if (whe
1140: 72 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 re & SSL_CB_LOOP
1150: 29 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 )..minor = "loop
1160: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 ";..else if (whe
1170: 72 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 re & SSL_CB_EXIT
1180: 29 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 )..minor = "exit
1190: 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e ";..else.....min
11a0: 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a or = "unknown";.
11b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
11c0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
11d0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 eval with fn, ch
11e0: 61 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 an, major, minor
11f0: 2c 20 6d 65 73 73 61 67 65 2c 20 61 6e 64 20 74 , message, and t
1200: 79 70 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 ype args */.
1210: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
1220: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
1230: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 tr->callback);.
1240: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
1250: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
1260: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
1270: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e NewStringObj("in
1280: 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 fo", -1));. T
1290: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
12a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
12b0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
12c0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
12d0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
12e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
12f0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
1300: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1310: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1320: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
1330: 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 ngObj(major, -1)
1340: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
1350: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1360: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
1370: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1380: 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 (minor, -1));..
1390: 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 if (where & S
13a0: 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 SL_CB_ALERT) {..
13b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
13c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
13d0: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
13e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 l_NewStringObj(S
13f0: 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 SL_alert_desc_st
1400: 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 ring_long(ret),
1410: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
1420: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1430: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
1440: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
1450: 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f ngObj(SSL_alert_
1460: 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 type_string_long
1470: 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 (ret), -1));.
1480: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c } else {..Tcl_L
1490: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
14a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
14b0: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
14c0: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 StringObj(SSL_st
14d0: 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 ate_string_long(
14e0: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ssl), -1));..Tcl
14f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1500: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
1510: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
1520: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d ingObj("info", -
1530: 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 1));. }..
1540: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
1550: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
1560: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
1570: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 (cmdPtr);. Ev
1580: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 alCallback(inter
1590: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 p, statePtr, cmd
15a0: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 Ptr);. Tcl_De
15b0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
15c0: 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d r);.}.../*. *---
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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: 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 . *. * MessageCa
1620: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 llback --. *. *.
1630: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70 72 6f Monitors SSL pro
1640: 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 tocol messages.
1650: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
1660: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
1670: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
1680: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
1690: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d defined). *. *--
16a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 -. */.#ifndef OP
16f0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 ENSSL_NO_SSL_TRA
1700: 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 4d CE.static void.M
1710: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 essageCallback(i
1720: 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 nt write_p, int
1730: 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e version, int con
1740: 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 tent_type, const
1750: 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 void *buf, size
1760: 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c _t len, SSL *ssl
1770: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 , void *arg) {.
1780: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
1790: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 tr = (State*)arg
17a0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
17b0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
17c0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
17d0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
17e0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 65 72 2c ;. char *ver,
17f0: 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 *type;. BIO
1800: 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 *bio;. char b
1810: 75 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20 uffer[15000];.
1820: 20 20 62 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b buffer[0] = 0;
1830: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
1840: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
1850: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
1860: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
1870: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
1880: 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 n;. }.. sw
1890: 69 74 63 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a itch(version) {.
18a0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
18b0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
18c0: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
18d0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 ined(NO_SSL2) &&
18e0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
18f0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 L_NO_SSL2). c
1900: 61 73 65 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e ase SSL2_VERSION
1910: 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 32 22 :..ver = "SSLv2"
1920: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
1930: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
1940: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
1950: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
1960: 4c 33 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c L3). case SSL
1970: 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3_VERSION:..ver
1980: 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 = "SSLv3";..brea
1990: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 k;.#endif. ca
19a0: 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a se TLS1_VERSION:
19b0: 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b ..ver = "TLSv1";
19c0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
19d0: 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e e TLS1_1_VERSION
19e0: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e :..ver = "TLSv1.
19f0: 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 1";..break;.
1a00: 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 case TLS1_2_VERS
1a10: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 ION:..ver = "TLS
1a20: 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 v1.2";..break;.
1a30: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 case TLS1_3_V
1a40: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 ERSION:..ver = "
1a50: 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b TLSv1.3";..break
1a60: 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76 ;. case 0:..v
1a70: 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 er = "none";..br
1a80: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 eak;. default
1a90: 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 :..ver = "unknow
1aa0: 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 n";..break;.
1ab0: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 63 }.. switch (c
1ac0: 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 ontent_type) {.
1ad0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f case SSL3_RT_
1ae0: 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 HEADER:..type =
1af0: 22 48 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b "Header";..break
1b00: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f ;. case SSL3_
1b10: 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 RT_INNER_CONTENT
1b20: 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 _TYPE:..type = "
1b30: 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 Inner Content Ty
1b40: 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 pe";..break;.
1b50: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 case SSL3_RT_CH
1b60: 41 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 ANGE_CIPHER_SPEC
1b70: 3a 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 :..type = "Chang
1b80: 65 20 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61 e Cipher";..brea
1b90: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 k;. case SSL3
1ba0: 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 _RT_ALERT:..type
1bb0: 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 = "Alert";..bre
1bc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c ak;. case SSL
1bd0: 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 3_RT_HANDSHAKE:.
1be0: 09 74 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61 .type = "Handsha
1bf0: 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 ke";..break;.
1c00: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 case SSL3_RT_AP
1c10: 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a PLICATION_DATA:.
1c20: 09 74 79 70 65 20 3d 20 22 41 70 70 20 44 61 74 .type = "App Dat
1c30: 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20 a";..break;.#if
1c40: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
1c50: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
1c60: 30 30 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54 000L. case DT
1c70: 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54 LS1_RT_HEARTBEAT
1c80: 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 72 74 :..type = "Heart
1c90: 62 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 beat";..break;.#
1ca0: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c endif. defaul
1cb0: 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e t:..type = "unkn
1cc0: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 own";. }..
1cd0: 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c /* Needs compil
1ce0: 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 e time option "e
1cf0: 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 nable-ssl-trace"
1d00: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69 . */. if ((bi
1d10: 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f o = BIO_new(BIO_
1d20: 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c s_mem())) != NUL
1d30: 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 L) {..int n;..SS
1d40: 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c L_trace(write_p,
1d50: 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e version, conten
1d60: 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e t_type, buf, len
1d70: 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 , ssl, (void *)b
1d80: 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 io);..n = BIO_re
1d90: 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 ad(bio, buffer,
1da0: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 BIO_pending(bio)
1db0: 20 3c 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70 < 15000 ? BIO_p
1dc0: 65 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34 ending(bio) : 14
1dd0: 39 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 999);..n = (n<0)
1de0: 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65 ? 0 : n;..buffe
1df0: 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64 r[n] = 0;..(void
1e00: 29 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b )BIO_flush(bio);
1e10: 0a 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b ..BIO_free(bio);
1e20: 0a 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e . }.. dprin
1e30: 74 66 28 22 4d 65 73 73 61 67 65 20 64 69 72 65 tf("Message dire
1e40: 63 74 69 6f 6e 3d 25 64 2c 20 76 65 72 3d 25 73 ction=%d, ver=%s
1e50: 2c 20 74 79 70 65 3d 25 73 2c 20 6d 65 73 73 61 , type=%s, messa
1e60: 67 65 3d 25 73 22 2c 20 77 72 69 74 65 5f 70 2c ge=%s", write_p,
1e70: 20 76 65 72 2c 20 74 79 70 65 2c 20 26 62 75 66 ver, type, &buf
1e80: 66 65 72 5b 30 5d 29 3b 0a 0a 20 20 20 20 2f 2a fer[0]);.. /*
1e90: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 Create command
1ea0: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c to eval with fn,
1eb0: 20 63 68 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e chan, direction
1ec0: 2c 20 76 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c , version, type,
1ed0: 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 and message arg
1ee0: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 s */. cmdPtr
1ef0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
1f00: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c bj(statePtr->cal
1f10: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f lback);. Tcl_
1f20: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1f30: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1f40: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
1f50: 6e 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c ngObj("message",
1f60: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
1f70: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1f80: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1f90: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
1fa0: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 StringObj(Tcl_Ge
1fb0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
1fc0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
1fd0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
1fe0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1ff0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2000: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
2010: 6a 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e j(write_p ? "Sen
2020: 74 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c t" : "Received",
2030: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
2040: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2050: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2060: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
2070: 67 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a gObj(ver, -1));.
2080: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2090: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
20a0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
20b0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 _NewStringObj(ty
20c0: 70 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 pe, -1));. Tc
20d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
20e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
20f0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
2100: 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 ringObj(buffer,
2110: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 -1));.. /* Ev
2120: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
2130: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
2140: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
2150: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c tr);. EvalCal
2160: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
2170: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b atePtr, cmdPtr);
2180: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
2190: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d Count(cmdPtr);.}
21a0: 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d .#endif.../*. *-
21b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 --. *. * VerifyC
2200: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a allback --. *. *
2210: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 .Monitors SSL ce
2220: 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 rtificate valida
2230: 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 tion process. Us
2240: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 ed to control th
2250: 65 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 e. *.behavior wh
2260: 65 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 en the SSL_VERIF
2270: 59 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 Y_PEER flag is s
2280: 65 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c et. This is call
2290: 65 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 ed. *.whenever a
22a0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 certificate is
22b0: 69 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 inspected or dec
22c0: 69 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 ided invalid. Ca
22d0: 6c 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 lled for. *.each
22e0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 certificate in
22f0: 74 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a the cert chain..
2300: 20 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a *. * Checks:. *
2310: 09 54 68 65 20 63 65 72 74 69 66 69 63 61 74 65 .The certificate
2320: 20 63 68 61 69 6e 20 69 73 20 63 68 65 63 6b 65 chain is checke
2330: 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 d starting with
2340: 74 68 65 20 64 65 65 70 65 73 74 20 6e 65 73 74 the deepest nest
2350: 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28 ing level. *. (
2360: 74 68 65 20 72 6f 6f 74 20 43 41 20 63 65 72 74 the root CA cert
2370: 69 66 69 63 61 74 65 29 20 61 6e 64 20 77 6f 72 ificate) and wor
2380: 6b 65 64 20 75 70 77 61 72 64 20 74 6f 20 74 68 ked upward to th
2390: 65 20 70 65 65 72 27 73 20 63 65 72 74 69 66 69 e peer's certifi
23a0: 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 cate.. *.All sig
23b0: 6e 61 74 75 72 65 73 20 61 72 65 20 76 61 6c 69 natures are vali
23c0: 64 2c 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 d, current time
23d0: 69 73 20 77 69 74 68 69 6e 20 66 69 72 73 74 20 is within first
23e0: 61 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 69 74 and last validit
23f0: 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b y time.. *.Check
2400: 20 74 68 61 74 20 74 68 65 20 63 65 72 74 69 66 that the certif
2410: 69 63 61 74 65 20 69 73 20 69 73 73 75 65 64 20 icate is issued
2420: 62 79 20 74 68 65 20 69 73 73 75 65 72 20 63 65 by the issuer ce
2430: 72 74 69 66 69 63 61 74 65 20 69 73 73 75 65 72 rtificate issuer
2440: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 72 .. *.Check the r
2450: 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 evocation status
2460: 20 66 6f 72 20 65 61 63 68 20 63 65 72 74 69 66 for each certif
2470: 69 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20 icate.. *.Check
2480: 74 68 65 20 76 61 6c 69 64 69 74 79 20 6f 66 20 the validity of
2490: 74 68 65 20 67 69 76 65 6e 20 43 52 4c 20 61 6e the given CRL an
24a0: 64 20 74 68 65 20 63 65 72 74 20 72 65 76 6f 63 d the cert revoc
24b0: 61 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a ation status.. *
24c0: 09 43 68 65 63 6b 20 74 68 65 20 70 6f 6c 69 63 .Check the polic
24d0: 69 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 ies of all the c
24e0: 65 72 74 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 ertificates. *.
24f0: 2a 20 41 72 67 73 0a 20 2a 09 70 72 65 76 65 72 * Args. *.prever
2500: 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73 ify_ok indicates
2510: 20 77 68 65 74 68 65 72 20 74 68 65 20 63 65 72 whether the cer
2520: 74 69 66 69 63 61 74 65 20 76 65 72 69 66 69 63 tificate verific
2530: 61 74 69 6f 6e 20 70 61 73 73 65 64 20 28 31 29 ation passed (1)
2540: 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 or not (0). *.
2550: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
2560: 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 callback bound t
2570: 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 o the socket may
2580: 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a return one of:.
2590: 20 2a 09 20 20 20 20 30 09 09 09 2d 20 74 68 65 *. 0...- the
25a0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 certificate is
25b0: 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20 deemed invalid,
25c0: 73 65 6e 64 20 76 65 72 69 66 69 63 61 74 69 6f send verificatio
25d0: 6e 0a 20 2a 09 09 09 09 20 20 66 61 69 6c 75 72 n. *.... failur
25e0: 65 20 61 6c 65 72 74 20 74 6f 20 70 65 65 72 2c e alert to peer,
25f0: 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 20 68 and terminate h
2600: 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 andshake.. *.
2610: 20 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 1...- the certi
2620: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 ficate is deemed
2630: 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65 valid, continue
2640: 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 2e with handshake.
2650: 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 20 73 74 . *. empty st
2660: 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 ring.- no change
2670: 20 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 20 to certificate
2680: 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a validation. *. *
2690: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
26a0: 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 *.The err field
26b0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 of the currently
26c0: 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 operative State
26d0: 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 is set. *. to
26e0: 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 a string describ
26f0: 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f ing the SSL nego
2700: 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 tiation failure
2710: 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d reason. *. *----
2720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a ---------------.
2760: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 */.static int.V
2770: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e erifyCallback(in
2780: 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 t ok, X509_STORE
2790: 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 20 20 _CTX *ctx) {.
27a0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
27b0: 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c ;. SSL *ssl
27c0: 09 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 ..= (SSL*)X509_S
27d0: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f TORE_CTX_get_ex_
27e0: 64 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 data(ctx, SSL_ge
27f0: 74 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 t_ex_data_X509_S
2800: 54 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b TORE_CTX_idx());
2810: 0a 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74 . X509 *cert
2820: 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 ..= X509_STORE_C
2830: 54 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 TX_get_current_c
2840: 65 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74 ert(ctx);. St
2850: 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 ate *statePtr.=
2860: 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f (State*)SSL_get_
2870: 61 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 app_data(ssl);.
2880: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
2890: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
28a0: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e ->interp;. in
28b0: 74 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f t depth..= X509_
28c0: 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 STORE_CTX_get_er
28d0: 72 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a ror_depth(ctx);.
28e0: 20 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 int err..= X
28f0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 509_STORE_CTX_ge
2900: 74 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 t_error(ctx);..
2910: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
2920: 65 64 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 ed");. dprint
2930: 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 f("VerifyCallbac
2940: 6b 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 k: %d", ok);..
2950: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
2960: 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a vcmd == (Tcl_Obj
2970: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 *)NULL) {../* Us
2980: 65 20 6f 6b 20 76 61 6c 75 65 20 69 66 20 76 65 e ok value if ve
2990: 72 69 66 69 63 61 74 69 6f 6e 20 69 73 20 72 65 rification is re
29a0: 71 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 28 73 quired */..if (s
29b0: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 tatePtr->vflags
29c0: 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 & SSL_VERIFY_FAI
29d0: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 L_IF_NO_PEER_CER
29e0: 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e T) {.. return
29f0: 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 ok;..} else {..
2a00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d return 1;..}
2a10: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
2a20: 63 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 cert == NULL ||
2a30: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ssl == NULL) {..
2a40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a return 0;. }.
2a50: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 . dprintf("Ve
2a60: 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 65 76 rifyCallback: ev
2a70: 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a al callback");..
2a80: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f /* Create co
2a90: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 mmand to eval wi
2aa0: 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70 th fn, chan, dep
2ab0: 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c 69 th, cert info li
2ac0: 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 20 st, status, and
2ad0: 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20 error args */.
2ae0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
2af0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
2b00: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
2b10: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2b20: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2b30: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
2b40: 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 wStringObj("veri
2b50: 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 fy", -1));. T
2b60: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2b70: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2b80: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 cmdPtr,..Tcl_New
2b90: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 StringObj(Tcl_Ge
2ba0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
2bb0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
2bc0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2bd0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2be0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2bf0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 Tcl_NewIntObj(d
2c00: 65 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f epth));. Tcl_
2c10: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2c20: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
2c30: 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 Ptr, Tls_NewX509
2c40: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 Obj(interp, cert
2c50: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2c60: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2c70: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2c80: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f Tcl_NewIntObj(o
2c90: 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 k));. Tcl_Lis
2ca0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2cb0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2cc0: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 ,..Tcl_NewString
2cd0: 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f Obj((char*)X509_
2ce0: 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f verify_cert_erro
2cf0: 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d r_string(err), -
2d00: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 1));.. /* Pre
2d10: 76 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 vent I/O while c
2d20: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72 allback is in pr
2d30: 6f 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a ogress */. /*
2d40: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 statePtr->flags
2d50: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c |= TLS_TCL_CALL
2d60: 42 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a BACK; */.. /*
2d70: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 Eval callback c
2d80: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 ommand */. Tc
2d90: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
2da0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d mdPtr);. ok =
2db0: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e EvalCallback(in
2dc0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
2dd0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c cmdPtr);. Tcl
2de0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
2df0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 64 70 72 69 dPtr);.. dpri
2e00: 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 ntf("VerifyCallb
2e10: 61 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72 65 73 ack: command res
2e20: 75 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29 3b 0a ult = %d", ok);.
2e30: 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 . /* statePtr
2e40: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 ->flags &= ~(TLS
2e50: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 _TCL_CALLBACK);
2e60: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b */. return ok
2e70: 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c ;./* By default,
2e80: 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 leave verificat
2e90: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a ion unchanged. *
2ea0: 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d /.}.../*. *-----
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 --------------.
2ef0: 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d *. * Tls_Error -
2f00: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 -. *. *.Calls ca
2f10: 6c 6c 62 61 63 6b 20 77 69 74 68 20 65 72 72 6f llback with erro
2f20: 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a r message.. *. *
2f30: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
2f40: 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 *.The err field
2f50: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 of the currently
2f60: 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 operative State
2f70: 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 is set. *. to
2f80: 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 a string describ
2f90: 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f ing the SSL nego
2fa0: 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 tiation failure
2fb0: 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d reason. *. *----
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a ---------------.
3000: 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 */.void.Tls_Err
3010: 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 or(State *stateP
3020: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tr, const char *
3030: 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 msg) {. Tcl_I
3040: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
3050: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
3060: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
3070: 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b mdPtr, *listPtr;
3080: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f . unsigned lo
3090: 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 74 61 74 ng err;. stat
30a0: 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b ePtr->err = msg;
30b0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
30c0: 61 6c 6c 65 64 20 77 69 74 68 20 6d 65 73 73 61 alled with messa
30d0: 67 65 20 25 73 22 2c 20 6d 73 67 29 3b 0a 0a 20 ge %s", msg);..
30e0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
30f0: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 >callback == (Tc
3100: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
3110: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 return;. }..
3120: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
3130: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 mand to eval wit
3140: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 h fn, chan, and
3150: 6d 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a message args */.
3160: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
3170: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
3180: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
3190: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
31a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
31b0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
31c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
31d0: 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a ("error", -1));.
31e0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
31f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3200: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
3210: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
3220: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
3230: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
3240: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
3250: 20 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c if (msg != NULL
3260: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ) {..Tcl_ListObj
3270: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3280: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
3290: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
32a0: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d sg, -1));.. }
32b0: 20 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d else if ((msg =
32c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 Tcl_GetString(T
32d0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
32e0: 69 6e 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c interp))) != NUL
32f0: 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 L) {..Tcl_ListOb
3300: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3310: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3320: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
3330: 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 msg, -1));..
3340: 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 } else {..listPt
3350: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
3360: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 bj(0, NULL);..wh
3370: 69 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f ile ((err = ERR_
3380: 67 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 get_error()) !=
3390: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 0) {.. Tcl_Li
33a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
33b0: 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 nt(interp, listP
33c0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
33d0: 67 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f gObj(ERR_reason_
33e0: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 error_string(err
33f0: 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c ), -1));..}..Tcl
3400: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3410: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3420: 64 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a dPtr, listPtr);.
3430: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 }.. /* Ev
3440: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
3450: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
3460: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
3470: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c tr);. EvalCal
3480: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
3490: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b atePtr, cmdPtr);
34a0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
34b0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d Count(cmdPtr);.}
34c0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
34d0: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 -----------. *.
3510: 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b * KeyLogCallback
3520: 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 --. *. *.Write
3530: 72 65 63 65 69 76 65 64 20 6b 65 79 20 64 61 74 received key dat
3540: 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 a to log file..
3550: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
3560: 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.none. *. *
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35b0: 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 ---. */.void Key
35c0: 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 LogCallback(cons
35d0: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 t SSL *ssl, cons
35e0: 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a t char *line) {.
35f0: 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 char *str =
3600: 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 getenv(SSLKEYLOG
3610: 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 FILE);. FILE
3620: 2a 66 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 *fd;.. dprint
3630: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
3640: 20 20 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 if (str) {..fd
3650: 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 = fopen(str, "a
3660: 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c ");..fprintf(fd,
3670: 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 "%s\n",line);..
3680: 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 fclose(fd);.
3690: 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d }.}.../*. *-----
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 --------------.
36e0: 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 *. * Password Ca
36f0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 llback --. *. *.
3700: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 Called when a pa
3710: 73 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 ssword is needed
3720: 20 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b for a private k
3730: 65 79 20 77 68 65 6e 20 6c 6f 61 64 69 6e 67 0a ey when loading.
3740: 20 2a 09 6f 72 20 73 74 6f 72 69 6e 67 20 61 20 *.or storing a
3750: 50 45 4d 20 63 65 72 74 69 66 69 63 61 74 65 20 PEM certificate
3760: 77 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e with encryption.
3770: 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 0a Evals callback.
3780: 20 2a 09 73 63 72 69 70 74 20 61 6e 64 20 72 65 *.script and re
3790: 74 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 turns the result
37a0: 20 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 64 as the password
37b0: 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a string in buf..
37c0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
37d0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
37e0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
37f0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
3800: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
3810: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73 Returns:. *.Pass
3820: 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74 word size in byt
3830: 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 es or -1 for an
3840: 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d error.. *. *----
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a ---------------.
3890: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 */.static int.P
38a0: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 asswordCallback(
38b0: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 char *buf, int s
38c0: 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c ize, int rwflag,
38d0: 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a void *udata) {.
38e0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
38f0: 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 Ptr.= (State *)
3900: 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 udata;. Tcl_I
3910: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
3920: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
3930: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
3940: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
3950: 6f 64 65 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a ode;. Tcl_Siz
3960: 65 20 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 e len;.. dpri
3970: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
3980: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c /* If no cal
3990: 6c 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 lback, use defau
39a0: 6c 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 lt callback */.
39b0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
39c0: 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c >password == NUL
39d0: 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 L) {..if (Tcl_Ev
39e0: 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c alEx(interp, "tl
39f0: 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 s::password", -1
3a00: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 , TCL_EVAL_GLOBA
3a10: 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a L) == TCL_OK) {.
3a20: 09 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d . char *ret =
3a30: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 (char *) Tcl_Ge
3a40: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 tStringFromObj(T
3a50: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
3a60: 69 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a interp), &len);.
3a70: 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 28 . if (len > (
3a80: 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 Tcl_Size) size-1
3a90: 29 20 7b 0a 09 09 6c 65 6e 20 3d 20 28 54 63 6c ) {...len = (Tcl
3aa0: 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 _Size) size-1;..
3ab0: 20 20 20 20 7d 0a 09 20 20 20 20 73 74 72 6e 63 }.. strnc
3ac0: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 py(buf, ret, (si
3ad0: 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 ze_t) len);..
3ae0: 20 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 buf[len] = '\0'
3af0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 ;.. return (i
3b00: 6e 74 29 20 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65 nt) len;..} else
3b10: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d {.. return -
3b20: 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 1;..}. }..
3b30: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
3b40: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 nd to eval with
3b50: 66 6e 2c 20 72 77 66 6c 61 67 2c 20 61 6e 64 20 fn, rwflag, and
3b60: 73 69 7a 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 size args */.
3b70: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
3b80: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
3b90: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a Ptr->password);.
3ba0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
3bb0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3bc0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
3bd0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 _NewStringObj("p
3be0: 61 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a assword", -1));.
3bf0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
3c00: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3c10: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
3c20: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 _NewIntObj(rwfla
3c30: 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 g));. Tcl_Lis
3c40: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3c50: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3c60: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
3c70: 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c size));.. Tcl
3c80: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
3c90: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a tData) interp);.
3ca0: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
3cb0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
3cc0: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a atePtr);.. /*
3cd0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 Eval callback c
3ce0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 ommand */. Tc
3cf0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
3d00: 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 mdPtr);. code
3d10: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 = Tcl_EvalObjEx
3d20: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3d30: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
3d40: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 );. if (code
3d50: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 != TCL_OK) {.#if
3d60: 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 (TCL_MAJOR_VERS
3d70: 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 ION == 8) && (TC
3d80: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MINOR_VERSION
3d90: 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 < 6)..Tcl_Backgr
3da0: 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 oundError(interp
3db0: 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 );.#else..Tcl_Ba
3dc0: 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f ckgroundExceptio
3dd0: 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b n(interp, code);
3de0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 .#endif. }.
3df0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
3e00: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 nt(cmdPtr);..
3e10: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c Tcl_Release((Cl
3e20: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
3e30: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 tr);.. /* If
3e40: 73 75 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 successful, pass
3e50: 20 62 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 back password s
3e60: 74 72 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 tring and trunca
3e70: 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a te if too long *
3e80: 2f 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d /. if (code =
3e90: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 = TCL_OK) {..cha
3ea0: 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a r *ret = (char *
3eb0: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
3ec0: 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 romObj(Tcl_GetOb
3ed0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c jResult(interp),
3ee0: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e &len);..if (len
3ef0: 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 > (Tcl_Size) si
3f00: 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e ze-1) {.. len
3f10: 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 = (Tcl_Size) si
3f20: 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 ze-1;..}..strncp
3f30: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a y(buf, ret, (siz
3f40: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b e_t) len);..buf[
3f50: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 len] = '\0';..Tc
3f60: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
3f70: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a tData) interp);.
3f80: 09 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 .return (int) le
3f90: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c n;. }. Tcl
3fa0: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
3fb0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
3fc0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a return -1;.}.
3fd0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
3fe0: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a ----------. *. *
4020: 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 Session Callbac
4030: 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d k for Clients --
4040: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 . *. *.Called wh
4050: 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e en a new session
4060: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 is added to the
4070: 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 cache. In TLS 1
4080: 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 .3. *.this may b
4090: 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 e received multi
40a0: 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 ple times after
40b0: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 the handshake. F
40c0: 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 or. *.earlier ve
40d0: 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c rsions, this wil
40e0: 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 l be received du
40f0: 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 ring the handsha
4100: 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 ke.. *.This is t
4110: 68 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 he preferred way
4120: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 to obtain a res
4130: 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a umable session..
4140: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
4150: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
4160: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
4170: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
4180: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
4190: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a Return codes:. *
41a0: 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 .0 = error where
41b0: 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 session will be
41c0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d immediately rem
41d0: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e oved from the in
41e0: 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a ternal cache.. *
41f0: 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 .1 = success whe
4200: 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 re app retains s
4210: 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f ession in sessio
4220: 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 n cache, and mus
4230: 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 t call SSL_SESSI
4240: 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 ON_free() when d
4250: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a -------------. *
42a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 /.static int.Ses
42b0: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c sionCallback(SSL
42c0: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 *ssl, SSL_SESSI
42d0: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 ON *session) {.
42e0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
42f0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr = (State*)SSL
4300: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 _get_app_data((S
4310: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 SL *)ssl);. T
4320: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
4330: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
4340: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
4350: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 j *cmdPtr;. c
4360: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
4370: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 ar *ticket;.
4380: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
4390: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b har *session_id;
43a0: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 . size_t len2
43b0: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 ;. unsigned i
43c0: 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 nt ulen;.. dp
43d0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
43e0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
43f0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 tr->callback ==
4400: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 (Tcl_Obj*)NULL)
4410: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
4420: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
4430: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 } else if (ssl
4440: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
4450: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
4460: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a R_NOACK;. }..
4470: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f /* Create co
4480: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 mmand to eval wi
4490: 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73 th fn, chan, ses
44a0: 73 69 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e sion id, session
44b0: 20 74 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66 ticket, and lif
44c0: 65 74 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 etime args */.
44d0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
44e0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
44f0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
4500: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4510: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4520: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
4530: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
4540: 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a session", -1));.
4550: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4560: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4570: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
4580: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
4590: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
45a0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
45b0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 self), -1));..
45c0: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 /* Session id
45d0: 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 */. session_i
45e0: 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f d = SSL_SESSION_
45f0: 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 get_id(session,
4600: 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f &ulen);. Tcl_
4610: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
4620: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
4630: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 Ptr, Tcl_NewByte
4640: 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e ArrayObj(session
4650: 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 _id, (Tcl_Size)
4660: 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 ulen));.. /*
4670: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a Session ticket *
4680: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f /. SSL_SESSIO
4690: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 N_get0_ticket(se
46a0: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 ssion, &ticket,
46b0: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f &len2);. Tcl_
46c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
46d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
46e0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 Ptr, Tcl_NewByte
46f0: 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c ArrayObj(ticket,
4700: 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
4710: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 ));.. /* Life
4720: 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 time - number of
4730: 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 seconds */.
4740: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
4750: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
4760: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 cmdPtr,..Tcl_Ne
4770: 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 wLongObj((long)
4780: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
4790: 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f ticket_lifetime_
47a0: 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b hint(session)));
47b0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
47c0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
47d0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
47e0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
47f0: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b EvalCallback
4800: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
4810: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 r, cmdPtr);.
4820: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
4830: 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f (cmdPtr);.. /
4840: 2a 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 6e * Return 0 for n
4850: 6f 77 20 75 6e 74 69 6c 20 73 65 73 73 69 6f 6e ow until session
4860: 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 63 6f 6d handling is com
4870: 70 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 plete */. ret
4880: 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a urn 0;.}.../*. *
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 ---. *. * ALPN C
48e0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 allback for Serv
48f0: 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c ers and NPN Call
4900: 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 back for Clients
4910: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 --. *. *.Perfor
4920: 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 m protocol (http
4930: 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 /1.1, h2, h3, et
4940: 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f c.) selection fo
4950: 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e r the. *.incomin
4960: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 g connection. Ca
4970: 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f lled after Hello
4980: 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c and server call
4990: 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 backs.. *.Where
49a0: 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 65 'out' is selecte
49b0: 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 d protocol and '
49c0: 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 20 in' is the peer
49d0: 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e advertised list.
49e0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
49f0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
4a00: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
4a10: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
4a20: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
4a30: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 Return codes:.
4a40: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
4a50: 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 _OK: ALPN protoc
4a60: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 ol selected. The
4a70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
4a80: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c inues.. *.SSL_TL
4a90: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 SEXT_ERR_ALERT_F
4aa0: 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 ATAL: There was
4ab0: 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 no overlap betwe
4ac0: 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a en the client's.
4ad0: 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 *. supplied
4ae0: 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 list and the ser
4af0: 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f ver configuratio
4b00: 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f n. The connectio
4b10: 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 n will be aborte
4b20: 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 d.. *.SSL_TLSEXT
4b30: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e _ERR_NOACK: ALPN
4b40: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 protocol not se
4b50: 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 lected, e.g., be
4b60: 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a cause no ALPN. *
4b70: 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 . protocols a
4b80: 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f re configured fo
4b90: 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f r this connectio
4ba0: 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f n. The connectio
4bb0: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a n continues.. *.
4bc0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4bd0: 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
4c10: 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 int.ALPNCallbac
4c20: 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 k(SSL *ssl, cons
4c30: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
4c40: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 **out, unsigned
4c50: 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 char *outlen,..c
4c60: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
4c70: 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 ar *in, unsigned
4c80: 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 int inlen, void
4c90: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
4ca0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
4cb0: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 State*)arg;.
4cc0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
4cd0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
4ce0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
4cf0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
4d00: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a int code, res;..
4d10: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
4d20: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
4d30: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 ssl == NULL || a
4d40: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 rg == NULL) {..r
4d50: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
4d60: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
4d70: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 }.. /* Select
4d80: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 protocol */.
4d90: 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f if (SSL_select_
4da0: 6e 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69 next_proto((unsi
4db0: 67 6e 65 64 20 63 68 61 72 20 2a 2a 29 20 6f 75 gned char **) ou
4dc0: 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 t, outlen, state
4dd0: 50 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 Ptr->protos, sta
4de0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 tePtr->protos_le
4df0: 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d n,..in, inlen) =
4e00: 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 = OPENSSL_NPN_NE
4e10: 47 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 GOTIATED) {../*
4e20: 4d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 Match found */..
4e30: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
4e40: 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 _ERR_OK;. } e
4e50: 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 lse {../* OPENSS
4e60: 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 L_NPN_NO_OVERLAP
4e70: 20 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 = No overlap, s
4e80: 6f 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d o use first item
4e90: 20 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f from client pro
4ea0: 74 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 tocol list */..r
4eb0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
4ec0: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
4ed0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
4ee0: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c tr->vcmd == (Tcl
4ef0: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 _Obj*)NULL) {..r
4f00: 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d eturn res;. }
4f10: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
4f20: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
4f30: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 with fn, chan, d
4f40: 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 epth, cert info
4f50: 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e list, status, an
4f60: 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a d error args */.
4f70: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
4f80: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
4f90: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 atePtr->vcmd);.
4fa0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
4fb0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4fc0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
4fd0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c NewStringObj("al
4fe0: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 pn", -1));. T
4ff0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
5000: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
5010: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
5020: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
5030: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
5040: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
5050: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
5060: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5070: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5080: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
5090: 6e 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 ngObj((const cha
50a0: 72 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b r *) *out, -1));
50b0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
50c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
50d0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
50e0: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 l_NewBooleanObj(
50f0: 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 res == SSL_TLSEX
5100: 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 T_ERR_OK));..
5110: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 /* Eval callbac
5120: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 k command */.
5130: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
5140: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 t(cmdPtr);. i
5150: 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 f ((code = EvalC
5160: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
5170: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
5180: 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d )) > 1) {..res =
5190: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
51a0: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 NOACK;. } els
51b0: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 e if (code == 1)
51c0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
51d0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
51e0: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
51f0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5200: 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 ALERT_FATAL;.
5210: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 }. Tcl_DecrR
5220: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
5230: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b . return res;
5240: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a -------------. *
5290: 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 . * Advertise Pr
52a0: 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b otocols Callback
52b0: 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 for Next Protoc
52c0: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 ol Negotiation (
52d0: 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 NPN) in ServerHe
52e0: 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c llo --. *. *.cal
52f0: 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 led when a TLS s
5300: 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 erver needs a li
5310: 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 st of supported
5320: 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 protocols for Ne
5330: 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e xt. *.Protocol N
5340: 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 egotiation.. *.
5350: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
5360: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
5370: 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 fects:. *. * Ret
5380: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
5390: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a L_TLSEXT_ERR_OK:
53a0: 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 NPN protocol se
53b0: 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e lected. The conn
53c0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
53d0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
53e0: 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 ERR_NOACK: NPN p
53f0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 rotocol not sele
5400: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 cted. The connec
5410: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a tion continues..
5420: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
5430: 2d 2d 2d 2d 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 0a 20 2a 2f 0a 23 69 66 --------. */.#if
5470: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 def USE_NPN.stat
5480: 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 ic int.NPNCallba
5490: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 ck(const SSL *ss
54a0: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 l, const unsigne
54b0: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e d char **out, un
54c0: 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c signed int *outl
54d0: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b en, void *arg) {
54e0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
54f0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
5500: 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 rg;.. dprintf
5510: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
5520: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
5530: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 || arg == NULL)
5540: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
5550: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
5560: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
5570: 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 et protocols lis
5580: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 t */. if (sta
5590: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d tePtr->protos !=
55a0: 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d NULL) {..*out =
55b0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
55c0: 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 s;..*outlen = st
55d0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c atePtr->protos_l
55e0: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b en;. } else {
55f0: 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 ..*out = NULL;..
5600: 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 *outlen = 0;..re
5610: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
5620: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
5630: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f . return SSL_
5640: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d TLSEXT_ERR_OK;.}
5650: 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d .#endif.../*. *-
5660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c --. *. * SNI Cal
56b0: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 lback for Server
56c0: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f s --. *. *.Perfo
56d0: 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 rm server-side S
56e0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 NI hostname sele
56f0: 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 ction after rece
5700: 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 iving SNI extens
5710: 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 ion. *.in Client
5720: 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 Hello. Called a
5730: 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 fter hello callb
5740: 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 ack but before A
5750: 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a LPN callback.. *
5760: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
5770: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
5780: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
5790: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
57a0: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 efined). *. * Re
57b0: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 turn codes:. *.S
57c0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
57d0: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 : SNI hostname i
57e0: 73 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 s accepted. The
57f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
5800: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
5810: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 EXT_ERR_ALERT_FA
5820: 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d TAL: SNI hostnam
5830: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 e is not accepte
5840: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f d. The connectio
5850: 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 n. *. is abor
5860: 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 ted. Default for
5870: 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 alert is SSL_AD
5880: 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 _UNRECOGNIZED_NA
5890: 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 ME.. *.SSL_TLSEX
58a0: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e T_ERR_ALERT_WARN
58b0: 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d ING: SNI hostnam
58c0: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 e is not accepte
58d0: 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 d, warning alert
58e0: 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f . *. sent (no
58f0: 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 t supported in T
5900: 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e LSv1.3). The con
5910: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
5920: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s.. *.SSL_TLSEXT
5930: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 _ERR_NOACK: SNI
5940: 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 hostname is not
5950: 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 accepted and not
5960: 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 acknowledged,.
5970: 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e *. e.g. if SN
5980: 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 I has not been c
5990: 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 onfigured. The c
59a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
59b0: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ues.. *. *------
59c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a -------------. *
5a00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 /.static int.SNI
5a10: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
5a20: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c SL *ssl, int *al
5a30: 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 ert, void *arg)
5a40: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
5a50: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
5a60: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 arg;. Tcl_Int
5a70: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
5a80: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
5a90: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 Tcl_Obj *cmd
5aa0: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 Ptr;. int cod
5ab0: 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 e, res;. cons
5ac0: 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 t char *serverna
5ad0: 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 me = NULL;..
5ae0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
5af0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 );.. if (ssl
5b00: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d == NULL || arg =
5b10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
5b20: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
5b30: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
5b40: 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 /* Only works
5b50: 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 for TLS 1.2 and
5b60: 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 earlier */.
5b70: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c servername = SSL
5b80: 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 _get_servername(
5b90: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 ssl, TLSEXT_NAME
5ba0: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b TYPE_host_name);
5bb0: 0a 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72 . if (!server
5bc0: 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 name || serverna
5bd0: 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b me[0] == '\0') {
5be0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
5bf0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
5c00: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
5c10: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 atePtr->vcmd ==
5c20: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 (Tcl_Obj*)NULL)
5c30: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
5c40: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
5c50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
5c60: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
5c70: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c l with fn, chan,
5c80: 20 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 and server name
5c90: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 args */. cmd
5ca0: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
5cb0: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
5cc0: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f >vcmd);. Tcl_
5cd0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5ce0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5cf0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
5d00: 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 ngObj("sni", -1)
5d10: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
5d20: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
5d30: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
5d40: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
5d50: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 ngObj(Tcl_GetCha
5d60: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
5d70: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a r->self), -1));.
5d80: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
5d90: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
5da0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
5db0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 _NewStringObj(se
5dc0: 72 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b rvername , -1));
5dd0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
5de0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
5df0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
5e00: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
5e10: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 if ((code =
5e20: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
5e30: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
5e40: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 mdPtr)) > 1) {..
5e50: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
5e60: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 _ERR_ALERT_WARNI
5e70: 4e 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 NG;..*alert = SS
5e80: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 L_AD_UNRECOGNIZE
5e90: 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 D_NAME; /* Not s
5ea0: 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 upported by TLS
5eb0: 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 1.3 */. } els
5ec0: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 e if (code == 1)
5ed0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
5ee0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
5ef0: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
5f00: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5f10: 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 ALERT_FATAL;..*a
5f20: 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e lert = SSL_AD_UN
5f30: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b RECOGNIZED_NAME;
5f40: 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 /* Not supporte
5f50: 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a d by TLS 1.3 */.
5f60: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 }. Tcl_De
5f70: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
5f80: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 r);. return r
5f90: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d es;.}.../*. *---
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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: 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c . *. * ClientHel
5ff0: 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c lo Handshake Cal
6000: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 lback for Server
6010: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 s --. *. *.Used
6020: 62 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 by server to exa
6030: 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 mine the server
6040: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 name indication
6050: 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a (SNI) extension.
6060: 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 *.provided by t
6070: 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 he client in ord
6080: 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 er to select an
6090: 61 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 appropriate cert
60a0: 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 ificate to. *.pr
60b0: 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 esent, and make
60c0: 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 other configurat
60d0: 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 ion adjustments
60e0: 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 relevant to that
60f0: 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 server. *.name
6100: 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 and its configur
6110: 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c ation. This incl
6120: 75 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 udes swapping ou
6130: 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 t the associated
6140: 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e . *.SSL_CTX poin
6150: 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 ter, modifying t
6160: 68 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 he server's list
6170: 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c of permitted TL
6180: 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 S versions,. *.c
6190: 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 hanging the serv
61a0: 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 er's cipher list
61b0: 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 in response to
61c0: 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 the client's cip
61d0: 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 her list, etc..
61e0: 2a 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 *.Called before
61f0: 53 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c SNI and ALPN cal
6200: 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 lbacks.. *. * Re
6210: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
6220: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
6230: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
6240: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
6250: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 ). *. * Return c
6260: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 odes:. *.SSL_CLI
6270: 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a ENT_HELLO_RETRY:
6280: 20 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e suspend the han
6290: 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 dshake, and the
62a0: 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 handshake functi
62b0: 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 on will return i
62c0: 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 mmediately. *.SS
62d0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
62e0: 52 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 RROR: failure, t
62f0: 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 erminate connect
6300: 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 ion. Set alert t
6310: 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a o error code.. *
6320: 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c .SSL_CLIENT_HELL
6330: 4f 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 O_SUCCESS: succe
6340: 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ss. *. *--------
6350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a -----------. */.
6390: 73 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f static int.Hello
63a0: 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 Callback(SSL *ss
63b0: 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 l, int *alert, v
63c0: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 oid *arg) {.
63d0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
63e0: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 = (State*)arg;.
63f0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
6400: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
6410: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
6420: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
6430: 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 int code, res
6440: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
6450: 20 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 *servername;.
6460: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
6470: 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 char *p;. si
6480: 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e ze_t len, remain
6490: 69 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ing;.. dprint
64a0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
64b0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
64c0: 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a vcmd == (Tcl_Obj
64d0: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
64e0: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
64f0: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 LO_SUCCESS;.
6500: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d } else if (ssl =
6510: 3d 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e = (const SSL *)N
6520: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 ULL || arg == (v
6530: 6f 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 oid *)NULL) {..r
6540: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
6550: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
6560: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.. /* Get
6570: 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 names */. if
6580: 28 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c (!SSL_client_hel
6590: 6c 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c lo_get0_ext(ssl,
65a0: 20 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 TLSEXT_TYPE_ser
65b0: 76 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 ver_name, &p, &r
65c0: 65 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d emaining) || rem
65d0: 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 aining <= 2) {..
65e0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 *alert = SSL_R_S
65f0: 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 SLV3_ALERT_ILLEG
6600: 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 AL_PARAMETER;..r
6610: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
6620: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
6630: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 }.. /* Extr
6640: 61 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f act the length o
6650: 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c f the supplied l
6660: 69 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f ist of names. */
6670: 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b . len = (*(p+
6680: 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 +) << 8);. le
6690: 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 n += *(p++);.
66a0: 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 if (len + 2 !=
66b0: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 remaining) {..*a
66c0: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c lert = SSL_R_SSL
66d0: 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c V3_ALERT_ILLEGAL
66e0: 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 _PARAMETER;..ret
66f0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
6700: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
6710: 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 }. remaining
6720: 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 = len;.. /* T
6730: 68 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 he list in pract
6740: 69 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 ice only has a s
6750: 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 ingle element, s
6760: 6f 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 o we only consid
6770: 65 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 er the first one
6780: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d . */. if (rem
6790: 61 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a aining == 0 || *
67a0: 70 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 p++ != TLSEXT_NA
67b0: 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 METYPE_host_name
67c0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 ) {..*alert = SS
67d0: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f L_R_TLSV1_ALERT_
67e0: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a INTERNAL_ERROR;.
67f0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 .return SSL_CLIE
6800: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a NT_HELLO_ERROR;.
6810: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e }. remain
6820: 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e ing--;.. /* N
6830: 6f 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c ow we can finall
6840: 79 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 y pull out the b
6850: 79 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 yte array with t
6860: 68 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 he actual hostna
6870: 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 me. */. if (r
6880: 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b emaining <= 2) {
6890: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 ..*alert = SSL_R
68a0: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 _TLSV1_ALERT_INT
68b0: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 ERNAL_ERROR;..re
68c0: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
68d0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
68e0: 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 }. len = (*(
68f0: 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 p++) << 8);.
6900: 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 len += *(p++);.
6910: 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e if (len + 2 >
6920: 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a remaining) {..*
6930: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c alert = SSL_R_TL
6940: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e SV1_ALERT_INTERN
6950: 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 AL_ERROR;..retur
6960: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
6970: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
6980: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 remaining =
6990: 6c 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e len;. servern
69a0: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 ame = (const cha
69b0: 72 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 r *)p;.. /* C
69c0: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
69d0: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 eval with fn, c
69e0: 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 han, and server
69f0: 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 name args */.
6a00: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
6a10: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
6a20: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 Ptr->vcmd);.
6a30: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
6a40: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
6a50: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
6a60: 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f StringObj("hello
6a70: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
6a80: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
6a90: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
6aa0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
6ab0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
6ac0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
6ad0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
6ae0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
6af0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
6b00: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
6b10: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
6b20: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 Obj(servername,
6b30: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 (Tcl_Size) len))
6b40: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
6b50: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
6b60: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 */. Tcl_IncrR
6b70: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
6b80: 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d . if ((code =
6b90: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e EvalCallback(in
6ba0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
6bb0: 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a cmdPtr)) > 1) {.
6bc0: 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e .res = SSL_CLIEN
6bd0: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 T_HELLO_RETRY;..
6be0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 *alert = SSL_R_T
6bf0: 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f LSV1_ALERT_USER_
6c00: 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d CANCELLED;. }
6c10: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d else if (code =
6c20: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 = 1) {..res = SS
6c30: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 L_CLIENT_HELLO_S
6c40: 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c UCCESS;. } el
6c50: 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f se {..res = SSL_
6c60: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
6c70: 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 OR;..*alert = SS
6c80: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f L_R_TLSV1_ALERT_
6c90: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a INTERNAL_ERROR;.
6ca0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 }. Tcl_De
6cb0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
6cc0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 r);. return r
6cd0: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a es;.}.../*******
6ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f *************/./
6cf0: 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 * Commands
6d00: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a */./*********
6d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a ***********/../*
6d20: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
6d30: 2d 2d 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 0a 20 2a 0a 20 2a 20 43 69 70 ------. *. * Cip
6d70: 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 hersObjCmd -- li
6d80: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 st available cip
6d90: 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 hers. *. *.This
6da0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
6db0: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
6dc0: 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 the "tls::cipher
6dd0: 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f s" command. *.to
6de0: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 list available
6df0: 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 ciphers, based u
6e00: 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c pon protocol sel
6e10: 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 ected.. *. * Res
6e20: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
6e30: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c ard Tcl result l
6e40: 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ist.. *. * Side
6e50: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 effects:. *.cons
6e60: 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 tructs and destr
6e70: 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 oys SSL context
6e80: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d (CTX). *. *-----
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 --------------.
6ed0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 */.static const
6ee0: 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b char *protocols[
6ef0: 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 ] = {.."ssl2", "
6f00: 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 ssl3", "tls1", "
6f10: 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 tls1.1", "tls1.2
6f20: 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c ", "tls1.3", NUL
6f30: 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 L.};.enum protoc
6f40: 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c ol {. TLS_SSL
6f50: 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 2, TLS_SSL3, TLS
6f60: 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f _TLS1, TLS_TLS1_
6f70: 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 1, TLS_TLS1_2, T
6f80: 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e LS_TLS1_3, TLS_N
6f90: 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 ONE.};..static i
6fa0: 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 nt.CiphersObjCmd
6fb0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
6fc0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
6fd0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
6fe0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
6ff0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
7000: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
7010: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 tr = NULL;. S
7020: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 SL_CTX *ctx = NU
7030: 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c LL;. SSL *ssl
7040: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 = NULL;. STA
7050: 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 CK_OF(SSL_CIPHER
7060: 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 ) *sk;. char
7070: 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 buf[BUFSIZ];.
7080: 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 int index, verb
7090: 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 ose = 0, use_sup
70a0: 70 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 ported = 0;.
70b0: 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 const SSL_METHOD
70c0: 20 2a 6d 65 74 68 6f 64 3b 0a 20 20 20 20 28 76 *method;. (v
70d0: 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b oid) clientData;
70e0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
70f0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
7100: 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 ((objc < 2) ||
7110: 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 (objc > 4)) {..T
7120: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
7130: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
7140: 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 "protocol ?verb
7150: 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f ose? ?supported?
7160: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
7170: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
7180: 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 if (Tcl_GetInde
7190: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c xFromObj(interp,
71a0: 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 objv[1], protoc
71b0: 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c ols, "protocol",
71c0: 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 0, &index) != T
71d0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
71e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
71f0: 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 }. if ((objc
7200: 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 > 2) && Tcl_GetB
7210: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e ooleanFromObj(in
7220: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 terp, objv[2], &
7230: 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f verbose) != TCL_
7240: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
7250: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
7260: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 if ((objc > 3
7270: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c ) && Tcl_GetBool
7280: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 eanFromObj(inter
7290: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 p, objv[3], &use
72a0: 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 _supported) != T
72b0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
72c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
72d0: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
72e0: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 _error();.. s
72f0: 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f witch ((enum pro
7300: 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 tocol)index) {..
7310: 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 case TLS_SSL2:.#
7320: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
7330: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 ON_NUMBER >= 0x1
7340: 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 0100000L || defi
7350: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 ned(NO_SSL2) ||
7360: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7370: 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 NO_SSL2).. Tc
7380: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
7390: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
73a0: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
73b0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
73c0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ed", (char *) NU
73d0: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
73e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
73f0: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 e.. method =
7400: 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 SSLv2_method();
7410: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 break;.#endif..c
7420: 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 ase TLS_SSL3:.#i
7430: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c f defined(NO_SSL
7440: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
7450: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c ENSSL_NO_SSL3) |
7460: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
7470: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 L_NO_SSL3_METHOD
7480: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ).. Tcl_Appen
7490: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
74a0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
74b0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
74c0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 t supported", (c
74d0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
74e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
74f0: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
7500: 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d method = SSLv3_m
7510: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a ethod(); break;.
7520: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 #endif..case TLS
7530: 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e _TLS1:.#if defin
7540: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 ed(NO_TLS1) || d
7550: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7560: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e O_TLS1) || defin
7570: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7580: 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 S1_METHOD)..
7590: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
75a0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
75b0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
75c0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
75d0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
75e0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
75f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
7600: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 lse.. method
7610: 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 = TLSv1_method()
7620: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
7630: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 .case TLS_TLS1_1
7640: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f :.#if defined(NO
7650: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
7660: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
7670: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_1) || define
7680: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
7690: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 1_1_METHOD)..
76a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
76b0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
76c0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
76d0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
76e0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
76f0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
7700: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
7710: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 else.. method
7720: 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f = TLSv1_1_metho
7730: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
7740: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 if..case TLS_TLS
7750: 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 1_2:.#if defined
7760: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 (NO_TLS1_2) || d
7770: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7780: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 O_TLS1_2) || def
7790: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
77a0: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 TLS1_2_METHOD)..
77b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
77c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
77d0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
77e0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
77f0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
7800: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
7810: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7820: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 ;.#else.. met
7830: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 hod = TLSv1_2_me
7840: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 thod(); break;.#
7850: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
7860: 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 TLS1_3:.#if defi
7870: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c ned(NO_TLS1_3) |
7880: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
7890: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 L_NO_TLS1_3)..
78a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
78b0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f lt(interp, proto
78c0: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 cols[index], ":
78d0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
78e0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
78f0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 ) NULL);.. re
7900: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7910: 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f #else.. metho
7920: 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 d = TLS_method()
7930: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 ;.. SSL_CTX_s
7940: 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 et_min_proto_ver
7950: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 sion(ctx, TLS1_3
7960: 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 _VERSION);..
7970: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f SSL_CTX_set_max_
7980: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
7990: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f x, TLS1_3_VERSIO
79a0: 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a N);.. break;.
79b0: 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a #endif..default:
79c0: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 .. method = T
79d0: 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 LS_method();..
79e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a break;. }..
79f0: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 ctx = SSL_CT
7a00: 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 X_new(method);.
7a10: 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 if (ctx == NU
7a20: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
7a30: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
7a40: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
7a50: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
7a60: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
7a70: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
7a80: 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 ssl = SSL_new(ct
7a90: 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 x);. if (ssl
7aa0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f == NULL) {..Tcl_
7ab0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7ac0: 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 erp, GET_ERR_REA
7ad0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
7ae0: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f NULL);..SSL_CTX_
7af0: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 free(ctx);..retu
7b00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7b10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 }.. /* Use
7b20: 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 list and order a
7b30: 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 s would be sent
7b40: 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f in a ClientHello
7b50: 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c or all availabl
7b60: 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 e ciphers */.
7b70: 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 if (use_support
7b80: 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f ed) {..sk = SSL_
7b90: 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 get1_supported_c
7ba0: 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 iphers(ssl);.
7bb0: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 } else {..sk =
7bc0: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 SSL_get_ciphers(
7bd0: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ssl);. }..
7be0: 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 if (sk != NULL)
7bf0: 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 {..if (!verbose
7c00: 29 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 ) {.. const c
7c10: 68 61 72 20 2a 63 70 3b 0a 09 20 20 20 20 6f 62 har *cp;.. ob
7c20: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
7c30: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
7c40: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 . for (int i
7c50: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f = 0; i < sk_SSL_
7c60: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 CIPHER_num(sk);
7c70: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 i++) {...const S
7c80: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 SL_CIPHER *c = s
7c90: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c k_SSL_CIPHER_val
7ca0: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 ue(sk, i);...if
7cb0: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 (c == NULL) cont
7cc0: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 inue;..../* ciph
7cd0: 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 er name or (NONE
7ce0: 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f ) */...cp = SSL_
7cf0: 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 CIPHER_get_name(
7d00: 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 c);...if (cp ==
7d10: 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 NULL) break;...T
7d20: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
7d30: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
7d40: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
7d50: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a tringObj((char *
7d60: 29 20 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 ) cp, -1));..
7d70: 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 }...} else {..
7d80: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
7d90: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c NewStringObj("",
7da0: 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 0);.. for (in
7db0: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f t i = 0; i < sk_
7dc0: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 SSL_CIPHER_num(s
7dd0: 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e k); i++) {...con
7de0: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 st SSL_CIPHER *c
7df0: 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 = sk_SSL_CIPHER
7e00: 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 _value(sk, i);..
7e10: 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 .if (c == NULL)
7e20: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 continue;..../*
7e30: 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 textual descript
7e40: 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 ion of the ciphe
7e50: 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 r */...if (SSL_C
7e60: 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f IPHER_descriptio
7e70: 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 n(c, buf, sizeof
7e80: 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 (buf)) != NULL)
7e90: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {... Tcl_Appe
7ea0: 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 ndToObj(objPtr,
7eb0: 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 buf, (Tcl_Size)
7ec0: 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 strlen(buf));...
7ed0: 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 } else {... T
7ee0: 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f cl_AppendToObj(o
7ef0: 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c bjPtr, "UNKNOWN\
7f00: 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 n", 8);...}..
7f10: 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 }..}..if (use_s
7f20: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 upported) {..
7f30: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 sk_SSL_CIPHER_f
7f40: 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 ree(sk);..}.
7f50: 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 }. SSL_free(s
7f60: 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 sl);. SSL_CTX
7f70: 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 _free(ctx);..
7f80: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
7f90: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
7fa0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
7fb0: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f --. *. * Protoco
8010: 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 lsObjCmd -- list
8020: 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f available proto
8030: 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 cols. *. *.This
8040: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
8050: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
8060: 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 the "tls::protoc
8070: 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 ols" command. *.
8080: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c to list availabl
8090: 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a e protocols.. *.
80a0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
80b0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
80c0: 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a sult list.. *. *
80d0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
80e0: 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d *.none. *. *----
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8110: 2d 2d 2d 2d 2d 2d 2d 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 0a ---------------.
8130: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 */.static int.P
8140: 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 rotocolsObjCmd(C
8150: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
8160: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
8170: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
8180: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
8190: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
81a0: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
81b0: 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 ;. (void) cli
81c0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 entData;.. dp
81d0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
81e0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
81f0: 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 1) {..Tcl_Wron
8200: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
8210: 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 1, objv, "");..
8220: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
8230: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
8240: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
8250: 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 . objPtr = Tc
8260: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
8270: 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e NULL);..#if OPEN
8280: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
8290: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c ER < 0x10100000L
82a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f && !defined(NO_
82b0: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 SSL2) && !define
82c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
82d0: 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 2). Tcl_ListO
82e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
82f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
8300: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
8310: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 (protocols[TLS_S
8320: 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 SL2], -1));.#end
8330: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
8340: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
8350: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8360: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
8370: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
8380: 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 3_METHOD). Tc
8390: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
83a0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
83b0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
83c0: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
83d0: 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 s[TLS_SSL3], -1)
83e0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
83f0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
8400: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
8410: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 SSL_NO_TLS1) &&
8420: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
8430: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 _NO_TLS1_METHOD)
8440: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
8450: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
8460: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
8470: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
8480: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 rotocols[TLS_TLS
8490: 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 1], -1));.#endif
84a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
84b0: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 _TLS1_1) && !def
84c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
84d0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
84e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
84f0: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 LS1_1_METHOD).
8500: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
8510: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
8520: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
8530: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
8540: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 ocols[TLS_TLS1_1
8550: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
8560: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
8570: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
8580: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
8590: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
85a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
85b0: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_2_METHOD).
85c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
85d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
85e0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
85f0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
8600: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d cols[TLS_TLS1_2]
8610: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
8620: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
8630: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
8640: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
8650: 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 S1_3). Tcl_Li
8660: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
8670: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
8680: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
8690: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
86a0: 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b S_TLS1_3], -1));
86b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c .#endif.. Tcl
86c0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
86d0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 terp, objPtr);.
86e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
86f0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
8700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 --------------.
8740: 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 *. * HandshakeOb
8750: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
8760: 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 is command is us
8770: 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 ed to verify whe
8780: 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 ther the handsha
8790: 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 ke is complete.
87a0: 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 *.or not.. *. *
87b0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
87c0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
87d0: 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 t. 1 means hands
87e0: 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 hake complete, 0
87f0: 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a means pending..
8800: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
8810: 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 ts:. *.May force
8820: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e SSL negotiation
8830: 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a to take place..
8840: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
8850: 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 --------. */.sta
8890: 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b tic int Handshak
88a0: 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 eObjCmd(ClientDa
88b0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
88c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
88d0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
88e0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
88f0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
8900: 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 annel chan;
8910: 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 /* The channe
8920: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
8930: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 on. */. State
8940: 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 *statePtr;
8950: 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 /* client sta
8960: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 te for ssl socke
8970: 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 t */. const c
8980: 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 har *errStr = NU
8990: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 LL;. int ret
89a0: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 = 1;. int err
89b0: 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 = 0;. (void)
89c0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 clientData;..
89d0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
89e0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
89f0: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f jc != 2) {..Tcl_
8a00: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
8a10: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
8a20: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 hannel");..retur
8a30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
8a40: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 }.. ERR_clea
8a50: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 r_error();..
8a60: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
8a70: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 annel(interp, Tc
8a80: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
8a90: 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 [1]), NULL);.
8aa0: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
8ab0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
8ac0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
8ad0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
8ae0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f /* Make sure to
8af0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
8b00: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
8b10: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
8b20: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
8b30: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 chan);. if (T
8b40: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
8b50: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
8b60: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
8b70: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
8b80: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
8b90: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
8ba0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
8bb0: 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 han),.. "\":
8bc0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
8bd0: 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c l", (char *) NUL
8be0: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f L);..Tcl_SetErro
8bf0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
8c00: 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 LS", "HANDSHAKE"
8c10: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e , "CHANNEL", "IN
8c20: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 VALID", (char *)
8c30: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
8c40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
8c50: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 . statePtr =
8c60: 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 (State *)Tcl_Get
8c70: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
8c80: 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 ata(chan);..
8c90: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 dprintf("Calling
8ca0: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e Tls_WaitForConn
8cb0: 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d ect");. ret =
8cc0: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e Tls_WaitForConn
8cd0: 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 ect(statePtr, &e
8ce0: 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 rr, 1);. dpri
8cf0: 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 ntf("Tls_WaitFor
8d00: 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 Connect returned
8d10: 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 : %i", ret);..
8d20: 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 if (ret < 0 &&
8d30: 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 ((statePtr->fla
8d40: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 gs & TLS_TCL_ASY
8d50: 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 NC) && (err == E
8d60: 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 AGAIN))) {..dpri
8d70: 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 ntf("Async set a
8d80: 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 nd err = EAGAIN"
8d90: 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 );..ret = 0;.
8da0: 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 } else if (ret
8db0: 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 < 0) {..long res
8dc0: 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 ult;..errStr = s
8dd0: 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 tatePtr->err;..T
8de0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 cl_ResetResult(i
8df0: 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 nterp);..Tcl_Set
8e00: 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 Errno(err);...if
8e10: 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 (!errStr || (*e
8e20: 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 rrStr == 0)) {..
8e30: 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c errStr = Tcl
8e40: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 _PosixError(inte
8e50: 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 rp);..}...Tcl_Ap
8e60: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
8e70: 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 p, "handshake fa
8e80: 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c iled: ", errStr,
8e90: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
8ea0: 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20 ..if ((result =
8eb0: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 SSL_get_verify_r
8ec0: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e esult(statePtr->
8ed0: 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f ssl)) != X509_V_
8ee0: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 OK) {.. Tcl_A
8ef0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
8f00: 72 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22 22 rp, " due to \""
8f10: 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 , X509_verify_ce
8f20: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 rt_error_string(
8f30: 72 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20 28 result), "\"", (
8f40: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
8f50: 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 }..Tcl_SetErrorC
8f60: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
8f70: 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 ", "HANDSHAKE",
8f80: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
8f90: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e *) NULL);..dprin
8fa0: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 tf("Returning TC
8fb0: 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e L_ERROR with han
8fc0: 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 dshake failed: %
8fd0: 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 s", errStr);..re
8fe0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
8ff0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 } else {..if
9000: 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 (err != 0) {..
9010: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 dprintf("Got
9020: 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 an error with a
9030: 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 completed handsh
9040: 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 ake: err = %i",
9050: 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 err);..}..ret =
9060: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 1;. }.. dp
9070: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
9080: 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 TCL_OK with dat
9090: 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b a \"%i\"", ret);
90a0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
90b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
90c0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 l_NewIntObj(ret)
90d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
90e0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d L_OK;.}../*. *--
90f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 -. *. * ImportOb
9140: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
9150: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
9160: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
9170: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d ss the "ssl" com
9180: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 mand. *. *.The s
9190: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 sl command pushe
91a0: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 s SSL over a (ne
91b0: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 wly connected) t
91c0: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 cp socket. *. *
91d0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
91e0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
91f0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
9200: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f fects:. *.May mo
9210: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f dify the behavio
9220: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e r of an IO chann
9230: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d el.. *. *-------
9240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f ------------. */
9280: 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f .static int.Impo
9290: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 rtObjCmd(ClientD
92a0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
92b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
92c0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
92d0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
92e0: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
92f0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
9300: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
9310: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
9320: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 /. State *sta
9330: 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e tePtr;../* clien
9340: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
9350: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 socket */. SS
9360: 4c 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 L_CTX *ctx..= NU
9370: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 LL;. Tcl_Obj
9380: 2a 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b *script..= NULL;
9390: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 . Tcl_Obj *pa
93a0: 73 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a ssword..= NULL;.
93b0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d Tcl_Obj *vcm
93c0: 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 d..= NULL;. T
93d0: 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 cl_DString upper
93e0: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
93f0: 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c on, upperChannel
9400: 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 Blocking, upperC
9410: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 hannelEncoding,
9420: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
9430: 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 har;. int idx
9440: 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c ;. Tcl_Size l
9450: 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 en;. int flag
9460: 73 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e s...= TLS_TCL_IN
9470: 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 IT;. int serv
9480: 65 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 er...= 0;./* is
9490: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d connection incom
94a0: 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f ing or outgoing?
94b0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 */. char *ke
94c0: 79 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 yfile..= NULL;.
94d0: 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c char *certfil
94e0: 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 e..= NULL;. u
94f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 nsigned char *ke
9500: 79 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 y..= NULL;. T
9510: 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 cl_Size key_len.
9520: 09 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e .= 0;. unsign
9530: 65 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d ed char *cert..=
9540: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 NULL;. Tcl_S
9550: 69 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 ize cert_len..=
9560: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 0;. char *cip
9570: 68 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 hers..= NULL;.
9580: 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 char *ciphersu
9590: 69 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 ites..= NULL;.
95a0: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09 char *CAfile..
95b0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
95c0: 20 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c *CApath..= NULL
95d0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 ;. char *DHpa
95e0: 72 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 rams..= NULL;.
95f0: 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 char *model...
9600: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
9610: 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 *servername..=
9620: 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d NULL;./* hostnam
9630: 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d e for Server Nam
9640: 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a e Indication */.
9650: 20 20 20 20 63 68 61 72 20 2a 73 65 73 73 69 6f char *sessio
9660: 6e 5f 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 n_id..= NULL;.
9670: 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 Tcl_Obj *alpn.
9680: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 .= NULL;. int
9690: 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 ssl2 = 0, ssl3
96a0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 = 0;. int tls
96b0: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 1 = 1, tls1_1 =
96c0: 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 1, tls1_2 = 1, t
96d0: 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 ls1_3 = 1;. i
96e0: 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 nt proto = 0, le
96f0: 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e vel = -1;. in
9700: 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 t verify = 0, re
9710: 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 quire = 0, reque
9720: 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e st = 1, post_han
9730: 64 73 68 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 dshake = 0;.
9740: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 (void) clientDat
9750: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 a;.. dprintf(
9760: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 "Called");..#if
9770: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
9780: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
9790: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 SSL_NO_TLS1).
97a0: 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 tls1 = 0;.#endi
97b0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
97c0: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
97d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
97e0: 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f LS1_1). tls1_
97f0: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 1 = 0;.#endif.#i
9800: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
9810: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
9820: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
9830: 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 2). tls1_2 =
9840: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
9850: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
9860: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
9870: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
9880: 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 tls1_3 = 0;.#
9890: 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f endif.. if (o
98a0: 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f bjc < 2) {..Tcl_
98b0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
98c0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
98d0: 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f hannel ?options?
98e0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
98f0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
9900: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
9910: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d r();.. chan =
9920: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
9930: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
9940: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 tring(objv[1]),
9950: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
9960: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
9970: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
9980: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9990: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
99a0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
99b0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
99c0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
99d0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
99e0: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
99f0: 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d .. for (idx =
9a00: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 2; idx < objc;
9a10: 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a idx++) {..char *
9a20: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 opt = Tcl_GetStr
9a30: 69 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a ing(objv[idx]);.
9a40: 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 ..if (opt[0] !=
9a50: 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b '-').. break;
9a60: 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e ...OPTOBJ("-alpn
9a70: 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 ", alpn);..OPTST
9a80: 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 70 61 R("-cadir", CApa
9a90: 74 68 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 th);..OPTSTR("-c
9aa0: 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b afile", CAfile);
9ab0: 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 ..OPTBYTE("-cert
9ac0: 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 ", cert, cert_le
9ad0: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 n);..OPTSTR("-ce
9ae0: 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c rtfile", certfil
9af0: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 e);..OPTSTR("-ci
9b00: 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b pher", ciphers);
9b10: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 ..OPTSTR("-ciphe
9b20: 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 rs", ciphers);..
9b30: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 OPTSTR("-ciphers
9b40: 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 uites", ciphersu
9b50: 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 ites);..OPTOBJ("
9b60: 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 -command", scrip
9b70: 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 t);..OPTSTR("-dh
9b80: 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d params", DHparam
9b90: 73 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b s);..OPTBYTE("-k
9ba0: 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 ey", key, key_le
9bb0: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 n);..OPTSTR("-ke
9bc0: 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 yfile", keyfile)
9bd0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 ;..OPTSTR("-mode
9be0: 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 l", model);..OPT
9bf0: 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c OBJ("-password",
9c00: 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 password);..OPT
9c10: 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 BOOL("-post_hand
9c20: 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e shake", post_han
9c30: 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f dshake);..OPTBOO
9c40: 4c 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 L("-request", re
9c50: 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c quest);..OPTBOOL
9c60: 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 ("-require", req
9c70: 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 uire);..OPTINT("
9c80: 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 -security_level"
9c90: 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f , level);..OPTBO
9ca0: 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 OL("-server", se
9cb0: 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 rver);..OPTSTR("
9cc0: 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 -servername", se
9cd0: 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 rvername);..OPTS
9ce0: 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 TR("-session_id"
9cf0: 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 , session_id);..
9d00: 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c OPTBOOL("-ssl2",
9d10: 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c ssl2);..OPTBOOL
9d20: 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b ("-ssl3", ssl3);
9d30: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 ..OPTBOOL("-tls1
9d40: 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f ", tls1);..OPTBO
9d50: 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c OL("-tls1.1", tl
9d60: 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 s1_1);..OPTBOOL(
9d70: 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f "-tls1.2", tls1_
9d80: 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 2);..OPTBOOL("-t
9d90: 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b ls1.3", tls1_3);
9da0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 ..OPTOBJ("-valid
9db0: 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d atecommand", vcm
9dc0: 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 d);..OPTOBJ("-vc
9dd0: 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 md", vcmd);...OP
9de0: 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 TBAD("option", "
9df0: 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d -alpn, -cadir, -
9e00: 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d cafile, -cert, -
9e10: 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 certfile, -ciphe
9e20: 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 r, -ciphersuites
9e30: 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 , -command, -dhp
9e40: 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 arams, -key, -ke
9e50: 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d yfile, -model, -
9e60: 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f password, -post_
9e70: 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 handshake, -requ
9e80: 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d est, -require, -
9e90: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 security_level,
9ea0: 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 -server, -server
9eb0: 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 name, -session_i
9ec0: 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c d, -ssl2, -ssl3,
9ed0: 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c -tls1, -tls1.1,
9ee0: 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e -tls1.2, -tls1.
9ef0: 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 3, or -validatec
9f00: 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 ommand");...retu
9f10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
9f20: 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 }. if (requ
9f30: 65 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 est)..verify |=
9f40: 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e SSL_VERIFY_CLIEN
9f50: 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 T_ONCE | SSL_VER
9f60: 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 IFY_PEER;. if
9f70: 20 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71 (request && req
9f80: 75 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 uire).verify |=
9f90: 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f SSL_VERIFY_FAIL_
9fa0: 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b IF_NO_PEER_CERT;
9fb0: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 . if (request
9fc0: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 && post_handsha
9fd0: 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 ke).verify |= SS
9fe0: 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 L_VERIFY_POST_HA
9ff0: 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 NDSHAKE;. if
a000: 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 (verify == 0)..v
a010: 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 erify = SSL_VERI
a020: 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 FY_NONE;.. pr
a030: 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 oto |= (ssl2 ? T
a040: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 LS_PROTO_SSL2 :
a050: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
a060: 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f (ssl3 ? TLS_PRO
a070: 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 TO_SSL3 : 0);.
a080: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
a090: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
a0a0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 1 : 0);. prot
a0b0: 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 o |= (tls1_1 ? T
a0c0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 LS_PROTO_TLS1_1
a0d0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
a0e0: 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 |= (tls1_2 ? TLS
a0f0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 _PROTO_TLS1_2 :
a100: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
a110: 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 (tls1_3 ? TLS_P
a120: 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 ROTO_TLS1_3 : 0)
a130: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 ;.. /* reset
a140: 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b to NULL if blank
a150: 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 string provided
a160: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 */. if (cert
a170: 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 && !*cert)..
a180: 20 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20 cert.
a190: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
a1a0: 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 (key && !*key).
a1b0: 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 . key.
a1c0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
a1d0: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 if (certfile &&
a1e0: 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 !*certfile)
a1f0: 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 certfile.=
a200: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 NULL;. if (ke
a210: 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 yfile && !*keyfi
a220: 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 le)..keyfile.
a230: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
a240: 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20 if (ciphers &&
a250: 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20 !*ciphers).
a260: 20 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20 ciphers.
a270: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
a280: 66 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20 f (ciphersuites
a290: 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 && !*ciphersuite
a2a0: 73 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20 s) ciphersuites
a2b0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
a2c0: 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 f (CAfile && !*C
a2d0: 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 Afile). C
a2e0: 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 Afile. =
a2f0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 NULL;. if (CA
a300: 70 61 74 68 20 26 26 20 21 2a 43 41 70 61 74 68 path && !*CApath
a310: 29 09 20 20 20 20 20 20 20 20 43 41 70 61 74 68 ). CApath
a320: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
a330: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d . if (DHparam
a340: 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 s && !*DHparams)
a350: 09 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d . DHparam
a360: 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b s = NULL;
a370: 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c .. /* new SSL
a380: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 state */. st
a390: 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 atePtr..= (State
a3a0: 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 *) ckalloc((uns
a3b0: 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 igned) sizeof(St
a3c0: 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 ate));. memse
a3d0: 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 t(statePtr, 0, s
a3e0: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a izeof(State));..
a3f0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c statePtr->fl
a400: 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 ags.= flags;.
a410: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
a420: 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 p.= interp;.
a430: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 statePtr->vflags
a440: 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 .= verify;. s
a450: 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 tatePtr->err.= "
a460: 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 ";.. /* alloc
a470: 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 ate script */.
a480: 20 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a if (script) {.
a490: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 .(void) Tcl_GetS
a4a0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 tringFromObj(scr
a4b0: 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 ipt, &len);..if
a4c0: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 (len) {.. sta
a4d0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
a4e0: 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 = script;.. T
a4f0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
a500: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
a510: 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ck);..}. }..
a520: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 /* allocate p
a530: 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 assword */. i
a540: 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 f (password) {..
a550: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 (void) Tcl_GetSt
a560: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 ringFromObj(pass
a570: 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 word, &len);..if
a580: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 (len) {.. st
a590: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
a5a0: 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 = password;..
a5b0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
a5c0: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 nt(statePtr->pas
a5d0: 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d sword);..}. }
a5e0: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 .. /* allocat
a5f0: 65 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 e validate comma
a600: 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 nd */. if (vc
a610: 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 md) {..(void) Tc
a620: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
a630: 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a bj(vcmd, &len);.
a640: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 .if (len) {..
a650: 20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 statePtr->vcmd
a660: 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c = vcmd;.. Tcl
a670: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _IncrRefCount(st
a680: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 atePtr->vcmd);..
a690: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 }. }.. if
a6a0: 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 (model != NULL)
a6b0: 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a {..int mode;../*
a6c0: 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 Get the "model"
a6d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 context */..cha
a6e0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
a6f0: 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c el(interp, model
a700: 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 , &mode);..if (c
a710: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
a720: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 nel) NULL) {..
a730: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f Tls_Free((tls_
a740: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 free_type *) sta
a750: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
a760: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
a770: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 }.../*.. * Make
a780: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
a790: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
a7a0: 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 hannel.. */..cha
a7b0: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
a7c0: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 annel(chan);..if
a7d0: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
a7e0: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
a7f0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
a800: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
a810: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
a820: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
a830: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
a840: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 lName(chan),..."
a850: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
a860: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 annel", (char *)
a870: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c NULL);.. Tcl
a880: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
a890: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
a8a0: 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 PORT", "CHANNEL"
a8b0: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
a8c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
a8d0: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f Tls_Free((tls_
a8e0: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 free_type *) sta
a8f0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
a900: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
a910: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 }..ctx = ((State
a920: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *)Tcl_GetChanne
a930: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
a940: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d an))->ctx;. }
a950: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 else {..if ((ct
a960: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 x = CTX_Init(sta
a970: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 tePtr, server, p
a980: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 roto, keyfile, c
a990: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 ertfile, key, ce
a9a0: 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 rt, key_len,..
a9b0: 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61 cert_len, CApa
a9c0: 74 68 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 th, CAfile, ciph
a9d0: 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 ers, ciphersuite
a9e0: 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 s, level, DHpara
a9f0: 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a ms)) == NULL) {.
aa00: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 . Tls_Free((t
aa10: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 ls_free_type *)
aa20: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
aa30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
aa40: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
aa50: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 statePtr->ctx =
aa60: 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 ctx;.. /*.
aa70: 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d * We need to m
aa80: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 ake sure that th
aa90: 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 e channel works
aaa0: 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 in binary (for t
aab0: 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 he. * encryp
aac0: 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 tion not to get
aad0: 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 goofed up)..
aae0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 */. Tcl_DStr
aaf0: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
ab00: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
ab10: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
ab20: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
ab30: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 nnelBlocking);.
ab40: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
ab50: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
ab60: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 EOFChar);. Tc
ab70: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
ab80: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
ab90: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 ing);. Tcl_Ge
aba0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
abb0: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 nterp, chan, "-e
abc0: 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 ofchar", &upperC
abd0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a hannelEOFChar);.
abe0: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e Tcl_GetChann
abf0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
ac00: 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e chan, "-encodin
ac10: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 g", &upperChanne
ac20: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 lEncoding);.
ac30: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
ac40: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
ac50: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
ac60: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
ac70: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 Translation);.
ac80: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
ac90: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
aca0: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 han, "-blocking"
acb0: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 , &upperChannelB
acc0: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 locking);. Tc
acd0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
ace0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
acf0: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c "-translation",
ad00: 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 "binary");.
ad10: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
ad20: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
ad30: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 n, "-blocking",
ad40: 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72 "true");. dpr
ad50: 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 intf("Consuming
ad60: 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c Tcl channel %s",
ad70: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
ad80: 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 ame(chan));.
ad90: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
ada0: 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 Tcl_StackChanne
adb0: 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 l(interp, Tls_Ch
adc0: 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 6c annelType(), (Cl
add0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
ade0: 74 72 2c 0a 09 28 54 43 4c 5f 52 45 41 44 41 42 tr,..(TCL_READAB
adf0: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c LE | TCL_WRITABL
ae00: 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 E), chan);. d
ae10: 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 printf("Created
ae20: 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 channel named %s
ae30: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
ae40: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
ae50: 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 self));. if (
ae60: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
ae70: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
ae80: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 NULL) {../*.. *
ae90: 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 No use of Tcl_Ev
aea0: 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 entuallyFree bec
aeb0: 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 ause no possible
aec0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 Tcl_Preserve...
aed0: 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 74 */..Tls_Free((t
aee0: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 ls_free_type *)
aef0: 73 74 61 74 65 50 74 72 29 3b 0a 09 54 63 6c 5f statePtr);..Tcl_
af00: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 DStringFree(&upp
af10: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
af20: 74 69 6f 6e 29 3b 0a 09 54 63 6c 5f 44 53 74 72 tion);..Tcl_DStr
af30: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 ingFree(&upperCh
af40: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a annelEncoding);.
af50: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
af60: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f (&upperChannelEO
af70: 46 43 68 61 72 29 3b 0a 09 54 63 6c 5f 44 53 74 FChar);..Tcl_DSt
af80: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 ringFree(&upperC
af90: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b hannelBlocking);
afa0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
afb0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
afc0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
afd0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ion(interp, stat
afe0: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 ePtr->self, "-tr
aff0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f anslation", Tcl_
b000: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
b010: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
b020: 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c ation));. Tcl
b030: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
b040: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
b050: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f tr->self, "-enco
b060: 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 ding", Tcl_DStri
b070: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
b080: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b annelEncoding));
b090: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
b0a0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
b0b0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
b0c0: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 , "-eofchar", Tc
b0d0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
b0e0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
b0f0: 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 har));. Tcl_S
b100: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
b110: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
b120: 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 ->self, "-blocki
b130: 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 ng", Tcl_DString
b140: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
b150: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 nelBlocking));.
b160: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
b170: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ee(&upperChannel
b180: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 Translation);.
b190: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
b1a0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 e(&upperChannelE
b1b0: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 ncoding);. Tc
b1c0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 l_DStringFree(&u
b1d0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
b1e0: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ar);. Tcl_DSt
b1f0: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 ringFree(&upperC
b200: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b hannelBlocking);
b210: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
b220: 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 SSL Initializati
b230: 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 on. */. s
b240: 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 tatePtr->ssl = S
b250: 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d SL_new(statePtr-
b260: 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 >ctx);. if (!
b270: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b statePtr->ssl) {
b280: 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 ../* SSL library
b290: 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 error */..Tcl_A
b2a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
b2b0: 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f rp, "couldn't co
b2c0: 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 nstruct ssl sess
b2d0: 69 6f 6e 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f ion: ", GET_ERR_
b2e0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
b2f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b300: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
b310: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
b320: 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c IMPORT", "INIT",
b330: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
b340: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f *) NULL);..Tls_
b350: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 Free((tls_free_t
b360: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 ype *) statePtr)
b370: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
b380: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
b390: 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 /* Set host serv
b3a0: 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 er name */. i
b3b0: 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b f (servername) {
b3c0: 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 ../* Sets the se
b3d0: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 rver name indica
b3e0: 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c tion (SNI) in Cl
b3f0: 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 ientHello extens
b400: 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 ion */../* Per R
b410: 46 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d FC 6066, hostnam
b420: 65 20 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 e is a ASCII enc
b430: 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 74 68 6f oded string, tho
b440: 75 67 68 20 52 46 43 20 34 33 36 36 20 73 61 79 ugh RFC 4366 say
b450: 73 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 s UTF-8. */..if
b460: 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 (!SSL_set_tlsext
b470: 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 _host_name(state
b480: 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 Ptr->ssl, server
b490: 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 name) && require
b4a0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
b4b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
b4c0: 2c 20 22 53 65 74 20 53 4e 49 20 65 78 74 65 6e , "Set SNI exten
b4d0: 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 sion failed: ",
b4e0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
b4f0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b500: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
b510: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
b520: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
b530: 20 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 "SNI", "FAILED"
b540: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b550: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
b560: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a (tls_free_type *
b570: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
b580: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
b590: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 OR;..}.../* Set
b5a0: 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 hostname for pee
b5b0: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 68 6f r certificate ho
b5c0: 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74 stname verificat
b5d0: 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a ion in clients..
b5e0: 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53 . Don't use SS
b5f0: 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 L_set1_host sinc
b600: 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74 e it has limitat
b610: 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 ions. */..if (!S
b620: 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 SL_add1_host(sta
b630: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 tePtr->ssl, serv
b640: 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 ername)) {..
b650: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
b660: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 44 4e (interp, "Set DN
b670: 53 20 68 6f 73 74 6e 61 6d 65 20 66 61 69 6c 65 S hostname faile
b680: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 d: ", GET_ERR_RE
b690: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
b6a0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c NULL);.. Tcl
b6b0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
b6c0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
b6d0: 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 PORT", "HOSTNAME
b6e0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
b6f0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b700: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f Tls_Free((tls_
b710: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 free_type *) sta
b720: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
b730: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
b740: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
b750: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 Resume session i
b760: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 d */. if (ses
b770: 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 sion_id && strle
b780: 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d n(session_id) <=
b790: 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 SSL_MAX_SID_CTX
b7a0: 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 _LENGTH) {../* S
b7b0: 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 SL_set_session()
b7c0: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 */..if (!SSL_SE
b7d0: 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f SSION_set1_id_co
b7e0: 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 ntext(SSL_get_se
b7f0: 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e ssion(statePtr->
b800: 73 73 6c 29 2c 0a 09 09 28 63 6f 6e 73 74 20 75 ssl),...(const u
b810: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
b820: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 session_id, (uns
b830: 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 igned int) strle
b840: 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 n(session_id)))
b850: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
b860: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
b870: 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 "Resume session
b880: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 failed: ", GET_E
b890: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
b8a0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b8b0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
b8c0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
b8d0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 , "IMPORT", "SES
b8e0: 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c SION", "FAILED",
b8f0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b900: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
b910: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 tls_free_type *)
b920: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
b930: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
b940: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 R;..}. }..
b950: 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 /* Enable Appli
b960: 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f cation-Layer Pro
b970: 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f tocol Negotiatio
b980: 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61 72 65 3a n. Examples are:
b990: 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 http/1.0,..http
b9a0: 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 /1.1, h2, h3, ft
b9b0: 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 p, imap, pop3, x
b9c0: 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 mpp-client, xmpp
b9d0: 2d 73 65 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 -server, mqtt, i
b9e0: 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 rc, etc. */.
b9f0: 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 if (alpn) {../*
ba00: 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69 Convert a TCL li
ba10: 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 st into a protoc
ba20: 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d ol-list in wire-
ba30: 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 format */..unsig
ba40: 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 ned char *protos
ba50: 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 , *p;..unsigned
ba60: 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d int protos_len =
ba70: 20 30 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 63 6e 0;..Tcl_Size cn
ba80: 74 2c 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54 t, i;..int j;..T
ba90: 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a cl_Obj **list;..
baa0: 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a .if (Tcl_ListObj
bab0: 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 GetElements(inte
bac0: 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 rp, alpn, &cnt,
bad0: 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b &list) != TCL_OK
bae0: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 ) {.. Tls_Fre
baf0: 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 e((tls_free_type
bb00: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
bb10: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
bb20: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 RROR;..}.../* De
bb30: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f termine the memo
bb40: 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 ry required for
bb50: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 the protocol-lis
bb60: 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 t */..for (i = 0
bb70: 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 ; i < cnt; i++)
bb80: 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74 {.. Tcl_GetSt
bb90: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 ringFromObj(list
bba0: 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 [i], &len);..
bbb0: 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 if (len > 255)
bbc0: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {...Tcl_AppendRe
bbd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 4c sult(interp, "AL
bbe0: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 PN protocol name
bbf0: 73 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 s too long", (ch
bc00: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 ar *) NULL);...T
bc10: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
bc20: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
bc30: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c IMPORT", "ALPN",
bc40: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
bc50: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 *) NULL);...Tls
bc60: 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f _Free((tls_free_
bc70: 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 type *) statePtr
bc80: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
bc90: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 ERROR;.. }..
bca0: 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d protos_len +=
bcb0: 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 1 + (int) len;.
bcc0: 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 .}.../* Build th
bcd0: 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f e complete proto
bce0: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f col-list */..pro
bcf0: 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 tos = ckalloc(pr
bd00: 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 otos_len);../* p
bd10: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f rotocol-lists co
bd20: 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c nsist of 8-bit l
bd30: 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20 ength-prefixed,
bd40: 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a byte strings */.
bd50: 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70 20 3d .for (j = 0, p =
bd60: 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e 74 protos; j < cnt
bd70: 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 ; j++) {.. ch
bd80: 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 ar *str = Tcl_Ge
bd90: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c tStringFromObj(l
bda0: 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09 ist[j], &len);..
bdb0: 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e 73 69 *p++ = (unsi
bdc0: 67 6e 65 64 20 63 68 61 72 29 20 6c 65 6e 3b 0a gned char) len;.
bdd0: 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 . memcpy(p, s
bde0: 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e tr, (size_t) len
bdf0: 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e );.. p += len
be00: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 ;..}.../* SSL_se
be10: 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 t_alpn_protos ma
be20: 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 kes a copy of th
be30: 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 e protocol-list
be40: 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 */../* Note: Thi
be50: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 76 65 72 s function rever
be60: 73 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 ses the return v
be70: 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 alue convention
be80: 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f */..if (SSL_set_
be90: 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 alpn_protos(stat
bea0: 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f ePtr->ssl, proto
beb0: 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 s, protos_len))
bec0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
bed0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
bee0: 22 53 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 "Set ALPN protoc
bef0: 6f 6c 73 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 ols failed: ", G
bf00: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
bf10: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
bf20: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
bf30: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
bf40: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
bf50: 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 "ALPN", "FAILED"
bf60: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
bf70: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
bf80: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a (tls_free_type *
bf90: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
bfa0: 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 ckfree(protos)
bfb0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
bfc0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
bfd0: 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 Store protocols
bfe0: 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 list */..stateP
bff0: 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f tr->protos = pro
c000: 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e tos;..statePtr->
c010: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f protos_len = pro
c020: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 tos_len;. } e
c030: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d lse {..statePtr-
c040: 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a >protos = NULL;.
c050: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
c060: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d s_len = 0;. }
c070: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
c080: 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 SSL Callbacks.
c090: 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 */. SSL_se
c0a0: 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 t_app_data(state
c0b0: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 Ptr->ssl, (void
c0c0: 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 *)statePtr);./*
c0d0: 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 point back to us
c0e0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f */. SSL_set_
c0f0: 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d verify(statePtr-
c100: 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 >ssl, verify, Ve
c110: 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 rifyCallback);.
c120: 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f SSL_set_info_
c130: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 callback(statePt
c140: 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c r->ssl, InfoCall
c150: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 back);.. /* C
c160: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 allback for obse
c170: 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d rving protocol m
c180: 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 essages */.#ifnd
c190: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ef OPENSSL_NO_SS
c1a0: 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 L_TRACE. /* v
c1b0: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f oid SSL_CTX_set_
c1c0: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 msg_callback_arg
c1d0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c1e0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
c1f0: 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f );. void SSL_
c200: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c CTX_set_msg_call
c210: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 back(statePtr->c
c220: 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 tx, MessageCallb
c230: 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c ack); */. SSL
c240: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 _set_msg_callbac
c250: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e k_arg(statePtr->
c260: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ssl, (void *)sta
c270: 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f tePtr);. SSL_
c280: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
c290: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c2a0: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 MessageCallback)
c2b0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a ;.#endif.. /*
c2c0: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e Create Tcl_Chan
c2d0: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 nel BIO Handler
c2e0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
c2f0: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 >p_bio.= BIO_new
c300: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 _tcl(statePtr, B
c310: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 IO_NOCLOSE);.
c320: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d statePtr->bio.=
c330: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 BIO_new(BIO_f_s
c340: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 sl());.. if (
c350: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 server) {../* Se
c360: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a rver callbacks *
c370: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 /..SSL_CTX_set_t
c380: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 lsext_servername
c390: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 _arg(statePtr->c
c3a0: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 tx, (void *)stat
c3b0: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f ePtr);..SSL_CTX_
c3c0: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 set_tlsext_serve
c3d0: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 rname_callback(s
c3e0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e tatePtr->ctx, SN
c3f0: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c ICallback);..SSL
c400: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
c410: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 hello_cb(statePt
c420: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c r->ctx, HelloCal
c430: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 lback, (void *)s
c440: 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 tatePtr);..if (s
c450: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
c460: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
c470: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e SSL_CTX_set_alpn
c480: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 _select_cb(state
c490: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 Ptr->ctx, ALPNCa
c4a0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
c4b0: 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 statePtr);.#ifde
c4c0: 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 f USE_NPN.. i
c4d0: 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 f (tls1_2 == 0 &
c4e0: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b & tls1_3 == 0) {
c4f0: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e ...SSL_CTX_set_n
c500: 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 ext_protos_adver
c510: 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 tised_cb(statePt
c520: 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 r->ctx, NPNCallb
c530: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ack, (void *)sta
c540: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 tePtr);.. }.#
c550: 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e endif..}.../* En
c560: 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 able server to s
c570: 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74 end cert request
c580: 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 after handshake
c590: 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 (TLS 1.3 only)
c5a0: 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f */../* A write o
c5b0: 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 peration must ta
c5c0: 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 ke place for the
c5d0: 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71 Certificate Req
c5e0: 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 uest to be.. s
c5f0: 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e ent to the clien
c600: 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 t, this can be d
c610: 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f one with SSL_do_
c620: 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a handshake(). */.
c630: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 .if (request &&
c640: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 post_handshake &
c650: 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 & tls1_3) {..
c660: 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 SSL_verify_clie
c670: 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b nt_post_handshak
c680: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
c690: 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 ;..}.../* set au
c6a0: 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 tomatic curve se
c6b0: 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f lection */..SSL_
c6c0: 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 set_ecdh_auto(st
c6d0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b atePtr->ssl, 1);
c6e0: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 .../* Set server
c6f0: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 mode */..stateP
c700: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 tr->flags |= TLS
c710: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 _TCL_SERVER;..SS
c720: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 L_set_accept_sta
c730: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
c740: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
c750: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 ./* Client callb
c760: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 acks */.#ifdef U
c770: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 SE_NPN..if (stat
c780: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
c790: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d NULL && tls1_2 =
c7a0: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d = 0 && tls1_3 ==
c7b0: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 0) {.. SSL_C
c7c0: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 TX_set_next_prot
c7d0: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 o_select_cb(stat
c7e0: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 ePtr->ctx, ALPNC
c7f0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
c800: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 )statePtr);..}.#
c810: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 endif.../* Sessi
c820: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 on caching */..S
c830: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 SL_CTX_set_sessi
c840: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 on_cache_mode(st
c850: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c atePtr->ctx, SSL
c860: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 _SESS_CACHE_CLIE
c870: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 NT | SSL_SESS_CA
c880: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f CHE_NO_INTERNAL_
c890: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 STORE);..SSL_CTX
c8a0: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 _sess_set_new_cb
c8b0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c8c0: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 SessionCallback)
c8d0: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f ;.../* Enable po
c8e0: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 st handshake Aut
c8f0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 hentication exte
c900: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f nsion. TLS 1.3 o
c910: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e nly, not http/2.
c920: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 */..if (request
c930: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 && post_handsha
c940: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 ke) {.. SSL_s
c950: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b et_post_handshak
c960: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d e_auth(statePtr-
c970: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f >ssl, 1);..}.../
c980: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 * Set client mod
c990: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f e */..SSL_set_co
c9a0: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 nnect_state(stat
c9b0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
c9c0: 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 }. SSL_set_bi
c9d0: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c o(statePtr->ssl,
c9e0: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
c9f0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 , statePtr->p_bi
ca00: 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f o);. BIO_set_
ca10: 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 ssl(statePtr->bi
ca20: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c o, statePtr->ssl
ca30: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a , BIO_NOCLOSE);.
ca40: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 . /*. * E
ca50: 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 nd of SSL Init.
ca60: 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e */. dprin
ca70: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 tf("Returning %s
ca80: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
ca90: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
caa0: 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f self));. Tcl_
cab0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
cac0: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 , (char *) Tcl_G
cad0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
cae0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 atePtr->self), T
caf0: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 CL_VOLATILE);..
cb00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
cb10: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
cb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
cb60: 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a *. * UnimportObj
cb70: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
cb80: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
cb90: 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 nvoked to remove
cba0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
cbb0: 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a nnel filter.. *.
cbc0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
cbd0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
cbe0: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
cbf0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 effects:. *.May
cc00: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 modify the beha
cc10: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 vior of an IO ch
cc20: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d annel.. *. *----
cc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
cc70: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 */.static int.U
cc80: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c nimportObjCmd(Cl
cc90: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
cca0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
ccb0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
ccc0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
ccd0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
cce0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
ccf0: 2c 20 63 68 69 6c 64 3b 09 2f 2a 20 54 68 65 20 , child;./* The
cd00: 73 74 61 63 6b 65 64 20 61 6e 64 20 75 6e 64 65 stacked and unde
cd10: 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 73 20 rlying channels
cd20: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 */. Tcl_DStri
cd30: 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 ng upperChannelT
cd40: 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 ranslation, uppe
cd50: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
cd60: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e , upperChannelEn
cd70: 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 coding, upperCha
cd80: 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 nnelEOFChar;.
cd90: 20 69 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f 4f int res = TCL_O
cda0: 4b 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c K;. (void) cl
cdb0: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 ientData;.. d
cdc0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
cdd0: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
cde0: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
cdf0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
ce00: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
ce10: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 nel");..return T
ce20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
ce30: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 . /* Validate
ce40: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 2a 2f channel name */
ce50: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
ce60: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
ce70: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
ce80: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 (objv[1]), NULL)
ce90: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
cea0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
ceb0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
cec0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
ced0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
cee0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
cef0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
cf00: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
cf10: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
cf20: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
cf30: 63 68 69 6c 64 20 3d 20 54 63 6c 5f 47 65 74 53 child = Tcl_GetS
cf40: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 63 68 tackedChannel(ch
cf50: 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 an);.. /* Ver
cf60: 69 66 79 20 69 73 20 61 20 73 74 61 63 6b 65 64 ify is a stacked
cf70: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
cf80: 69 66 20 28 63 68 69 6c 64 20 3d 3d 20 4e 55 4c if (child == NUL
cf90: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
cfa0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
cfb0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
cfc0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
cfd0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
cfe0: 3a 20 6e 6f 74 20 61 20 73 74 61 63 6b 65 64 20 : not a stacked
cff0: 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 channel", (char
d000: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
d010: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
d020: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
d030: 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e UNIMPORT", "CHAN
d040: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c NEL", "INVALID",
d050: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d060: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
d070: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
d080: 2a 20 46 6c 75 73 68 20 61 6e 79 20 70 65 6e 64 * Flush any pend
d090: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 ing data */.
d0a0: 69 66 20 28 54 63 6c 5f 46 6c 75 73 68 28 63 68 if (Tcl_Flush(ch
d0b0: 61 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b an) != TCL_OK) {
d0c0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
d0d0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
d0e0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
d0f0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
d100: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 slation);. Tc
d110: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
d120: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
d130: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ing);. Tcl_DS
d140: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
d150: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
d160: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d170: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
d180: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 0a 20 20 elEncoding);..
d190: 20 20 2f 2a 20 47 65 74 20 63 75 72 72 65 6e 74 /* Get current
d1a0: 20 63 6f 6e 66 69 67 20 2d 20 45 4f 4c 20 74 72 config - EOL tr
d1b0: 61 6e 73 6c 61 74 69 6f 6e 2c 20 65 6e 63 6f 64 anslation, encod
d1c0: 69 6e 67 20 61 6e 64 20 62 75 66 66 65 72 69 6e ing and bufferin
d1d0: 67 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 73 68 g options are sh
d1e0: 61 72 65 64 20 62 65 74 77 65 65 6e 20 61 6c 6c ared between all
d1f0: 20 63 68 61 6e 6e 65 6c 73 20 69 6e 20 74 68 65 channels in the
d200: 20 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20 54 63 stack */. Tc
d210: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_GetChannelOpti
d220: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
d230: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 "-blocking", &u
d240: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
d250: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 ing);. Tcl_Ge
d260: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
d270: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 nterp, chan, "-e
d280: 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 ncoding", &upper
d290: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
d2a0: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 ;. Tcl_GetCha
d2b0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
d2c0: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 p, chan, "-eofch
d2d0: 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e ar", &upperChann
d2e0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 elEOFChar);.
d2f0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
d300: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
d310: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
d320: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
d330: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 0a 20 Translation);..
d340: 20 20 20 2f 2a 20 55 6e 73 74 61 63 6b 20 74 68 /* Unstack th
d350: 65 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20 72 65 e channel and re
d360: 73 74 6f 72 65 20 75 6e 64 65 72 6c 79 69 6e 67 store underlying
d370: 20 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 channel config
d380: 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 */. if (Tcl_U
d390: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e nstackChannel(in
d3a0: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 terp, chan) == T
d3b0: 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 65 CL_OK) {..Tcl_Se
d3c0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
d3d0: 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c 20 22 2d nterp, child, "-
d3e0: 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 encoding", Tcl_D
d3f0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
d400: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
d410: 67 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43 68 61 g));..Tcl_SetCha
d420: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
d430: 70 2c 20 63 68 69 6c 64 2c 20 22 2d 65 6f 66 63 p, child, "-eofc
d440: 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e har", Tcl_DStrin
d450: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
d460: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 09 nnelEOFChar));..
d470: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
d480: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 69 tion(interp, chi
d490: 6c 64 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f ld, "-translatio
d4a0: 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 n", Tcl_DStringV
d4b0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
d4c0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b elTranslation));
d4d0: 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c ..Tcl_SetChannel
d4e0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
d4f0: 68 69 6c 64 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 hild, "-blocking
d500: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 ", Tcl_DStringVa
d510: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 lue(&upperChanne
d520: 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 lBlocking));.
d530: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
d540: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
d550: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d }.. /* Clean-
d560: 75 70 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 up */. Tcl_DS
d570: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
d580: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
d590: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 on);. Tcl_DSt
d5a0: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 ringFree(&upperC
d5b0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b hannelEncoding);
d5c0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d5d0: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e Free(&upperChann
d5e0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 elEOFChar);.
d5f0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
d600: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f &upperChannelBlo
d610: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 72 65 74 75 cking);. retu
d620: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 rn res;.}.../*.
d630: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
d640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d670: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 ----. *. * CTX_I
d680: 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 nit -- construct
d690: 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 a SSL_CTX insta
d6a0: 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 nce. *. * Result
d6b0: 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 s:. *.A valid SS
d6c0: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f L_CTX instance o
d6d0: 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 r NULL.. *. * Si
d6e0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 de effects:. *.c
d6f0: 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f onstructs SSL co
d700: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 ntext (CTX). *.
d710: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
d720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d750: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
d760: 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e SSL_CTX *.CTX_In
d770: 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 it(State *stateP
d780: 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 tr, int isServer
d790: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 , int proto, cha
d7a0: 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 r *keyfile, char
d7b0: 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 *certfile,.
d7c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b unsigned char *k
d7d0: 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ey, unsigned cha
d7e0: 72 20 2a 63 65 72 74 2c 20 54 63 6c 5f 53 69 7a r *cert, Tcl_Siz
d7f0: 65 20 6b 65 79 5f 6c 65 6e 2c 20 54 63 6c 5f 53 e key_len, Tcl_S
d800: 69 7a 65 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 ize cert_len, ch
d810: 61 72 20 2a 43 41 70 61 74 68 2c 0a 20 20 20 20 ar *CApath,.
d820: 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 char *CAfile, ch
d830: 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 ar *ciphers, cha
d840: 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c r *ciphersuites,
d850: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 int level, char
d860: 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 *DHparams) {.
d870: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
d880: 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d terp = statePtr-
d890: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c >interp;. SSL
d8a0: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
d8b0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
d8c0: 67 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66 g ds;. int of
d8d0: 66 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 f = 0, abort = 0
d8e0: 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 ;. int load_p
d8f0: 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 rivate_key;.
d900: 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 const SSL_METHOD
d910: 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 *method;.. d
d920: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
d930: 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 ;.. if (!prot
d940: 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 o) {..Tcl_Append
d950: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
d960: 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f no valid protoco
d970: 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68 l selected", (ch
d980: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
d990: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
d9a0: 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 .. /* create
d9b0: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 SSL context */.#
d9c0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
d9d0: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 ON_NUMBER >= 0x1
d9e0: 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 0100000L || defi
d9f0: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 ned(NO_SSL2) ||
da00: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
da10: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 NO_SSL2). if
da20: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
da30: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 TLS_PROTO_SSL2))
da40: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
da50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 sult(interp, "SS
da60: 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 L2 protocol not
da70: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
da80: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
da90: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
daa0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
dab0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 ed(NO_SSL3) || d
dac0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
dad0: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 O_SSL3). if (
dae0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
daf0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 LS_PROTO_SSL3))
db00: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
db10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c ult(interp, "SSL
db20: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 3 protocol not s
db30: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
db40: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
db50: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
db60: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
db70: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 d(NO_TLS1) || de
db80: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
db90: 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 _TLS1). if (E
dba0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
dbb0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b S_PROTO_TLS1)) {
dbc0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
dbd0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 lt(interp, "TLS
dbe0: 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 1.0 protocol not
dbf0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
dc00: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
dc10: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
dc20: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
dc30: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c ned(NO_TLS1_1) |
dc40: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
dc50: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 L_NO_TLS1_1).
dc60: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
dc70: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
dc80: 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 S1_1)) {..Tcl_Ap
dc90: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
dca0: 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 p, "TLS 1.1 prot
dcb0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
dcc0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ed", (char *) NU
dcd0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
dce0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
dcf0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
dd00: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
dd10: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
dd20: 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 1_2). if (ENA
dd30: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
dd40: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b PROTO_TLS1_2)) {
dd50: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
dd60: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 lt(interp, "TLS
dd70: 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 1.2 protocol not
dd80: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
dd90: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
dda0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
ddb0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
ddc0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c ned(NO_TLS1_3) |
ddd0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
dde0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
ddf0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
de00: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
de10: 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 S1_3)) {..Tcl_Ap
de20: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
de30: 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 p, "TLS 1.3 prot
de40: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
de50: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ed", (char *) NU
de60: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
de70: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
de80: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d if (proto ==
de90: 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 0) {../* Use fu
dea0: 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c ll range */..SSL
deb0: 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f _CTX_set_min_pro
dec0: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 to_version(ctx,
ded0: 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 0);..SSL_CTX_set
dee0: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _max_proto_versi
def0: 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 on(ctx, 0);.
df00: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 }.. switch (p
df10: 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e roto) {.#if OPEN
df20: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
df30: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c ER < 0x10100000L
df40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f && !defined(NO_
df50: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 SSL2) && !define
df60: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
df70: 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 2). case TLS_
df80: 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 PROTO_SSL2:..met
df90: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
dfa0: 20 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 SSLv2_server_me
dfb0: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 thod() : SSLv2_c
dfc0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
dfd0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
dfe0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 if !defined(NO_S
dff0: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
e000: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
e010: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
e020: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 ENSSL_NO_SSL3_ME
e030: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 THOD). case T
e040: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 LS_PROTO_SSL3:..
e050: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
e060: 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 r ? SSLv3_server
e070: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 _method() : SSLv
e080: 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 3_client_method(
e090: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
e0a0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
e0b0: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
e0c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
e0d0: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
e0e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
e0f0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 _METHOD). cas
e100: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
e110: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 :..method = isSe
e120: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 rver ? TLSv1_ser
e130: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 ver_method() : T
e140: 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 LSv1_client_meth
e150: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
e160: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
e170: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 d(NO_TLS1_1) &&
e180: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e190: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 _NO_TLS1_1) && !
e1a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e1b0: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 NO_TLS1_1_METHOD
e1c0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
e1d0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 ROTO_TLS1_1:..me
e1e0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
e1f0: 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 ? TLSv1_1_server
e200: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 _method() : TLSv
e210: 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 1_1_client_metho
e220: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
e230: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
e240: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 (NO_TLS1_2) && !
e250: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e260: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
e270: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e280: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 O_TLS1_2_METHOD)
e290: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
e2a0: 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 OTO_TLS1_2:..met
e2b0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
e2c0: 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f TLSv1_2_server_
e2d0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 method() : TLSv1
e2e0: 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 _2_client_method
e2f0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
e300: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
e310: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
e320: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e330: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 O_TLS1_3). ca
e340: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
e350: 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 1_3:../* Use the
e360: 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 generic method
e370: 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 and constraint r
e380: 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 ange after conte
e390: 78 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f xt is created */
e3a0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
e3b0: 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 ver ? TLS_server
e3c0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f _method() : TLS_
e3d0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
e3e0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
e3f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a default:../*
e400: 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 Negotiate highe
e410: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c st available SSL
e420: 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a /TLS version */.
e430: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
e440: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f er ? TLS_server_
e450: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 method() : TLS_c
e460: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
e470: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
e480: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
e490: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
e4a0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 ined(NO_SSL2) &&
e4b0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
e4c0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 L_NO_SSL2)..off
e4d0: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 |= (ENABLED(prot
e4e0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c o, TLS_PROTO_SSL
e4f0: 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 2) ? 0 : SSL_O
e500: 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e P_NO_SSLv2);.#en
e510: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
e520: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 (NO_SSL3) && !de
e530: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e540: 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 _SSL3)..off |= (
e550: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
e560: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 LS_PROTO_SSL3)
e570: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
e580: 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a _SSLv3);.#endif.
e590: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
e5a0: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 TLS1) && !define
e5b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
e5c0: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 1)..off |= (ENAB
e5d0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
e5e0: 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 ROTO_TLS1) ? 0
e5f0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
e600: 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 v1);.#endif.#if
e610: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
e620: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
e630: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
e640: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 1)..off |= (ENAB
e650: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
e660: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 ROTO_TLS1_1) ? 0
e670: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
e680: 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 v1_1);.#endif.#i
e690: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
e6a0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
e6b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
e6c0: 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 1_2)..off |= (EN
e6d0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
e6e0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f _PROTO_TLS1_2) ?
e6f0: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
e700: 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a LSv1_2);.#endif.
e710: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
e720: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 TLS1_3) && !defi
e730: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
e740: 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 LS1_3)..off |= (
e750: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
e760: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
e770: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
e780: 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 _TLSv1_3);.#endi
e790: 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a f..break;. }.
e7a0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
e7b0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 rror();.. ctx
e7c0: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d = SSL_CTX_new(m
e7d0: 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 ethod);. if (
e7e0: 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 20 !ctx) {..return
e7f0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
e800: 20 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b if (getenv(SSLK
e810: 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 EYLOGFILE)) {..S
e820: 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f SL_CTX_set_keylo
e830: 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 g_callback(ctx,
e840: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b KeyLogCallback);
e850: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 . }..#if !def
e860: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
e870: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e880: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
e890: 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 if (proto ==
e8a0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
e8b0: 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 ) {..SSL_CTX_set
e8c0: 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _min_proto_versi
e8d0: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 on(ctx, TLS1_3_V
e8e0: 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 ERSION);..SSL_CT
e8f0: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f X_set_max_proto_
e900: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 version(ctx, TLS
e910: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 1_3_VERSION);.
e920: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 }.#endif..
e930: 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 /* Force cipher
e940: 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 selection order
e950: 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 by server */.
e960: 20 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20 if (!isServer)
e970: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f {..SSL_CTX_set_o
e980: 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f ptions(ctx, SSL_
e990: 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 OP_CIPHER_SERVER
e9a0: 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 _PREFERENCE);.
e9b0: 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c }..#if OPENSSL
e9c0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
e9d0: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 < 0x10100000L.
e9e0: 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c OpenSSL_add_al
e9f0: 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 l_algorithms();
ea00: 2f 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20 /* Load ciphers
ea10: 61 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 and digests */.#
ea20: 65 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 endif.. SSL_C
ea30: 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 TX_set_app_data(
ea40: 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 ctx, (void*)inte
ea50: 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 rp);./* remember
ea60: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 the interpreter
ea70: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f */. SSL_CTX_
ea80: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c set_options(ctx,
ea90: 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a SSL_OP_ALL);./*
eaa0: 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 all SSL bug wor
eab0: 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 karounds */.
eac0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
ead0: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f ons(ctx, SSL_OP_
eae0: 4e 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b NO_COMPRESSION);
eaf0: 09 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 ./* disable comp
eb00: 72 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 ression even if
eb10: 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 supported */.
eb20: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 SSL_CTX_set_opt
eb30: 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 ions(ctx, off);.
eb40: 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 ./* disable prot
eb50: 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f ocol versions */
eb60: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
eb70: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
eb80: 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 10101000L. SS
eb90: 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 L_CTX_set_mode(c
eba0: 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 tx, SSL_MODE_AUT
ebb0: 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e O_RETRY);./* han
ebc0: 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b dle new handshak
ebd0: 65 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 es in background
ebe0: 2e 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 . On by default
ebf0: 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 in OpenSSL 1.1.1
ec00: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 . */.#endif.
ec10: 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 SSL_CTX_sess_set
ec20: 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c _cache_size(ctx,
ec30: 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 128);.. /* S
ec40: 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 et user defined
ec50: 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 ciphers, cipher
ec60: 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 suites, and secu
ec70: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 rity level */.
ec80: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 if ((ciphers !
ec90: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f = NULL) && !SSL_
eca0: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c CTX_set_cipher_l
ecb0: 69 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 ist(ctx, ciphers
ecc0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
ecd0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
ece0: 53 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c Set ciphers fail
ecf0: 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 ed: No valid cip
ed00: 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 hers", (char *)
ed10: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f NULL);..SSL_CTX_
ed20: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 free(ctx);..retu
ed30: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 rn NULL;. }.
ed40: 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75 if ((ciphersu
ed50: 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 ites != NULL) &&
ed60: 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 !SSL_CTX_set_ci
ed70: 70 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 phersuites(ctx,
ed80: 63 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b ciphersuites)) {
ed90: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
eda0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 lt(interp, "Set
edb0: 63 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61 cipher suites fa
edc0: 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 iled: No valid c
edd0: 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a iphers", (char *
ede0: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 ) NULL);..SSL_CT
edf0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
ee00: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
ee10: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 .. /* Set sec
ee20: 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 urity level */.
ee30: 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d if (level > -
ee40: 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 1 && level < 6)
ee50: 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 {../* SSL_set_se
ee60: 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a curity_level */.
ee70: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 .SSL_CTX_set_sec
ee80: 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c urity_level(ctx,
ee90: 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a level);. }..
eea0: 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 /* set some
eeb0: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 callbacks */.
eec0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 SSL_CTX_set_def
eed0: 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 ault_passwd_cb(c
eee0: 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c tx, PasswordCall
eef0: 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 back);. SSL_C
ef00: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 TX_set_default_p
ef10: 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 asswd_cb_userdat
ef20: 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 a(ctx, (void *)s
ef30: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f tatePtr);.. /
ef40: 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d * read a Diffie-
ef50: 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 Hellman paramete
ef60: 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 rs file, or use
ef70: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 the built-in one
ef80: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 */. Tcl_DStr
ef90: 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 23 69 ingInit(&ds);.#i
efa0: 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f fdef OPENSSL_NO_
efb0: 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 DH. if (DHpar
efc0: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ams != NULL) {..
efd0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
efe0: 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 (interp, "DH par
eff0: 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e ameter support n
f000: 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 ot available", (
f010: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
f020: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
f030: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
f040: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 . }.#else.
f050: 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 {..DH* dh;..if
f060: 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c (DHparams != NUL
f070: 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 L) {.. BIO *b
f080: 69 6f 3b 0a 0a 09 20 20 20 20 62 69 6f 20 3d 20 io;... bio =
f090: 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e BIO_new_file(F2N
f0a0: 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c (DHparams, &ds),
f0b0: 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 "r");.. if (
f0c0: 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 !bio) {...Tcl_DS
f0d0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
f0e0: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
f0f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c lt(interp, "Coul
f100: 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 d not find DH pa
f110: 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 rameters file",
f120: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
f130: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
f140: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
f150: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 LL;.. }...
f160: 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 dh = PEM_read_b
f170: 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c io_DHparams(bio,
f180: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c NULL, NULL, NUL
f190: 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 L);.. BIO_fre
f1a0: 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c e(bio);.. Tcl
f1b0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
f1c0: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 );.. if (!dh)
f1d0: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 {...Tcl_AppendR
f1e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 esult(interp, "C
f1f0: 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 ould not read DH
f200: 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d parameters from
f210: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 file", (char *)
f220: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
f230: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
f240: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
f250: 20 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f }.. SSL_CTX_
f260: 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 set_tmp_dh(ctx,
f270: 64 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 dh);.. DH_fre
f280: 65 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 e(dh);...} else
f290: 7b 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65 {.. /* Use we
f2a0: 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 ll known DH para
f2b0: 6d 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65 meters that have
f2c0: 20 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 built-in suppor
f2d0: 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a t in OpenSSL */.
f2e0: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 . if (!SSL_CT
f2f0: 58 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 X_set_dh_auto(ct
f300: 78 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 x, 1)) {...Tcl_A
f310: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
f320: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 rp, "Could not e
f330: 6e 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74 nable set DH aut
f340: 6f 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 o: ", GET_ERR_RE
f350: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
f360: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
f370: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
f380: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
f390: 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 }..}. }.#end
f3a0: 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f if.. /* set o
f3b0: 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a ur certificate *
f3c0: 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 /. load_priva
f3d0: 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 te_key = 0;.
f3e0: 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 if (certfile !=
f3f0: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 NULL) {..load_pr
f400: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a ivate_key = 1;..
f410: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 .if (SSL_CTX_use
f420: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c _certificate_fil
f430: 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 e(ctx, F2N(certf
f440: 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 ile, &ds), SSL_F
f450: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 ILETYPE_PEM) <=
f460: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 0) {.. Tcl_DS
f470: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
f480: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
f490: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
f4a0: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 nable to set cer
f4b0: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c tificate file ",
f4c0: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c certfile, ": ",
f4d0: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f ...GET_ERR_REASO
f4e0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
f4f0: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
f500: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
f510: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 return NULL;..
f520: 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 }..Tcl_DStringFr
f530: 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d 20 ee(&ds);.. }
f540: 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d else if (cert !=
f550: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 NULL) {..load_p
f560: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a rivate_key = 1;.
f570: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 .if (SSL_CTX_use
f580: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e _certificate_ASN
f590: 31 28 63 74 78 2c 20 28 69 6e 74 29 20 63 65 72 1(ctx, (int) cer
f5a0: 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20 t_len, cert) <=
f5b0: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 0) {.. Tcl_Ap
f5c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f5d0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 p, "unable to se
f5e0: 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 t certificate: "
f5f0: 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 ,...GET_ERR_REAS
f600: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
f610: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
f620: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
f630: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
f640: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a .}. } else {.
f650: 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 .certfile = (cha
f660: 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 r*)X509_get_defa
f670: 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b ult_cert_file();
f680: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 ...if (SSL_CTX_u
f690: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 se_certificate_f
f6a0: 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c ile(ctx, certfil
f6b0: 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f e, SSL_FILETYPE_
f6c0: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 PEM) <= 0) {.#if
f6d0: 20 30 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 0.. Tcl_Appe
f6e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
f6f0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 "unable to use
f700: 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 default certific
f710: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 ate file ", cert
f720: 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 file, ": ",...GE
f730: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 T_ERR_REASON(),
f740: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
f750: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 . SSL_CTX_fre
f760: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 e(ctx);.. ret
f770: 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 urn NULL;.#endif
f780: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
f790: 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 * set our privat
f7a0: 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 e key */. if
f7b0: 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 (load_private_ke
f7c0: 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c y) {..if (keyfil
f7d0: 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 e == NULL && key
f7e0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 == NULL) {..
f7f0: 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 keyfile = certf
f800: 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 ile;..}...if (ke
f810: 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b yfile != NULL) {
f820: 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 .. /* get the
f830: 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 private key ass
f840: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 ociated with thi
f850: 73 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f s certificate */
f860: 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c .. if (keyfil
f870: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b e == NULL) {...k
f880: 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c eyfile = certfil
f890: 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 e;.. }...
f8a0: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f if (SSL_CTX_use_
f8b0: 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 PrivateKey_file(
f8c0: 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 ctx, F2N(keyfile
f8d0: 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 , &ds), SSL_FILE
f8e0: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 TYPE_PEM) <= 0)
f8f0: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 {...Tcl_DStringF
f900: 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 ree(&ds);.../* f
f910: 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 lush the passphr
f920: 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 ase which might
f930: 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 be left in the r
f940: 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 esult */...Tcl_S
f950: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
f960: 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 NULL, TCL_STATI
f970: 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 C);...Tcl_Append
f980: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
f990: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 unable to set pu
f9a0: 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c blic key file ",
f9b0: 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 keyfile, " ",..
f9c0: 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41 . GET_ERR_REA
f9d0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
f9e0: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
f9f0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
fa00: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
fa10: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
fa20: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d ngFree(&ds);...}
fa30: 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d else if (key !=
fa40: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 NULL) {.. if
fa50: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 (SSL_CTX_use_Pr
fa60: 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 ivateKey_ASN1(EV
fa70: 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c P_PKEY_RSA, ctx,
fa80: 20 6b 65 79 2c 20 28 69 6e 74 29 20 6b 65 79 5f key, (int) key_
fa90: 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f len) <= 0) {.../
faa0: 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 * flush the pass
fab0: 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 phrase which mig
fac0: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 ht be left in th
fad0: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 e result */...Tc
fae0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
faf0: 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 rp, NULL, TCL_ST
fb00: 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 ATIC);...Tcl_App
fb10: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
fb20: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 , "unable to set
fb30: 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 public key: ",
fb40: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
fb50: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
fb60: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
fb70: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
fb80: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a NULL;.. }..}.
fb90: 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 ./* Now we know
fba0: 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 that a key and c
fbb0: 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 ert have been se
fbc0: 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 t against.. * th
fbd0: 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f e SSL context */
fbe0: 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 ..if (!SSL_CTX_c
fbf0: 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 heck_private_key
fc00: 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 (ctx)) {.. Tc
fc10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
fc20: 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 nterp, "private
fc30: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 key does not mat
fc40: 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 ch the certifica
fc50: 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a te public key",.
fc60: 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 ... (char *)
fc70: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c NULL);.. SSL
fc80: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
fc90: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c . return NULL
fca0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
fcb0: 2f 2a 20 53 65 74 20 74 6f 20 75 73 65 20 64 65 /* Set to use de
fcc0: 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61 fault location a
fcd0: 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 65 72 74 nd file for Cert
fce0: 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74 ificate Authorit
fcf0: 79 20 28 43 41 29 20 63 65 72 74 69 66 69 63 61 y (CA) certifica
fd00: 74 65 73 2e 20 54 68 65 0a 20 20 20 20 20 2a 20 tes. The. *
fd10: 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 verify path and
fd20: 73 74 6f 72 65 20 63 61 6e 20 62 65 20 6f 76 65 store can be ove
fd30: 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 rridden by the S
fd40: 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 20 SL_CERT_DIR env
fd50: 76 61 72 2e 20 54 68 65 20 76 65 72 69 66 79 20 var. The verify
fd60: 66 69 6c 65 20 63 61 6e 0a 20 20 20 20 20 2a 20 file can. *
fd70: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 be overridden by
fd80: 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 the SSL_CERT_FI
fd90: 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 20 LE env var. */.
fda0: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f if (!SSL_CTX_
fdb0: 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 set_default_veri
fdc0: 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b fy_paths(ctx)) {
fdd0: 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 7d ..abort++;. }
fde0: 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 64 .. /* Overrid
fdf0: 65 73 20 66 6f 72 20 74 68 65 20 43 41 20 76 65 es for the CA ve
fe00: 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 66 69 rify path and fi
fe10: 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 20 le */. {.#if
fe20: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
fe30: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
fe40: 30 30 30 4c 0a 09 69 66 20 28 43 41 70 61 74 68 000L..if (CApath
fe50: 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 69 != NULL || CAfi
fe60: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 le != NULL) {..
fe70: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 Tcl_DString d
fe80: 73 31 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 s1;.. Tcl_DSt
fe90: 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a ringInit(&ds1);.
fea0: 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 .. if (!SSL_C
feb0: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c TX_load_verify_l
fec0: 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 ocations(ctx, F2
fed0: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 N(CAfile, &ds),
fee0: 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73 31 F2N(CApath, &ds1
fef0: 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b ))) {...abort++;
ff00: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c .. }.. Tcl
ff10: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
ff20: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 );.. Tcl_DStr
ff30: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 0a ingFree(&ds1);..
ff40: 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 . /* Set list
ff50: 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20 of CAs to send
ff60: 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 to client when r
ff70: 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65 equesting a clie
ff80: 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a nt certificate *
ff90: 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 73 3a /.. /* https:
ffa0: 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 //sourceforge.ne
ffb0: 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f t/p/tls/bugs/57/
ffc0: 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 58 3a */.. /* XXX:
ffd0: 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 TODO: Let the us
ffe0: 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 er supply values
fff0: 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 here instead of
10000 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 something that
10010 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 exists on the fi
10020 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 20 20 lesystem */..
10030 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e STACK_OF(X509_N
10040 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 AME) *certNames
10050 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e = SSL_load_clien
10060 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 t_CA_file(F2N(CA
10070 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 file, &ds));..
10080 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 if (certNames
10090 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c != NULL) {...SSL
100a0 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
100b0 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 CA_list(ctx, cer
100c0 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a tNames);.. }.
100d0 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
100e0 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 23 Free(&ds);..}..#
100f0 65 6c 73 65 0a 09 69 66 20 28 43 41 70 61 74 68 else..if (CApath
10100 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
10110 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f if (!SSL_CTX_lo
10120 61 64 5f 76 65 72 69 66 79 5f 64 69 72 28 63 74 ad_verify_dir(ct
10130 78 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 x, F2N(CApath, &
10140 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b ds))) {...abort+
10150 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 +;.. }.. T
10160 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
10170 64 73 29 3b 0a 09 7d 0a 09 69 66 20 28 43 41 66 ds);..}..if (CAf
10180 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ile != NULL) {..
10190 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 if (!SSL_CTX
101a0 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 69 6c _load_verify_fil
101b0 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c e(ctx, F2N(CAfil
101c0 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 e, &ds))) {...ab
101d0 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 ort++;.. }..
101e0 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
101f0 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 20 2f ee(&ds);... /
10200 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41 * Set list of CA
10210 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 s to send to cli
10220 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74 ent when request
10230 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72 ing a client cer
10240 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 tificate */..
10250 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e STACK_OF(X509_N
10260 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 AME) *certNames
10270 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e = SSL_load_clien
10280 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 t_CA_file(F2N(CA
10290 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 file, &ds));..
102a0 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 if (certNames
102b0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c != NULL) {...SSL
102c0 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
102d0 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 CA_list(ctx, cer
102e0 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a tNames);.. }.
102f0 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
10300 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65 Free(&ds);..}.#e
10310 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ndif. }..
10320 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a return ctx;.}...
10330 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
10340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10370 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 --------. *. * S
10380 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 tatusObjCmd -- r
10390 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 eturn certificat
103a0 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 e for connected
103b0 70 65 65 72 20 69 6e 66 6f 2e 0a 20 2a 0a 20 2a peer info.. *. *
103c0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
103d0 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
103e0 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
103f0 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
10400 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
10410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10440 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
10450 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f atic int.StatusO
10460 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
10470 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
10480 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
10490 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
104a0 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
104b0 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
104c0 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 tatePtr;. X50
104d0 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 9 *peer;. Tcl
104e0 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 _Obj *objPtr;.
104f0 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
10500 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 an;. char *ch
10510 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 annelName, *ciph
10520 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 ers;. int mod
10530 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
10540 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 igned char *prot
10550 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 o;. unsigned
10560 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 int len;. int
10570 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20 20 28 nid, res;. (
10580 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
10590 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
105a0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
105b0 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f f (objc < 2 || o
105c0 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 bjc > 3 || (objc
105d0 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70 == 3 && !strcmp
105e0 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f (Tcl_GetString(o
105f0 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c bjv[1]), "-local
10600 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e "))) {..Tcl_Wron
10610 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
10620 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 1, objv, "?-loc
10630 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 al? channel");..
10640 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
10650 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
10660 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a Get channel Id *
10670 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d /. channelNam
10680 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e e = Tcl_GetStrin
10690 67 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 g(objv[(objc ==
106a0 32 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 2 ? 1 : 2)]);.
106b0 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
106c0 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
106d0 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f channelName, &mo
106e0 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 de);. if (cha
106f0 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
10700 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
10710 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
10720 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
10730 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
10740 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
10750 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
10760 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
10770 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 Channel(chan);.
10780 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
10790 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
107a0 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
107b0 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
107c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
107d0 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
107e0 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
107f0 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 elName(chan),...
10800 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
10810 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a hannel", (char *
10820 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 ) NULL);..Tcl_Se
10830 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
10840 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 p, "TLS", "STATU
10850 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 S", "CHANNEL", "
10860 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
10870 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
10880 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
10890 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 }. statePtr
108a0 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f = (State *) Tcl_
108b0 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
108c0 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 ceData(chan);..
108d0 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66 /* Get certif
108e0 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f icate for peer o
108f0 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 r self */. if
10900 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
10910 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 peer = SSL_get_p
10920 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 eer_certificate(
10930 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
10940 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 } else {..pe
10950 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 er = SSL_get_cer
10960 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 tificate(statePt
10970 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 r->ssl);. }.
10980 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63 /* Get X509 c
10990 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20 ertificate info
109a0 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 */. if (peer)
109b0 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 {..objPtr = Tls
109c0 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 _NewX509Obj(inte
109d0 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28 rp, peer);..if (
109e0 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 objc == 2) {..
109f0 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 72 X509_free(peer
10a00 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e );.. peer = N
10a10 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c ULL;..}. } el
10a20 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 se {..objPtr = T
10a30 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
10a40 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 NULL);. }..
10a50 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 /* Peer name
10a60 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 */. LAPPEND_S
10a70 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10a80 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 r, "peername", S
10a90 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 SL_get0_peername
10aa0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c (statePtr->ssl),
10ab0 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e -1);. LAPPEN
10ac0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
10ad0 6a 50 74 72 2c 20 22 73 62 69 74 73 22 2c 20 53 jPtr, "sbits", S
10ae0 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69 SL_get_cipher_bi
10af0 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ts(statePtr->ssl
10b00 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 , NULL));.. c
10b10 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 iphers = (char*)
10b20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 SSL_get_cipher(s
10b30 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
10b40 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
10b50 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10b60 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 cipher", ciphers
10b70 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 , -1);.. /* V
10b80 65 72 69 66 79 20 74 68 65 20 58 35 30 39 20 63 erify the X509 c
10b90 65 72 74 69 66 69 63 61 74 65 20 70 72 65 73 65 ertificate prese
10ba0 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 65 72 nted by the peer
10bb0 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f */. LAPPEND_
10bc0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
10bd0 74 72 2c 20 22 76 65 72 69 66 79 52 65 73 75 6c tr, "verifyResul
10be0 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 79 t",..X509_verify
10bf0 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 _cert_error_stri
10c00 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 ng(SSL_get_verif
10c10 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 y_result(statePt
10c20 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a r->ssl)), -1);..
10c30 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f /* Verify mo
10c40 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d de */. mode =
10c50 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f SSL_get_verify_
10c60 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73 mode(statePtr->s
10c70 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 sl);. if (mod
10c80 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f e && SSL_VERIFY_
10c90 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 NONE) {..LAPPEND
10ca0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
10cb0 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 Ptr, "verifyMode
10cc0 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a ", "none", -1);.
10cd0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
10ce0 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 l_Obj *listObjPt
10cf0 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
10d00 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 bj(0, NULL);..if
10d10 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 (mode && SSL_VE
10d20 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 RIFY_PEER) {..
10d30 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
10d40 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
10d50 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 p, listObjPtr, T
10d60 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
10d70 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d "peer", -1));..}
10d80 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 ..if (mode && SS
10d90 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 L_VERIFY_FAIL_IF
10da0 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b _NO_PEER_CERT) {
10db0 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
10dc0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10dd0 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 nterp, listObjPt
10de0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
10df0 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 Obj("fail if no
10e00 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29 peer cert", -1))
10e10 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 ;..}..if (mode &
10e20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 & SSL_VERIFY_CLI
10e30 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 ENT_ONCE) {..
10e40 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
10e50 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10e60 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 , listObjPtr, Tc
10e70 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
10e80 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 client once", -1
10e90 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 ));..}..if (mode
10ea0 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 && SSL_VERIFY_P
10eb0 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b OST_HANDSHAKE) {
10ec0 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
10ed0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10ee0 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 nterp, listObjPt
10ef0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
10f00 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68 Obj("post handsh
10f10 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 ake", -1));..}..
10f20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 LAPPEND_OBJ(inte
10f30 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 rp, objPtr, "ver
10f40 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 ifyMode", listOb
10f50 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 jPtr). }..
10f60 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 /* Verify mode
10f70 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 depth */. LAP
10f80 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
10f90 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 objPtr, "verify
10fa0 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f Depth", SSL_get_
10fb0 76 65 72 69 66 79 5f 64 65 70 74 68 28 73 74 61 verify_depth(sta
10fc0 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 tePtr->ssl));..
10fd0 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 /* Report the
10fe0 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 selected protoc
10ff0 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f ol as a result o
11000 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f f the negotiatio
11010 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 n */. SSL_get
11020 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 0_alpn_selected(
11030 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
11040 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 proto, &len);.
11050 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
11060 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 terp, objPtr, "a
11070 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72 lpn", (char *)pr
11080 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 oto, (Tcl_Size)
11090 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e len);. LAPPEN
110a0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
110b0 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 jPtr, "protocol"
110c0 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f , SSL_get_versio
110d0 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 n(statePtr->ssl)
110e0 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 , -1);.. /* V
110f0 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 alid for non-RSA
11100 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54 signature and T
11110 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 LS 1.3 */. if
11120 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
11130 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 res = SSL_get_pe
11140 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 er_signature_nid
11150 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
11160 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 &nid);. } els
11170 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 e {..res = SSL_g
11180 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 et_signature_nid
11190 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
111a0 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 &nid);. }.
111b0 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 if (!res) {nid
111c0 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e = 0;}. LAPPEN
111d0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
111e0 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 jPtr, "signature
111f0 48 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 HashAlgorithm",
11200 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c OBJ_nid2ln(nid),
11210 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 -1);.. /* Ad
11220 64 65 64 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 ded in OpenSSL 1
11230 2e 31 2e 31 61 20 2a 2f 0a 23 69 66 20 4f 50 45 .1.1a */.#if OPE
11240 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
11250 42 45 52 20 3e 20 30 78 31 30 31 30 31 30 30 30 BER > 0x10101000
11260 4c 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d L. if (objc =
11270 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 = 2) {..res = SS
11280 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 L_get_peer_signa
11290 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 ture_type_nid(st
112a0 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
112b0 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b d);. } else {
112c0 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f ..res = SSL_get_
112d0 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e signature_type_n
112e0 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c id(statePtr->ssl
112f0 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 , &nid);. }.
11300 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 if (!res) {ni
11310 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 d = 0;}. LAPP
11320 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11330 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 objPtr, "signatu
11340 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 reType", OBJ_nid
11350 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 23 2ln(nid), -1);.#
11360 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 endif.. Tcl_S
11370 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
11380 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
11390 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
113a0 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
113b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
113c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
113d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
113e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
113f0 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 * ConnectionInf
11400 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 oObjCmd -- retur
11410 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 n connection inf
11420 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a o from OpenSSL..
11430 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
11440 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e *.A list of conn
11450 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a ection info. *.
11460 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
11470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
114a0 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
114b0 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e c int Connection
114c0 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e InfoObjCmd(Clien
114d0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
114e0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
114f0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
11500 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
11510 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
11520 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 _Channel chan;..
11530 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 /* The channel t
11540 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 o set a mode on
11550 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 */. State *st
11560 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 atePtr;../* clie
11570 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c nt state for ssl
11580 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 socket */. T
11590 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 cl_Obj *objPtr,
115a0 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f *listPtr;. co
115b0 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 nst SSL *ssl;.
115c0 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 const SSL_CIPH
115d0 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 ER *cipher;.
115e0 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f const SSL_SESSIO
115f0 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 N *session;.
11600 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 const EVP_MD *md
11610 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 ;. (void) cli
11620 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 entData;.. if
11630 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
11640 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
11650 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
11660 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
11670 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
11680 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e . }.. chan
11690 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
116a0 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
116b0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 tString(objv[1])
116c0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 , NULL);. if
116d0 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
116e0 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
116f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
11700 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
11710 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
11720 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
11730 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
11740 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
11750 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
11760 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 );. if (Tcl_G
11770 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
11780 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
11790 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
117a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
117b0 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
117c0 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
117d0 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
117e0 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 ,.. "\": not
117f0 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 a TLS channel",
11800 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
11810 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
11820 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
11830 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 "CONNECTION", "
11840 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c CHANNEL", "INVAL
11850 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ID", (char *) NU
11860 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
11870 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
11880 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
11890 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
118a0 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e LL);.. /* Con
118b0 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a nection info */.
118c0 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
118d0 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
118e0 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
118f0 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 ta(chan);. ss
11900 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 l = statePtr->ss
11910 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 l;. if (ssl !
11920 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 = NULL) {..const
11930 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
11940 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 proto;..unsigned
11950 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 09 2f 2a 20 int ulen;.../*
11960 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 Initialization f
11970 69 6e 69 73 68 65 64 20 2a 2f 0a 09 4c 41 50 50 inished */..LAPP
11980 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
11990 20 6f 62 6a 50 74 72 2c 20 22 69 6e 69 74 5f 66 objPtr, "init_f
119a0 69 6e 69 73 68 65 64 22 2c 20 53 53 4c 5f 69 73 inished", SSL_is
119b0 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 _init_finished(s
119c0 73 6c 29 29 3b 0a 09 0a 09 2f 2a 20 63 6f 6e 6e sl));..../* conn
119d0 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a ection state */.
119e0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
119f0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 erp, objPtr, "st
11a00 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f ate", SSL_state_
11a10 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 string_long(ssl)
11a20 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 , -1);.../* Get
11a30 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65 SNI requested se
11a40 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 rver name */..LA
11a50 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11a60 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 , objPtr, "serve
11a70 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f rname", SSL_get_
11a80 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 servername(ssl,
11a90 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f TLSEXT_NAMETYPE_
11aa0 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b host_name), -1);
11ab0 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 .../* Report the
11ac0 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 selected protoc
11ad0 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f ol as a result o
11ae0 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f f the negotiatio
11af0 6e 20 2a 2f 0a 09 53 53 4c 5f 67 65 74 30 5f 61 n */..SSL_get0_a
11b00 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 lpn_selected(sta
11b10 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f tePtr->ssl, &pro
11b20 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 to, &ulen);..LAP
11b30 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11b40 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c objPtr, "alpn",
11b50 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 (char *)proto,
11b60 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 (Tcl_Size) ulen)
11b70 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f ;.../* Get proto
11b80 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f col */..LAPPEND_
11b90 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11ba0 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 tr, "protocol",
11bb0 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 SSL_get_version(
11bc0 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 ssl), -1);.../*
11bd0 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c Renegotiation al
11be0 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e lowed */..LAPPEN
11bf0 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
11c00 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 bjPtr, "renegoti
11c10 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 ation_allowed",
11c20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 SSL_get_secure_r
11c30 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 enegotiation_sup
11c40 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c port((SSL *) ssl
11c50 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 ));.../* Get sec
11c60 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 urity level */..
11c70 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
11c80 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 rp, objPtr, "sec
11c90 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 urity_level", SS
11ca0 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c L_get_security_l
11cb0 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a evel(ssl));.../*
11cc0 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f Session info */
11cd0 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
11ce0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11cf0 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c session_reused",
11d00 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 SSL_session_reu
11d10 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 sed(ssl));.../*
11d20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a Is server info *
11d30 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
11d40 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11d50 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c "is_server", SSL
11d60 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 _is_server(ssl))
11d70 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a ;.../* Is DTLS *
11d80 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
11d90 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11da0 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 "is_dtls", SSL_i
11db0 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 0a 23 s_dtls(ssl));..#
11dc0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
11dd0 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33 ON_NUMBER >= 0x3
11de0 30 32 30 30 30 30 30 4c 0a 09 2f 2a 20 49 73 20 0200000L../* Is
11df0 51 55 49 43 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 QUIC */..LAPPEND
11e00 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
11e10 6a 50 74 72 2c 20 22 69 73 5f 71 75 69 63 22 2c jPtr, "is_quic",
11e20 20 53 53 4c 5f 69 73 5f 71 75 69 63 28 73 73 6c SSL_is_quic(ssl
11e30 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 54 4c 53 20 ));.../* Is TLS
11e40 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
11e50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11e60 20 22 69 73 5f 74 6c 73 22 2c 20 53 53 4c 5f 69 "is_tls", SSL_i
11e70 73 5f 74 6c 73 28 73 73 6c 29 29 3b 0a 23 65 6e s_tls(ssl));.#en
11e80 64 69 66 0a 0a 09 2f 2a 20 44 41 4e 45 20 54 4c dif.../* DANE TL
11e90 53 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e S authentication
11ea0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f */..LAPPEND_BOO
11eb0 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 L(interp, objPtr
11ec0 2c 20 22 64 61 6e 65 5f 61 75 74 68 22 2c 20 53 , "dane_auth", S
11ed0 53 4c 5f 67 65 74 30 5f 64 61 6e 65 28 73 73 6c SL_get0_dane(ssl
11ee0 29 20 21 3d 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a ) != NULL);.../*
11ef0 20 57 61 69 74 69 6e 67 20 66 6f 72 20 61 73 79 Waiting for asy
11f00 6e 63 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 nc */..LAPPEND_B
11f10 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
11f20 74 72 2c 20 22 77 61 69 74 69 6e 67 5f 66 6f 72 tr, "waiting_for
11f30 5f 61 73 79 6e 63 22 2c 20 53 53 4c 5f 77 61 69 _async", SSL_wai
11f40 74 69 6e 67 5f 66 6f 72 5f 61 73 79 6e 63 28 73 ting_for_async(s
11f50 73 6c 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 2d sl));.../* Time-
11f60 6f 75 74 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f out */..LAPPEND_
11f70 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a LONG(interp, obj
11f80 50 74 72 2c 20 22 74 69 6d 65 2d 6f 75 74 22 2c Ptr, "time-out",
11f90 20 53 53 4c 5f 67 65 74 5f 64 65 66 61 75 6c 74 SSL_get_default
11fa0 5f 74 69 6d 65 6f 75 74 28 73 73 6c 29 29 3b 0a _timeout(ssl));.
11fb0 0a 09 2f 2a 20 49 73 20 43 65 72 74 69 66 69 63 ../* Is Certific
11fc0 61 74 65 20 54 72 61 6e 73 70 61 72 65 6e 63 79 ate Transparency
11fd0 20 76 61 6c 69 64 61 74 69 6f 6e 20 65 6e 61 62 validation enab
11fe0 6c 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f led */..LAPPEND_
11ff0 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
12000 50 74 72 2c 20 22 63 74 5f 65 6e 61 62 6c 65 64 Ptr, "ct_enabled
12010 22 2c 20 53 53 4c 5f 63 74 5f 69 73 5f 65 6e 61 ", SSL_ct_is_ena
12020 62 6c 65 64 28 73 73 6c 29 29 3b 0a 20 20 20 20 bled(ssl));.
12030 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72 }.. /* Cipher
12040 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 info */. cip
12050 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 her = SSL_get_cu
12060 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c rrent_cipher(ssl
12070 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 );. if (ciphe
12080 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 r != NULL) {..ch
12090 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d ar buf[BUFSIZ] =
120a0 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c {0};..int bits,
120b0 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 alg_bits;.../*
120c0 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 Cipher name */..
120d0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
120e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
120f0 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 her", SSL_CIPHER
12100 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 _get_name(cipher
12110 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 ), -1);.../* RFC
12120 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 name of cipher
12130 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
12140 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12150 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c "standard_name",
12160 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e SSL_CIPHER_stan
12170 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 dard_name(cipher
12180 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 ), -1);.../* Ope
12190 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 nSSL name of cip
121a0 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
121b0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
121c0 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d tr, "openssl_nam
121d0 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 e", OPENSSL_ciph
121e0 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 er_name(SSL_CIPH
121f0 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 ER_standard_name
12200 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
12210 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 ../* number of s
12220 65 63 72 65 74 20 62 69 74 73 20 75 73 65 64 20 ecret bits used
12230 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 for cipher */..b
12240 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 its = SSL_CIPHER
12250 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 _get_bits(cipher
12260 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c , &alg_bits);..L
12270 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
12280 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 p, objPtr, "secr
12290 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b et_bits", bits);
122a0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
122b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 terp, objPtr, "a
122c0 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 lgorithm_bits",
122d0 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 alg_bits);../* a
122e0 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 lg_bits is actua
122f0 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 l key secret bit
12300 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 61 s. If use bits a
12310 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 nd secret (algor
12320 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 ithm) bits diffe
12330 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 r,.. the rest
12340 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20 of the bits are
12350 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 fixed, i.e. for
12360 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 limited export c
12370 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 iphers (bits < 5
12380 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 6) */.../* Indic
12390 61 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54 ates which SSL/T
123a0 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 LS protocol vers
123b0 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65 ion first define
123c0 64 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a d the cipher */.
123d0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
123e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 erp, objPtr, "mi
123f0 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f n_version", SSL_
12400 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 CIPHER_get_versi
12410 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b on(cipher), -1);
12420 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 .../* Cipher NID
12430 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
12440 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12450 20 22 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63 "cipherNID", (c
12460 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e har *)OBJ_nid2ln
12470 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f (SSL_CIPHER_get_
12480 63 69 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65 cipher_nid(ciphe
12490 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 r)), -1);..LAPPE
124a0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
124b0 62 6a 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49 bjPtr, "digestNI
124c0 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f D", (char *)OBJ_
124d0 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 nid2ln(SSL_CIPHE
124e0 52 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 R_get_digest_nid
124f0 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
12500 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
12510 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 erp, objPtr, "ke
12520 79 45 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 yExchangeNID", (
12530 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c char *)OBJ_nid2l
12540 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 n(SSL_CIPHER_get
12550 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29 _kx_nid(cipher))
12560 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f , -1);..LAPPEND_
12570 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12580 74 72 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74 tr, "authenticat
12590 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a ionNID", (char *
125a0 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f )OBJ_nid2ln(SSL_
125b0 43 49 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f CIPHER_get_auth_
125c0 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
125d0 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 );.../* message
125e0 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 authentication c
125f0 6f 64 65 20 2d 20 43 69 70 68 65 72 20 69 73 20 ode - Cipher is
12600 41 45 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f AEAD (e.g. GCM o
12610 72 20 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 r ChaCha20/Poly1
12620 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 305) or not */..
12630 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 74 65 64 /* Authenticated
12640 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68 Encryption with
12650 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 associated data
12660 20 28 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f (AEAD) check */
12670 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
12680 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12690 63 69 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c cipher_is_aead",
126a0 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 SSL_CIPHER_is_a
126b0 65 61 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 ead(cipher));...
126c0 2f 2a 20 44 69 67 65 73 74 20 75 73 65 64 20 64 /* Digest used d
126d0 75 72 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c uring the SSL/TL
126e0 53 20 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e S handshake when
126f0 20 75 73 69 6e 67 20 74 68 65 20 63 69 70 68 65 using the ciphe
12700 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f r. */..md = SSL_
12710 43 49 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 CIPHER_get_hands
12720 68 61 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68 hake_digest(ciph
12730 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 er);..LAPPEND_ST
12740 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
12750 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 , "handshake_dig
12760 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56 est", (char *)EV
12770 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d P_MD_name(md), -
12780 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 1);.../* Get Ope
12790 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 nSSL-specific ID
127a0 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f , not IANA ID */
127b0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
127c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
127d0 69 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 ipher_id", (int)
127e0 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
127f0 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f id(cipher));.../
12800 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73 * Two-byte ID us
12810 65 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72 ed in the TLS pr
12820 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 otocol of the gi
12830 76 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c ven cipher */..L
12840 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
12850 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 p, objPtr, "prot
12860 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 ocol_id", (int)
12870 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 SSL_CIPHER_get_p
12880 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 rotocol_id(ciphe
12890 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 r));.../* Textua
128a0 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 l description of
128b0 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 the cipher */..
128c0 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 if (SSL_CIPHER_d
128d0 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 escription(ciphe
128e0 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 r, buf, sizeof(b
128f0 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a uf)) != NULL) {.
12900 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
12910 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12920 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 "description",
12930 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 buf, -1);..}.
12940 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 }.. /* Sessi
12950 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 on info */. s
12960 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 ession = SSL_get
12970 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 _session(ssl);.
12980 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21 if (session !
12990 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 = NULL) {..const
129a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
129b0 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 ticket;..size_t
129c0 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 len2;..unsigned
129d0 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 int ulen;..const
129e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
129f0 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f session_id, *pro
12a00 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 to;..unsigned ch
12a10 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 ar buffer[SSL_MA
12a20 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e X_MASTER_KEY_LEN
12a30 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 GTH];.../* Repor
12a40 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 t the selected p
12a50 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 rotocol as a res
12a60 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 ult of the ALPN
12a70 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 negotiation */..
12a80 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
12a90 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 _alpn_selected(s
12aa0 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 ession, &proto,
12ab0 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 &len2);..LAPPEND
12ac0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12ad0 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 Ptr, "alpn", (ch
12ae0 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 ar *) proto, (Tc
12af0 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a l_Size) len2);..
12b00 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 ./* Report the s
12b10 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
12b20 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 as a result of
12b30 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 the NPN negotiat
12b40 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 ion */.#ifdef US
12b50 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f E_NPN..SSL_get0_
12b60 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 next_proto_negot
12b70 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 iated(ssl, &prot
12b80 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 o, &ulen);..LAPP
12b90 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
12ba0 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 objPtr, "npn", (
12bb0 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 char *) proto, (
12bc0 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b Tcl_Size) ulen);
12bd0 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 .#endif.../* Res
12be0 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a umable session *
12bf0 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
12c00 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12c10 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c "resumable", SSL
12c20 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 _SESSION_is_resu
12c30 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b mable(session));
12c40 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 .../* Session st
12c50 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 art time (second
12c60 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a s since epoch) *
12c70 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 /..LAPPEND_LONG(
12c80 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12c90 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 "start_time", SS
12ca0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
12cb0 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 me(session));...
12cc0 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 /* Timeout value
12cd0 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 - SSL_CTX_get_t
12ce0 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e imeout (in secon
12cf0 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ds) */..LAPPEND_
12d00 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a LONG(interp, obj
12d10 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 Ptr, "timeout",
12d20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
12d30 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 timeout(session)
12d40 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
12d50 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 id - TLSv1.2 and
12d60 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 below only */..
12d70 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c session_id = SSL
12d80 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 _SESSION_get_id(
12d90 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b session, &ulen);
12da0 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
12db0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12dc0 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 "session_id", s
12dd0 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f ession_id, (Tcl_
12de0 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f Size) ulen);.../
12df0 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 * Session contex
12e00 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 t */..session_id
12e10 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
12e20 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 et0_id_context(s
12e30 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a ession, &ulen);.
12e40 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
12e50 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12e60 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 "session_context
12e70 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 ", session_id, (
12e80 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b Tcl_Size) ulen);
12e90 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 .../* Session ti
12ea0 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e cket - client on
12eb0 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 ly */..SSL_SESSI
12ec0 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 ON_get0_ticket(s
12ed0 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c ession, &ticket,
12ee0 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e &len2);..LAPPEN
12ef0 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c D_BARRAY(interp,
12f00 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
12f10 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 n_ticket", ticke
12f20 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 t, (Tcl_Size) le
12f30 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f n2);.../* Sessio
12f40 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d n ticket lifetim
12f50 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e e hint (in secon
12f60 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ds) */..LAPPEND_
12f70 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a LONG(interp, obj
12f80 50 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c Ptr, "lifetime",
12f90 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
12fa0 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 _ticket_lifetime
12fb0 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b _hint(session));
12fc0 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 .../* Ticket app
12fd0 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 4f 50 45 data */.#if OPE
12fe0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
12ff0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
13000 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 L..SSL_SESSION_g
13010 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 et0_ticket_appda
13020 74 61 28 28 53 53 4c 5f 53 45 53 53 49 4f 4e 20 ta((SSL_SESSION
13030 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 *) session, &tic
13040 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 ket, &len2);..LA
13050 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 PPEND_BARRAY(int
13060 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 erp, objPtr, "ti
13070 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 cket_app_data",
13080 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a ticket, (Tcl_Siz
13090 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 66 e) len2);.#endif
130a0 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 .../* Get master
130b0 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 key */..len2 =
130c0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
130d0 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 master_key(sessi
130e0 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f on, buffer, SSL_
130f0 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c MAX_MASTER_KEY_L
13100 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 ENGTH);..LAPPEND
13110 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
13120 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f objPtr, "master_
13130 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20 28 54 key", buffer, (T
13140 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a cl_Size) len2);.
13150 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e ../* Compression
13160 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 id */..unsigned
13170 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 int id = SSL_SE
13180 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 SSION_get_compre
13190 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a ss_id(session);.
131a0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
131b0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f erp, objPtr, "co
131c0 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 mpression_id", i
131d0 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 d == 1 ? "zlib"
131e0 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 : "none", -1);.
131f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d }.. /* Com
13200 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f pression info */
13210 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 . if (ssl !=
13220 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 NULL) {.#ifdef H
13230 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 AVE_SSL_COMPRESS
13240 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f ION..const COMP_
13250 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 METHOD *comp, *e
13260 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c xpn;..comp = SSL
13270 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d _get_current_com
13280 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 pression(ssl);..
13290 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 expn = SSL_get_c
132a0 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e urrent_expansion
132b0 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 (ssl);...LAPPEND
132c0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
132d0 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f Ptr, "compressio
132e0 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 n", comp ? SSL_C
132f0 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d OMP_get_name(com
13300 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 p) : "none", -1)
13310 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
13320 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
13330 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e expansion", expn
13340 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f ? SSL_COMP_get_
13350 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f name(expn) : "no
13360 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a ne", -1);.#else.
13370 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
13380 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f erp, objPtr, "co
13390 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e mpression", "non
133a0 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e e", -1);..LAPPEN
133b0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
133c0 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e jPtr, "expansion
133d0 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a ", "none", -1);.
133e0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
133f0 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f /* Server info
13400 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 */. {..long
13410 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 mode = SSL_CTX_g
13420 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 et_session_cache
13430 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e _mode(statePtr->
13440 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 ctx);..char *msg
13450 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53 ;...if (mode & S
13460 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 SL_SESS_CACHE_OF
13470 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 F) {.. msg =
13480 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 "off";..} else i
13490 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 f (mode & SSL_SE
134a0 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 SS_CACHE_CLIENT)
134b0 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63 {.. msg = "c
134c0 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 lient";..} else
134d0 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 if (mode & SSL_S
134e0 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 ESS_CACHE_SERVER
134f0 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 ) {.. msg = "
13500 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 server";..} else
13510 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f if (mode & SSL_
13520 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 SESS_CACHE_BOTH)
13530 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62 {.. msg = "b
13540 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a oth";..} else {.
13550 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e . msg = "unkn
13560 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e own";..}..LAPPEN
13570 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
13580 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 jPtr, "session_c
13590 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c ache_mode", msg,
135a0 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 -1);. }..
135b0 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 /* CA List */.
135c0 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 /* IF not a s
135d0 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53 erver, same as S
135e0 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f SL_get0_peer_CA_
135f0 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65 72 20 list. If server
13600 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f same as SSL_CTX_
13610 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 get_client_CA_li
13620 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 st */. listPt
13630 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
13640 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 bj(0, NULL);.
13650 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e STACK_OF(X509_N
13660 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 AME) *ca_list;.
13670 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20 if ((ca_list
13680 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 = SSL_get_client
13690 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 _CA_list(ssl)) !
136a0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 = NULL) {..char
136b0 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a buffer[BUFSIZ];.
136c0 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b .for (int i = 0;
136d0 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d i < sk_X509_NAM
136e0 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 E_num(ca_list);
136f0 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 i++) {.. X509
13700 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b _NAME *name = sk
13710 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 _X509_NAME_value
13720 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 (ca_list, i);..
13730 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 if (name) {..
13740 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 .X509_NAME_oneli
13750 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c ne(name, buffer,
13760 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f BUFSIZ);...Tcl_
13770 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
13780 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
13790 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tPtr, Tcl_NewStr
137a0 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d ingObj(buffer, -
137b0 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 1));.. }..}.
137c0 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 }. LAPPEND
137d0 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a _OBJ(interp, obj
137e0 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c Ptr, "caList", l
137f0 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 istPtr);. LAP
13800 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
13810 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 objPtr, "caList
13820 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f Count", sk_X509_
13830 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 NAME_num(ca_list
13840 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 ));.. Tcl_Set
13850 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
13860 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 , objPtr);. r
13870 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
13880 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
13890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
138a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
138b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
138c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
138d0 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d VersionObjCmd -
138e0 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e - return version
138f0 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 string from Ope
13900 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 nSSL.. *. * Resu
13910 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
13920 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
13930 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
13940 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
13950 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
13960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13990 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
139a0 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d int.VersionObjCm
139b0 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
139c0 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
139d0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
139e0 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
139f0 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
13a00 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
13a10 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 Ptr;. (void)
13a20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 clientData;.
13a30 28 76 6f 69 64 29 20 6f 62 6a 63 3b 0a 20 20 20 (void) objc;.
13a40 20 28 76 6f 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 (void) objv;..
13a50 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
13a60 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 ed");.. objPt
13a70 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e r = Tcl_NewStrin
13a80 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 gObj(OPENSSL_VER
13a90 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a SION_TEXT, -1);.
13aa0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
13ab0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
13ac0 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 Ptr);.. retur
13ad0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
13ae0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
13af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b20 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 ------. *. * Mis
13b30 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 cObjCmd -- misc
13b40 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 commands. *. * R
13b50 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
13b60 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
13b70 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
13b80 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
13b90 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
13ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13bd0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
13be0 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d ic int.MiscObjCm
13bf0 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
13c00 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
13c10 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
13c20 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
13c30 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
13c40 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 static const
13c50 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 char *commands
13c60 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 [] = { "req", "s
13c70 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a trreq", NULL };.
13c80 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 enum command
13c90 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 { C_REQ, C_STRR
13ca0 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 EQ, C_DUMMY };.
13cb0 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b Tcl_Size cmd;
13cc0 0a 20 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a . int isStr;.
13cd0 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b char buffer[
13ce0 31 36 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69 16384];. (voi
13cf0 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a d) clientData;..
13d00 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
13d10 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
13d20 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c objc < 2) {..Tcl
13d30 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
13d40 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
13d50 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 subcommand ?args
13d60 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c ?");..return TCL
13d70 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
13d80 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 if (Tcl_GetInd
13d90 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 exFromObj(interp
13da0 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 , objv[1], comma
13db0 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 nds, "command",
13dc0 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 0, &cmd) != TCL_
13dd0 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
13de0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
13df0 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
13e00 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 ror();.. isSt
13e10 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 r = (cmd == C_ST
13e20 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 RREQ);. switc
13e30 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 h ((enum command
13e40 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 ) cmd) {..case C
13e50 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 _REQ:..case C_ST
13e60 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 RREQ: {.. EVP
13e70 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c _PKEY *pkey=NULL
13e80 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 ;.. X509 *cer
13e90 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 t=NULL;.. X50
13ea0 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 9_NAME *name=NUL
13eb0 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 L;.. Tcl_Obj
13ec0 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63 **listv;.. Tc
13ed0 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 l_Size listc;..
13ee0 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 int i;...
13ef0 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a BIO *out=NULL;..
13f00 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 . char *k_C="
13f10 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d ",*k_ST="",*k_L=
13f20 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 "",*k_O="",*k_OU
13f30 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f ="",*k_CN="",*k_
13f40 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 Email="";.. c
13f50 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d har *keyout,*pem
13f60 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 out,*str;.. i
13f70 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 nt keysize,seria
13f80 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 l=0,days=365;..#
13f90 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
13fa0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
13fb0 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 000000L.. BIG
13fc0 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b NUM *bne = NULL;
13fd0 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d .. RSA *rsa =
13fe0 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 NULL;.#else..
13ff0 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a EVP_PKEY_CTX *
14000 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 ctx = NULL;.#end
14010 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 if... if ((ob
14020 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 jc<5) || (objc>6
14030 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 )) {...Tcl_Wrong
14040 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
14050 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 2, objv, "keysiz
14060 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 e keyfile certfi
14070 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 le ?info?");...r
14080 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
14090 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 .. }... if
140a0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
140b0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
140c0 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 [2], &keysize) !
140d0 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 = TCL_OK) {...re
140e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
140f0 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f . }.. keyo
14100 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 ut=Tcl_GetString
14110 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 (objv[3]);..
14120 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 pemout=Tcl_GetSt
14130 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 ring(objv[4]);..
14140 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b if (isStr) {
14150 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e ...Tcl_SetVar(in
14160 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 terp,keyout,"",0
14170 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 );...Tcl_SetVar(
14180 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 interp,pemout,""
14190 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ,0);.. }...
141a0 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b if (objc>=6) {
141b0 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f ...if (Tcl_ListO
141c0 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e bjGetElements(in
141d0 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 terp, objv[5], &
141e0 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 listc, &listv) !
141f0 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 = TCL_OK) {...
14200 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
14210 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 OR;...}....if ((
14220 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b listc%2) != 0) {
14230 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 ... Tcl_SetRe
14240 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 sult(interp,"Inf
14250 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 ormation list mu
14260 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d st have even num
14270 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
14280 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 ",NULL);... r
14290 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
142a0 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b ...}...for (i=0;
142b0 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 i<listc; i+=2)
142c0 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f {... str=Tcl_
142d0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
142e0 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 i]);... if (s
142f0 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 trcmp(str,"days"
14300 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 )==0) {....if (T
14310 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
14320 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b (interp,listv[i+
14330 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 1],&days)!=TCL_O
14340 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e K).... return
14350 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 TCL_ERROR;...
14360 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
14370 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 cmp(str,"serial"
14380 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 )==0) {....if (T
14390 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
143a0 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b (interp,listv[i+
143b0 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 1],&serial)!=TCL
143c0 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 _OK).... retu
143d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
143e0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
143f0 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d trcmp(str,"C")==
14400 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 0) {....k_C=Tcl_
14410 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
14420 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
14430 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
14440 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 tr,"ST")==0) {..
14450 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 ..k_ST=Tcl_GetSt
14460 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
14470 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
14480 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c f (strcmp(str,"L
14490 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d ")==0) {....k_L=
144a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
144b0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
144c0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
144d0 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 mp(str,"O")==0)
144e0 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 {....k_O=Tcl_Get
144f0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
14500 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
14510 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
14520 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b "OU")==0) {....k
14530 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e _OU=Tcl_GetStrin
14540 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
14550 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
14560 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 strcmp(str,"CN")
14570 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 ==0) {....k_CN=T
14580 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
14590 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
145a0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
145b0 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d p(str,"Email")==
145c0 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 0) {....k_Email=
145d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
145e0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
145f0 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c } else {....Tcl
14600 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
14610 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d p,"Unknown param
14620 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 eter",NULL);....
14630 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
14640 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 ;... }...}..
14650 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 }..#if OPENSS
14660 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
14670 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
14680 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 bne = BN_new
14690 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 ();.. rsa = R
146a0 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 SA_new();.. p
146b0 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e key = EVP_PKEY_n
146c0 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 ew();.. if (b
146d0 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 ne == NULL || rs
146e0 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 a == NULL || pke
146f0 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e y == NULL || !BN
14700 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 _set_word(bne,RS
14710 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f A_F4) ||...!RSA_
14720 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 generate_key_ex(
14730 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e rsa, keysize, bn
14740 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 e, NULL) || !EVP
14750 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 _PKEY_assign_RSA
14760 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 (pkey, rsa)) {..
14770 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 .EVP_PKEY_free(p
14780 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 key);.../* RSA_f
14790 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 ree(rsa); freed
147a0 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 by EVP_PKEY_free
147b0 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e */...BN_free(bn
147c0 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 e);.#else.. p
147d0 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 key = EVP_RSA_ge
147e0 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 n((unsigned int)
147f0 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 keysize);..
14800 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 ctx = EVP_PKEY_C
14810 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c TX_new(pkey,NULL
14820 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 );.. if (pkey
14830 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 == NULL || ctx
14840 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f == NULL || !EVP_
14850 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 PKEY_keygen_init
14860 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f (ctx) ||...!EVP_
14870 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 PKEY_CTX_set_rsa
14880 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 _keygen_bits(ctx
14890 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 , keysize) || !E
148a0 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 VP_PKEY_keygen(c
148b0 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 tx, &pkey)) {...
148c0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
148d0 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f ey);...EVP_PKEY_
148e0 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 CTX_free(ctx);.#
148f0 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 endif...Tcl_SetR
14900 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 esult(interp,"Er
14910 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 ror generating p
14920 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c rivate key",NULL
14930 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
14940 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c ERROR;.. } el
14950 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 se {...if (isStr
14960 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 ) {... out=BI
14970 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 O_new(BIO_s_mem(
14980 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 ));... PEM_wr
14990 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b ite_bio_PrivateK
149a0 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c ey(out,pkey,NULL
149b0 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c ,NULL,0,NULL,NUL
149c0 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f L);... i=BIO_
149d0 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c read(out,buffer,
149e0 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 sizeof(buffer)-1
149f0 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 );... i=(i<0)
14a00 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 ? 0 : i;...
14a10 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a buffer[i]='\0';.
14a20 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 .. Tcl_SetVar
14a30 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 (interp,keyout,b
14a40 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 uffer,0);...
14a50 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a BIO_flush(out);.
14a60 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f .. BIO_free(o
14a70 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a ut);...} else {.
14a80 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 .. out=BIO_ne
14a90 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b w(BIO_s_file());
14aa0 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 ... BIO_write
14ab0 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 _filename(out,ke
14ac0 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d yout);... PEM
14ad0 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 _write_bio_Priva
14ae0 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e teKey(out,pkey,N
14af0 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c ULL,NULL,0,NULL,
14b00 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 NULL);... /*
14b10 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 PEM_write_bio_RS
14b20 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c APrivateKey(out,
14b30 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c rsa, NULL, NULL
14b40 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 , 0, NULL, NULL)
14b50 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 ; */... BIO_f
14b60 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 ree_all(out);..
14b70 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d .}....if ((cert=
14b80 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c X509_new())==NUL
14b90 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 L) {... Tcl_S
14ba0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
14bb0 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e "Error generatin
14bc0 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65 g certificate re
14bd0 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 quest",NULL);...
14be0 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 EVP_PKEY_fre
14bf0 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 e(pkey);.#if OPE
14c00 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
14c10 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
14c20 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 L... BN_free(
14c30 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 bne);.#endif...
14c40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
14c50 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 ROR;...}....X509
14c60 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 _set_version(cer
14c70 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 t,2);...ASN1_INT
14c80 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 EGER_set(X509_ge
14c90 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 t_serialNumber(c
14ca0 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 ert),serial);...
14cb0 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 X509_gmtime_adj(
14cc0 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 X509_getm_notBef
14cd0 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 ore(cert),0);...
14ce0 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 X509_gmtime_adj(
14cf0 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 X509_getm_notAft
14d00 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 er(cert),(long)6
14d10 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 0*60*24*days);..
14d20 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 .X509_set_pubkey
14d30 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 (cert,pkey);....
14d40 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 name=X509_get_su
14d50 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 bject_name(cert)
14d60 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 ;....X509_NAME_a
14d70 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
14d80 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 name,"C", MBSTRI
14d90 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
14da0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
14db0 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b k_C, -1, -1, 0);
14dc0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
14dd0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
14de0 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e me,"ST", MBSTRIN
14df0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
14e00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
14e10 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _ST, -1, -1, 0);
14e20 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
14e30 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
14e40 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 me,"L", MBSTRING
14e50 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
14e60 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
14e70 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 L, -1, -1, 0);..
14e80 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
14e90 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
14ea0 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 ,"O", MBSTRING_A
14eb0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
14ec0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c ned char *) k_O,
14ed0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
14ee0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
14ef0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
14f00 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 OU", MBSTRING_AS
14f10 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
14f20 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c ed char *) k_OU,
14f30 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
14f40 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
14f50 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
14f60 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 CN", MBSTRING_AS
14f70 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
14f80 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c ed char *) k_CN,
14f90 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
14fa0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
14fb0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
14fc0 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 Email", MBSTRING
14fd0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
14fe0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
14ff0 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 Email, -1, -1, 0
15000 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 );....X509_set_s
15010 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 ubject_name(cert
15020 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 ,name);....if (!
15030 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 X509_sign(cert,p
15040 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 key,EVP_sha256()
15050 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f )) {... X509_
15060 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 free(cert);...
15070 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 EVP_PKEY_free(
15080 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 pkey);.#if OPENS
15090 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
150a0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
150b0 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e .. BN_free(bn
150c0 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 e);.#endif...
150d0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
150e0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 nterp,"Error sig
150f0 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 ning certificate
15100 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 ",NULL);... r
15110 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
15120 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 ...}....if (isSt
15130 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 r) {... out=B
15140 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d IO_new(BIO_s_mem
15150 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ());... PEM_w
15160 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 rite_bio_X509(ou
15170 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 t,cert);... i
15180 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 =BIO_read(out,bu
15190 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 ffer,sizeof(buff
151a0 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d er)-1);... i=
151b0 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 (i<0) ? 0 : i;..
151c0 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 . buffer[i]='
151d0 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 \0';... Tcl_S
151e0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d etVar(interp,pem
151f0 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 out,buffer,0);..
15200 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f . BIO_flush(o
15210 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 ut);... BIO_f
15220 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c ree(out);...} el
15230 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 se {... out=B
15240 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c IO_new(BIO_s_fil
15250 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f e());... BIO_
15260 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f write_filename(o
15270 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 ut,pemout);...
15280 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
15290 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a X509(out,cert);.
152a0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 .. BIO_free_a
152b0 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 ll(out);...}....
152c0 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b X509_free(cert);
152d0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
152e0 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e (pkey);.#if OPEN
152f0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
15300 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
15310 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b ...BN_free(bne);
15320 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 .#endif.. }..
15330 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 }..break;. de
15340 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 fault:..break;.
15350 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
15360 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a TCL_OK;.}.../***
15370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15380 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 */./* Init
15390 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a */./*****
153a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
153b0 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
153c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
153d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
153e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
153f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
15400 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a Tls_Free --. *.
15410 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
15420 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e e cleans up when
15430 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
15440 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 sed channel. *.i
15450 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 s closed and its
15460 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
15470 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 falls below 1.
15480 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
15490 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .none. *. * Side
154a0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 effects:. *.Fre
154b0 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 es all the state
154c0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
154d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
154e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
154f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15500 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
15510 69 64 0a 54 6c 73 5f 46 72 65 65 28 74 6c 73 5f id.Tls_Free(tls_
15520 66 72 65 65 5f 74 79 70 65 20 2a 62 6c 6f 63 6b free_type *block
15530 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 Ptr) {. State
15540 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
15550 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a ate *)blockPtr;.
15560 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
15570 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 lled");.. Tls
15580 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 _Clean(statePtr)
15590 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f ;. ckfree(blo
155a0 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ckPtr);.}.../*.
155b0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
155c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
155d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
155e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
155f0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 ----. *. * Tls_C
15600 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 lean --. *. *.Th
15610 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 is procedure cle
15620 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 ans up when a SS
15630 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 L socket based c
15640 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f hannel. *.is clo
15650 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 sed and its refe
15660 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c rence count fall
15670 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 s below 1. This
15680 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 should. *.be ca
15690 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 lled synchronous
156a0 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 ly by the CloseP
156b0 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a roc, not in the.
156c0 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 *.EventuallyFre
156d0 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 e callback.. *.
156e0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f * Results:. *.no
156f0 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
15700 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 fects:. *.Frees
15710 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a all the state. *
15720 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
15730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15760 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 ------. */.void
15770 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 Tls_Clean(State
15780 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 *statePtr) {.
15790 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
157a0 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
157b0 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f tePtr->ssl) {../
157c0 2a 20 53 65 6e 64 20 63 6c 6f 73 65 5f 6e 6f 74 * Send close_not
157d0 69 66 79 20 6d 65 73 73 61 67 65 20 2a 2f 0a 09 ify message */..
157e0 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 73 68 75 dprintf("SSL_shu
157f0 74 64 6f 77 6e 28 25 70 29 22 2c 20 73 74 61 74 tdown(%p)", stat
15800 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c ePtr->ssl);..SSL
15810 5f 73 68 75 74 64 6f 77 6e 28 73 74 61 74 65 50 _shutdown(stateP
15820 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a tr->ssl);. }.
15830 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 . /*. * w
15840 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 e're assuming he
15850 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 re that we're si
15860 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 ngle-threaded.
15870 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 */. if (st
15880 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d atePtr->timer !=
15890 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e (Tcl_TimerToken
158a0 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 ) NULL) {..Tcl_D
158b0 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 eleteTimerHandle
158c0 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 r(statePtr->time
158d0 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 r);..statePtr->t
158e0 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 imer = NULL;.
158f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 }.. /* Remov
15900 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 e callbacks */.
15910 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
15920 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 >callback) {..Tc
15930 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
15940 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
15950 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 k);..statePtr->c
15960 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a allback = NULL;.
15970 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
15980 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
15990 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 ) {..Tcl_DecrRef
159a0 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
159b0 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 password);..stat
159c0 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d ePtr->password =
159d0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
159e0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
159f0 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 cmd) {..Tcl_Decr
15a00 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
15a10 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 r->vcmd);..state
15a20 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c Ptr->vcmd = NULL
15a30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
15a40 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
15a50 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 s) {..ckfree(sta
15a60 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a tePtr->protos);.
15a70 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
15a80 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a s = NULL;. }.
15a90 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
15aa0 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 r->bio) {../* Th
15ab0 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c is will call SSL
15ac0 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 _shutdown. Bug 1
15ad0 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 414045 */..dprin
15ae0 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c tf("BIO_free_all
15af0 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d (%p)", statePtr-
15b00 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 >bio);..BIO_free
15b10 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 _all(statePtr->b
15b20 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e io);..statePtr->
15b30 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 bio = NULL;.
15b40 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
15b50 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 Ptr->ssl) {..dpr
15b60 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 intf("SSL_free(%
15b70 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 p)", statePtr->s
15b80 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 sl);..SSL_free(s
15b90 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 tatePtr->ssl);..
15ba0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 statePtr->ssl =
15bb0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
15bc0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
15bd0 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 tx) {..SSL_CTX_f
15be0 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ree(statePtr->ct
15bf0 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 x);..statePtr->c
15c00 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d tx = NULL;. }
15c10 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
15c20 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a eturning");.}...
15c30 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
15c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
15c80 2a 20 42 75 69 6c 64 20 49 6e 66 6f 20 43 6f 6d * Build Info Com
15c90 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 mand --. *. *.Cr
15ca0 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
15cb0 72 65 74 75 72 6e 20 62 75 69 6c 64 20 69 6e 66 return build inf
15cc0 6f 20 66 6f 72 20 70 61 63 6b 61 67 65 2e 0a 20 o for package..
15cd0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
15ce0 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
15cf0 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 result. *. * Sid
15d00 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 e effects:. *.Cr
15d10 65 61 74 65 64 20 62 75 69 6c 64 2d 69 6e 66 6f eated build-info
15d20 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 2d command.. *. *-
15d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d70 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 6e 64 -----. */..#ifnd
15d80 65 66 20 53 54 52 49 4e 47 49 46 59 0a 23 20 20 ef STRINGIFY.#
15d90 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49 46 59 define STRINGIFY
15da0 28 78 29 20 53 54 52 49 4e 47 49 46 59 31 28 78 (x) STRINGIFY1(x
15db0 29 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 49 ).# define STRI
15dc0 4e 47 49 46 59 31 28 78 29 20 23 78 0a 23 65 6e NGIFY1(x) #x.#en
15dd0 64 69 66 0a 0a 69 6e 74 0a 42 75 69 6c 64 49 6e dif..int.BuildIn
15de0 66 6f 43 6f 6d 6d 61 6e 64 28 54 63 6c 5f 49 6e foCommand(Tcl_In
15df0 74 65 72 70 2a 20 69 6e 74 65 72 70 29 20 7b 0a terp* interp) {.
15e00 20 20 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 Tcl_CmdInfo
15e10 69 6e 66 6f 3b 0a 0a 20 20 20 20 69 66 20 28 54 info;.. if (T
15e20 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 cl_GetCommandInf
15e30 6f 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 63 6c o(interp, "::tcl
15e40 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 26 ::build-info", &
15e50 69 6e 66 6f 29 29 20 7b 0a 09 54 63 6c 5f 43 72 info)) {..Tcl_Cr
15e60 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
15e70 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 62 nterp, "::tls::b
15e80 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 69 6e 66 6f uild-info", info
15e90 2e 6f 62 6a 50 72 6f 63 2c 20 28 76 6f 69 64 20 .objProc, (void
15ea0 2a 29 28 0a 09 09 50 41 43 4b 41 47 45 5f 56 45 *)(...PACKAGE_VE
15eb0 52 53 49 4f 4e 20 22 2b 22 20 53 54 52 49 4e 47 RSION "+" STRING
15ec0 49 46 59 28 54 4c 53 5f 56 45 52 53 49 4f 4e 5f IFY(TLS_VERSION_
15ed0 55 55 49 44 29 0a 23 69 66 20 64 65 66 69 6e 65 UUID).#if define
15ee0 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20 d(__clang__) &&
15ef0 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f defined(__clang_
15f00 6d 61 6a 6f 72 5f 5f 29 0a 09 09 09 20 20 20 20 major__)....
15f10 22 2e 63 6c 61 6e 67 2d 22 20 53 54 52 49 4e 47 ".clang-" STRING
15f20 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f IFY(__clang_majo
15f30 72 5f 5f 29 0a 23 69 66 20 5f 5f 63 6c 61 6e 67 r__).#if __clang
15f40 5f 6d 69 6e 6f 72 5f 5f 20 3c 20 31 30 0a 09 09 _minor__ < 10...
15f50 09 20 20 20 20 22 30 22 0a 23 65 6e 64 69 66 0a . "0".#endif.
15f60 09 09 09 20 20 20 20 53 54 52 49 4e 47 49 46 59 ... STRINGIFY
15f70 28 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f (__clang_minor__
15f80 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ).#endif.#if def
15f90 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 ined(__cplusplus
15fa0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f ) && !defined(__
15fb0 4f 42 4a 43 5f 5f 29 0a 09 09 09 20 20 20 20 22 OBJC__).... "
15fc0 2e 63 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 .cplusplus".#end
15fd0 69 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 if.#ifndef NDEBU
15fe0 47 0a 09 09 09 20 20 20 20 22 2e 64 65 62 75 67 G.... ".debug
15ff0 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ".#endif.#if !de
16000 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 fined(__clang__)
16010 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 49 && !defined(__I
16020 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 20 26 NTEL_COMPILER) &
16030 26 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 & defined(__GNUC
16040 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 67 63 63 __).... ".gcc
16050 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 47 -" STRINGIFY(__G
16060 4e 55 43 5f 5f 29 0a 23 69 66 20 5f 5f 47 4e 55 NUC__).#if __GNU
16070 43 5f 4d 49 4e 4f 52 5f 5f 20 3c 20 31 30 0a 09 C_MINOR__ < 10..
16080 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64 69 66 .. "0".#endif
16090 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47 49 46 .... STRINGIF
160a0 59 28 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f Y(__GNUC_MINOR__
160b0 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ).#endif.#ifdef
160c0 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 __INTEL_COMPILER
160d0 0a 09 09 09 20 20 20 20 22 2e 69 63 63 2d 22 20 .... ".icc-"
160e0 53 54 52 49 4e 47 49 46 59 28 5f 5f 49 4e 54 45 STRINGIFY(__INTE
160f0 4c 5f 43 4f 4d 50 49 4c 45 52 29 0a 23 65 6e 64 L_COMPILER).#end
16100 69 66 0a 23 69 66 64 65 66 20 54 43 4c 5f 4d 45 if.#ifdef TCL_ME
16110 4d 5f 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 M_DEBUG.... "
16120 2e 6d 65 6d 64 65 62 75 67 22 0a 23 65 6e 64 69 .memdebug".#endi
16130 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d f.#if defined(_M
16140 53 43 5f 56 45 52 29 0a 09 09 09 20 20 20 20 22 SC_VER).... "
16150 2e 6d 73 76 63 2d 22 20 53 54 52 49 4e 47 49 46 .msvc-" STRINGIF
16160 59 28 5f 4d 53 43 5f 56 45 52 29 0a 23 65 6e 64 Y(_MSC_VER).#end
16170 69 66 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 4d if.#ifdef USE_NM
16180 41 4b 45 0a 09 09 09 20 20 20 20 22 2e 6e 6d 61 AKE.... ".nma
16190 6b 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 ke".#endif.#ifnd
161a0 65 66 20 54 43 4c 5f 43 46 47 5f 4f 50 54 49 4d ef TCL_CFG_OPTIM
161b0 49 5a 45 44 0a 09 09 09 20 20 20 20 22 2e 6e 6f IZED.... ".no
161c0 2d 6f 70 74 69 6d 69 7a 65 22 0a 23 65 6e 64 69 -optimize".#endi
161d0 66 0a 23 69 66 64 65 66 20 5f 5f 4f 42 4a 43 5f f.#ifdef __OBJC_
161e0 5f 0a 09 09 09 20 20 20 20 22 2e 6f 62 6a 65 63 _.... ".objec
161f0 74 69 76 65 2d 63 22 0a 23 69 66 20 64 65 66 69 tive-c".#if defi
16200 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 ned(__cplusplus)
16210 0a 09 09 09 20 20 20 20 22 70 6c 75 73 70 6c 75 .... "plusplu
16220 73 22 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 s".#endif.#endif
16230 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 46 47 5f .#ifdef TCL_CFG_
16240 50 52 4f 46 49 4c 45 44 0a 09 09 09 20 20 20 20 PROFILED....
16250 22 2e 70 72 6f 66 69 6c 65 22 0a 23 65 6e 64 69 ".profile".#endi
16260 66 0a 23 69 66 64 65 66 20 50 55 52 49 46 59 0a f.#ifdef PURIFY.
16270 09 09 09 20 20 20 20 22 2e 70 75 72 69 66 79 22 ... ".purify"
16280 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 .#endif.#ifdef S
16290 54 41 54 49 43 5f 42 55 49 4c 44 0a 09 09 09 20 TATIC_BUILD....
162a0 20 20 20 22 2e 73 74 61 74 69 63 22 0a 23 65 6e ".static".#en
162b0 64 69 66 0a 09 09 29 2c 20 4e 55 4c 4c 29 3b 0a dif...), NULL);.
162c0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
162d0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
162e0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
162f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16310 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 --------*. *. *
16320 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e 20 2d TlsLibShutdown -
16330 2d 0a 20 2a 0a 20 2a 09 53 68 75 74 64 6f 77 6e -. *. *.Shutdown
16340 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 SSL library onc
16350 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f e per applicatio
16360 6e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a n. *. * Results:
16370 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
16380 43 4c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 CL result. *. *
16390 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
163a0 09 53 68 75 74 64 6f 77 6e 20 53 53 4c 20 6c 69 .Shutdown SSL li
163b0 62 72 61 72 79 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d brary. *. *-----
163c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
163d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
163e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
163f0 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e -*. */.static in
16400 74 20 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e t TlsLibShutdown
16410 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
16420 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20 42 49 ntData) {. BI
16430 4f 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 20 20 20 O_cleanup();.
16440 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
16450 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
16460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
16490 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 *. *.TlsLibInit
164a0 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61 --. *. *.Initia
164b0 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 lizes SSL librar
164c0 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 y once per appli
164d0 63 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73 cation. *. * Res
164e0 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
164f0 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 ard Tcl result.
16500 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
16510 73 3a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 s:. *.Initialize
16520 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a s SSL library. *
16530 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
16540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 ---------*. */.s
16570 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 tatic int TlsLib
16580 49 6e 69 74 28 29 20 7b 0a 20 20 20 20 73 74 61 Init() {. sta
16590 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 tic int initiali
165a0 7a 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 zed = 0;.. dp
165b0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
165c0 0a 0a 20 20 20 20 69 66 20 28 21 69 6e 69 74 69 .. if (!initi
165d0 61 6c 69 7a 65 64 29 20 7b 0a 09 2f 2a 20 49 6e alized) {../* In
165e0 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 itialize BOTH li
165f0 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 bcrypto and libs
16600 73 6c 2e 20 2a 2f 0a 09 69 66 20 28 21 4f 50 45 sl. */..if (!OPE
16610 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 NSSL_init_ssl(OP
16620 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f ENSSL_INIT_LOAD_
16630 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 SSL_STRINGS | OP
16640 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f ENSSL_INIT_LOAD_
16650 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 CRYPTO_STRINGS..
16660 20 20 20 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e | OPENSSL_IN
16670 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 IT_ADD_ALL_CIPHE
16680 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 RS | OPENSSL_INI
16690 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 T_ADD_ALL_DIGEST
166a0 53 0a 09 20 20 20 20 7c 20 4f 50 45 4e 53 53 4c S.. | OPENSSL
166b0 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 4f 4e 46 49 _INIT_LOAD_CONFI
166c0 47 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 G | OPENSSL_INIT
166d0 5f 41 53 59 4e 43 2c 20 4e 55 4c 4c 29 29 20 7b _ASYNC, NULL)) {
166e0 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
166f0 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
16700 43 72 65 61 74 65 20 42 49 4f 20 68 61 6e 64 6c Create BIO handl
16710 65 72 73 20 2a 2f 0a 09 42 49 4f 5f 6e 65 77 5f ers */..BIO_new_
16720 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 09 0a tcl(NULL, 0);...
16730 09 2f 2a 20 43 72 65 61 74 65 20 65 78 69 74 20 ./* Create exit
16740 68 61 6e 64 6c 65 72 20 2a 2f 0a 09 54 63 6c 5f handler */..Tcl_
16750 43 72 65 61 74 65 45 78 69 74 48 61 6e 64 6c 65 CreateExitHandle
16760 72 28 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e r(TlsLibShutdown
16770 2c 20 4e 55 4c 4c 29 3b 0a 09 69 6e 69 74 69 61 , NULL);..initia
16780 6c 69 7a 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d lized = 1;. }
16790 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
167a0 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 20 49 6e 69 74 20 OK;.}.../* Init
167b0 73 63 72 69 70 74 20 2a 2f 0a 73 74 61 74 69 63 script */.static
167c0 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 const char tlsT
167d0 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d clInitScript[] =
167e0 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 {.#include "tls
167f0 2e 74 63 6c 2e 68 22 0a 7d 3b 0a 0a 2f 2a 0a 20 .tcl.h".};../*.
16800 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
16810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16840 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 ----. *. * Tls_I
16850 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 nit --. *. *.Thi
16860 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 s is a package i
16870 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 nitialization pr
16880 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 ocedure, which i
16890 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 s called. *.by T
168a0 43 4c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 CL when this pac
168b0 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 kage is to be ad
168c0 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 ded to an interp
168d0 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 reter.. *. * Res
168e0 75 6c 74 73 3a 0a 20 2a 09 49 6e 69 74 69 61 6c ults:. *.Initial
168f0 69 7a 65 73 20 73 74 72 75 63 74 75 72 65 73 20 izes structures
16900 61 6e 64 20 63 72 65 61 74 65 73 20 63 6f 6d 6d and creates comm
16910 61 6e 64 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 ands.. *. * Side
16920 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 43 72 effects:. *. Cr
16930 65 61 74 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 eate the command
16940 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d s. *. *---------
16950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
16990 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 #if TCL_MAJOR_VE
169a0 52 53 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e RSION > 8.#defin
169b0 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39 e MIN_VERSION "9
169c0 2e 30 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e .0".#else.#defin
169d0 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38 e MIN_VERSION "8
169e0 2e 35 22 0a 23 65 6e 64 69 66 0a 0a 44 4c 4c 45 .5".#endif..DLLE
169f0 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e XPORT int Tls_In
16a00 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 it(Tcl_Interp *i
16a10 6e 74 65 72 70 29 20 7b 0a 0a 20 20 20 20 64 70 nterp) {.. dp
16a20 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
16a30 0a 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c ..#ifdef USE_TCL
16a40 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20 28 54 _STUBS. if (T
16a50 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 cl_InitStubs(int
16a60 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e erp, MIN_VERSION
16a70 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a , 0) == NULL) {.
16a80 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
16a90 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a R;. }.#endif.
16aa0 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 if (Tcl_PkgR
16ab0 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 equire(interp, "
16ac0 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49 4f Tcl", MIN_VERSIO
16ad0 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b N, 0) == NULL) {
16ae0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
16af0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
16b00 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 29 20 f (TlsLibInit()
16b10 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 != TCL_OK) {..Tc
16b20 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
16b30 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f nterp, "could no
16b40 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c t initialize SSL
16b50 20 6c 69 62 72 61 72 79 22 2c 20 28 63 68 61 72 library", (char
16b60 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
16b70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
16b80 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 }.. Tcl_Cre
16b90 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
16ba0 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 63 69 terp, "::tls::ci
16bb0 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f phers", CiphersO
16bc0 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
16bd0 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 ta) NULL, (Tcl_C
16be0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
16bf0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
16c00 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
16c10 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a interp, "::tls::
16c20 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e connection", Con
16c30 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d nectionInfoObjCm
16c40 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
16c50 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
16c60 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
16c70 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
16c80 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
16c90 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 68 61 6e 64 rp, "::tls::hand
16ca0 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b shake", Handshak
16cb0 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 eObjCmd, (Client
16cc0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c Data) NULL, (Tcl
16cd0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
16ce0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
16cf0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
16d00 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 d(interp, "::tls
16d10 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 ::import", Impor
16d20 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 tObjCmd, (Client
16d30 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c Data) NULL, (Tcl
16d40 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
16d50 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
16d60 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
16d70 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 d(interp, "::tls
16d80 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 ::unimport", Uni
16d90 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c mportObjCmd, (Cl
16da0 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
16db0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
16dc0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
16dd0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
16de0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
16df0 3a 74 6c 73 3a 3a 75 6e 73 74 61 63 6b 22 2c 20 :tls::unstack",
16e00 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 UnimportObjCmd,
16e10 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c (ClientData) NUL
16e20 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 L, (Tcl_CmdDelet
16e30 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
16e40 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
16e50 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
16e60 20 22 3a 3a 74 6c 73 3a 3a 73 74 61 74 75 73 22 "::tls::status"
16e70 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 , StatusObjCmd,
16e80 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c (ClientData) NUL
16e90 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 L, (Tcl_CmdDelet
16ea0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
16eb0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
16ec0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
16ed0 20 22 3a 3a 74 6c 73 3a 3a 76 65 72 73 69 6f 6e "::tls::version
16ee0 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 ", VersionObjCmd
16ef0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e , (ClientData) N
16f00 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ULL, (Tcl_CmdDel
16f10 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
16f20 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
16f30 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
16f40 70 2c 20 22 3a 3a 74 6c 73 3a 3a 6d 69 73 63 22 p, "::tls::misc"
16f50 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 , MiscObjCmd, (C
16f60 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c lientData) NULL,
16f70 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
16f80 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
16f90 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
16fa0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
16fb0 3a 3a 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 ::tls::protocols
16fc0 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 ", ProtocolsObjC
16fd0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
16fe0 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 NULL, (Tcl_CmdD
16ff0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
17000 4c 29 3b 0a 0a 20 20 20 20 42 75 69 6c 64 49 6e L);.. BuildIn
17010 66 6f 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 foCommand(interp
17020 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 );.. if (inte
17030 72 70 20 26 26 20 54 63 6c 5f 45 76 61 6c 28 69 rp && Tcl_Eval(i
17040 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 nterp, tlsTclIni
17050 74 53 63 72 69 70 74 29 20 21 3d 20 54 43 4c 5f tScript) != TCL_
17060 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
17070 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
17080 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 return Tcl_P
17090 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 kgProvide(interp
170a0 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 , PACKAGE_NAME,
170b0 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 PACKAGE_VERSION)
170c0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
170d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
170e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
170f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
17110 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 . *.Tls_SafeInit
17120 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 --. *. *.This i
17130 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 s a package init
17140 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 ialization proce
17150 64 75 72 65 20 66 6f 72 20 73 61 66 65 20 69 6e dure for safe in
17160 74 65 72 70 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 terps.. *. * Res
17170 75 6c 74 73 3a 0a 20 2a 09 53 61 6d 65 20 61 73 ults:. *.Same as
17180 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 of 'Tls_Init'.
17190 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
171a0 73 3a 0a 20 2a 09 53 61 6d 65 20 61 73 20 6f 66 s:. *.Same as of
171b0 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 'Tls_Init'. *.
171c0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
171d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
171e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
171f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17200 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f ----. */.DLLEXPO
17210 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 RT int Tls_SafeI
17220 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a nit(Tcl_Interp *
17230 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 interp) {. dp
17240 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
17250 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f . return Tls_
17260 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 7d 0a Init(interp);.}.