0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61 (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69 some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68 ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32 pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72 ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79 poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53 right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29 *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61 2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 ka SSL) Channel
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68 st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65 based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64 * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61 dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64 .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74 ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 full fileevent
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 Also work done
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68 ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 e impetus to do
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 pts.h".#include
0360: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63 "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e include <stdlib.
0390: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 h>.#include <ope
03a0: 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a 23 69 6e 63 nssl/ssl.h>.#inc
03b0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72 lude <openssl/cr
03c0: 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 ypto.h>.#include
03d0: 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 73 <openssl/openss
03e0: 6c 63 6f 6e 66 2e 68 3e 0a 23 69 6e 63 6c 75 64 lconf.h>.#includ
03f0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 72 73 61 2e 68 e <openssl/rsa.h
0400: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e >.#include <open
0410: 73 73 6c 2f 73 61 66 65 73 74 61 63 6b 2e 68 3e ssl/safestack.h>
0420: 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 65 6e 53 53 4c ../* Min OpenSSL
0430: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 69 66 20 version */.#if
0440: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
0450: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 NUMBER < 0x10101
0460: 30 30 30 4c 0a 23 65 72 72 6f 72 20 22 4f 6e 6c 000L.#error "Onl
0470: 79 20 4f 70 65 6e 53 53 4c 20 76 31 2e 31 2e 31 y OpenSSL v1.1.1
0480: 20 6f 72 20 6c 61 74 65 72 20 69 73 20 73 75 70 or later is sup
0490: 70 6f 72 74 65 64 22 0a 23 65 6e 64 69 66 0a 0a ported".#endif..
04a0: 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20 64 ./*. * Forward d
04b0: 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a eclarations. */.
04c0: 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b 65 79 .#define F2N(key
04d0: 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b 65 79 , dsp) \..(((key
04e0: 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 63 68 ) == NULL) ? (ch
04f0: 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c 0a 09 ar *) NULL : \..
0500: 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 .Tcl_TranslateFi
0510: 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 28 leName(interp, (
0520: 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a 0a 73 key), (dsp)))..s
0530: 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 43 tatic SSL_CTX *C
0540: 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 TX_Init(State *s
0550: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 tatePtr, int isS
0560: 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f erver, int proto
0570: 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09 09 63 , char *key,...c
0580: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 20 75 har *certfile, u
0590: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 nsigned char *ke
05a0: 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e 65 64 y_asn1, unsigned
05b0: 20 63 68 61 72 20 2a 63 65 72 74 5f 61 73 6e 31 char *cert_asn1
05c0: 2c 0a 09 09 54 63 6c 5f 53 69 7a 65 20 6b 65 79 ,...Tcl_Size key
05d0: 5f 61 73 6e 31 5f 6c 65 6e 2c 20 54 63 6c 5f 53 _asn1_len, Tcl_S
05e0: 69 7a 65 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65 ize cert_asn1_le
05f0: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c n, char *CApath,
0600: 20 63 68 61 72 20 2a 43 41 73 74 6f 72 65 2c 0a char *CAstore,.
0610: 09 09 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 ..char *CAfile,
0620: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 char *ciphers, c
0630: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 har *ciphersuite
0640: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 s, int level, ch
0650: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a ar *DHparams);..
0660: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 #define TLS_PROT
0670: 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a 23 64 65 O_SSL2..0x01.#de
0680: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 fine TLS_PROTO_S
0690: 53 4c 33 09 09 30 78 30 32 0a 23 64 65 66 69 6e SL3..0x02.#defin
06a0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
06b0: 09 09 30 78 30 34 0a 23 64 65 66 69 6e 65 20 54 ..0x04.#define T
06c0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 LS_PROTO_TLS1_1.
06d0: 30 78 30 38 0a 23 64 65 66 69 6e 65 20 54 4c 53 0x08.#define TLS
06e0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 09 30 78 _PROTO_TLS1_2.0x
06f0: 31 30 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 10.#define TLS_P
0700: 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 78 32 30 ROTO_TLS1_3.0x20
0710: 0a 23 64 65 66 69 6e 65 20 45 4e 41 42 4c 45 44 .#define ENABLED
0720: 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09 28 28 28 (flag, mask).(((
0730: 66 6c 61 67 29 20 26 20 28 6d 61 73 6b 29 29 20 flag) & (mask))
0740: 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23 64 65 66 == (mask))..#def
0750: 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47 46 49 4c ine SSLKEYLOGFIL
0760: 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47 46 49 4c E.."SSLKEYLOGFIL
0770: 45 22 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a E"..../*********
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 ***********/./*
0790: 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 20 20 Callbacks
07a0: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./***********
07b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 *********/../*.
07c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0800: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20 ----. *. * Eval
0810: 43 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64 Callback Command
0820: 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63 --. *. *.Eval c
0830: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
0840: 61 6e 64 20 63 61 74 63 68 20 61 6e 79 20 65 72 and catch any er
0850: 72 6f 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c rors. *. * Resul
0860: 74 73 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61 ts:. *.0 = Comma
0870: 6e 64 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c nd returned fail
0880: 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 or eval returne
0890: 64 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31 d TCL_ERROR. *.1
08a0: 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 = Command retur
08b0: 6e 65 64 20 73 75 63 63 65 73 73 20 6f 72 20 65 ned success or e
08c0: 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c val returned TCL
08d0: 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 _OK. *. * Side e
08e0: 66 66 65 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75 ffects:. *.Evalu
08f0: 61 74 65 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f ates callback co
0900: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d mmand. *. *-----
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
0950: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 45 76 */.static int.Ev
0960: 61 6c 43 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49 alCallback(Tcl_I
0970: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 53 nterp *interp, S
0980: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 tate *statePtr,
0990: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29 Tcl_Obj *cmdPtr)
09a0: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c {. int code,
09b0: 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 ok = 0;.. dp
09c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
09d0: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 .. Tcl_Preser
09e0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
09f0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c interp);. Tcl
0a00: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
0a10: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
0a20: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
0a30: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 73 75 63 allback with suc
0a40: 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f 72 20 72 cess for ok or r
0a50: 65 74 75 72 6e 20 76 61 6c 75 65 20 31 2c 20 66 eturn value 1, f
0a60: 61 69 6c 20 66 6f 72 20 65 72 72 6f 72 20 6f 72 ail for error or
0a70: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 30 20 return value 0
0a80: 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 */. Tcl_Reset
0a90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
0aa0: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 code = Tcl_E
0ab0: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c valObjEx(interp,
0ac0: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 cmdPtr, TCL_EVA
0ad0: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 64 L_GLOBAL);. d
0ae0: 70 72 69 6e 74 66 28 22 45 76 61 6c 43 61 6c 6c printf("EvalCall
0af0: 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f 64 65 29 back: %d", code)
0b00: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d ;. if (code =
0b10: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 = TCL_OK) {../*
0b20: 43 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72 Check result for
0b30: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f return value */
0b40: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c ..Tcl_Obj *resul
0b50: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 t = Tcl_GetObjRe
0b60: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 sult(interp);..i
0b70: 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c f (result == NUL
0b80: 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 L || Tcl_GetIntF
0b90: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 romObj(interp, r
0ba0: 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54 esult, &ok) != T
0bb0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b CL_OK) {.. ok
0bc0: 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 69 6e 74 = 1;..}..dprint
0bd0: 66 28 22 52 65 73 75 6c 74 3a 20 25 64 22 2c 20 f("Result: %d",
0be0: 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ok);. } else
0bf0: 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20 72 65 {../* Error - re
0c00: 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 66 69 ject the certifi
0c10: 63 61 74 65 20 2a 2f 0a 09 64 70 72 69 6e 74 66 cate */..dprintf
0c20: 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ("Tcl_Background
0c30: 45 72 72 6f 72 22 29 3b 0a 23 69 66 20 28 54 43 Error");.#if (TC
0c40: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MAJOR_VERSION
0c50: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 == 8) && (TCL_MI
0c60: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 NOR_VERSION < 6)
0c70: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
0c80: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 Error(interp);.#
0c90: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 else..Tcl_Backgr
0ca0: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e oundException(in
0cb0: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e terp, code);.#en
0cc0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 dif. }.. T
0cd0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
0ce0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
0cf0: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 );. Tcl_Relea
0d00: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
0d10: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 interp);. ret
0d20: 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 urn ok;.}.../*.
0d30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d70: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 ----. *. * InfoC
0d80: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a allback --. *. *
0d90: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f .Monitors SSL co
0da0: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 nnection process
0db0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
0dc0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
0dd0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
0de0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
0df0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e40: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 ---. */.static v
0e50: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b oid.InfoCallback
0e60: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c (const SSL *ssl,
0e70: 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20 int where, int
0e80: 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65 ret) {. State
0e90: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
0ea0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 ate*)SSL_get_app
0eb0: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c _data((SSL *)ssl
0ec0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 );. Tcl_Inter
0ed0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
0ee0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
0ef0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
0f00: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 r;. const cha
0f10: 72 20 2a 6d 61 6a 6f 72 2c 20 2a 6d 69 6e 6f 72 r *major, *minor
0f20: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
0f30: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
0f40: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
0f50: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
0f60: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 j*)NULL) {..retu
0f70: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 rn;. }.. i
0f80: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0f90: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 B_HANDSHAKE_STAR
0fa0: 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 T) {..major = "h
0fb0: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f andshake";..mino
0fc0: 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 r = "start";.
0fd0: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 } else if (wher
0fe0: 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 e & SSL_CB_HANDS
0ff0: 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 HAKE_DONE) {..ma
1000: 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 jor = "handshake
1010: 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e ";..minor = "don
1020: 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b e";. } else {
1030: 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 ..if (where & SS
1040: 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a L_CB_ALERT)..maj
1050: 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 or = "alert";..e
1060: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 lse if (where &
1070: 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 SSL_ST_CONNECT).
1080: 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 major = "connect
1090: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 ";..else if (whe
10a0: 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 re & SSL_ST_ACCE
10b0: 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 PT)..major = "ac
10c0: 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 cept";..else....
10d0: 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 .major = "unknow
10e0: 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 n";...if (where
10f0: 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 & SSL_CB_READ)..
1100: 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a minor = "read";.
1110: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 .else if (where
1120: 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 & SSL_CB_WRITE).
1130: 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 .minor = "write"
1140: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
1150: 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 e & SSL_CB_LOOP)
1160: 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 ..minor = "loop"
1170: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
1180: 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 e & SSL_CB_EXIT)
1190: 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 ..minor = "exit"
11a0: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f ;..else.....mino
11b0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 r = "unknown";.
11c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
11d0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
11e0: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 val with fn, cha
11f0: 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c n, major, minor,
1200: 20 6d 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79 message, and ty
1210: 70 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 pe args */. c
1220: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
1230: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
1240: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 r->callback);.
1250: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
1260: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1270: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
1280: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 ewStringObj("inf
1290: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 o", -1));. Tc
12a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
12b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
12c0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
12d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
12e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
12f0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
1300: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
1310: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1320: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1330: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
1340: 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 gObj(major, -1))
1350: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1360: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1370: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
1380: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1390: 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 minor, -1));..
13a0: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 if (where & SS
13b0: 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54 L_CB_ALERT) {..T
13c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
13d0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
13e0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
13f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
1400: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 L_alert_desc_str
1410: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d ing_long(ret), -
1420: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
1430: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1440: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
1450: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
1460: 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74 gObj(SSL_alert_t
1470: 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 ype_string_long(
1480: 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ret), -1));.
1490: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 } else {..Tcl_Li
14a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
14b0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
14c0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
14d0: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 tringObj(SSL_sta
14e0: 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 te_string_long(s
14f0: 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f sl), -1));..Tcl_
1500: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1510: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1520: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
1530: 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 ngObj("info", -1
1540: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ));. }.. /
1550: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
1560: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
1570: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
1580: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 cmdPtr);. Eva
1590: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
15a0: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
15b0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 tr);. Tcl_Dec
15c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
15d0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
1620: 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c *. * MessageCal
1630: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d lback --. *. *.M
1640: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74 onitors SSL prot
1650: 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a ocol messages. *
1660: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
1670: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
1680: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
1690: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
16a0: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d efined). *. *---
16b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 . */.#ifndef OPE
1700: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 NSSL_NO_SSL_TRAC
1710: 45 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65 E.static void.Me
1720: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e ssageCallback(in
1730: 74 20 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76 t write_p, int v
1740: 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74 ersion, int cont
1750: 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 ent_type, const
1760: 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f void *buf, size_
1770: 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c t len, SSL *ssl,
1780: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 void *arg) {.
1790: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
17a0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b r = (State*)arg;
17b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
17c0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
17d0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
17e0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
17f0: 0a 20 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20 . char *ver,
1800: 2a 74 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a *type;. BIO *
1810: 62 69 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75 bio;. char bu
1820: 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20 20 ffer[15000];.
1830: 20 62 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a buffer[0] = 0;.
1840: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
1850: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
1860: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
1870: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a ack == (Tcl_Obj*
1880: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
1890: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 ;. }.. swi
18a0: 74 63 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23 tch(version) {.#
18b0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
18c0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
18d0: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 100000L && !defi
18e0: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 ned(NO_SSL2) &&
18f0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
1900: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 _NO_SSL2). ca
1910: 73 65 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a se SSL2_VERSION:
1920: 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b ..ver = "SSLv2";
1930: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
1940: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
1950: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
1960: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
1970: 33 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 3). case SSL3
1980: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d _VERSION:..ver =
1990: 20 22 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b "SSLv3";..break
19a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 ;.#endif. cas
19b0: 65 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a e TLS1_VERSION:.
19c0: 09 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a .ver = "TLSv1";.
19d0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 .break;. case
19e0: 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a TLS1_1_VERSION:
19f0: 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31 ..ver = "TLSv1.1
1a00: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 ";..break;. c
1a10: 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49 ase TLS1_2_VERSI
1a20: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 ON:..ver = "TLSv
1a30: 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 1.2";..break;.
1a40: 20 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45 case TLS1_3_VE
1a50: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 RSION:..ver = "T
1a60: 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b LSv1.3";..break;
1a70: 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65 . case 0:..ve
1a80: 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 r = "none";..bre
1a90: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a ak;. default:
1aa0: 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e ..ver = "unknown
1ab0: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d ";..break;. }
1ac0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 63 6f .. switch (co
1ad0: 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20 ntent_type) {.
1ae0: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 case SSL3_RT_H
1af0: 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22 EADER:..type = "
1b00: 48 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b Header";..break;
1b10: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 . case SSL3_R
1b20: 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f T_INNER_CONTENT_
1b30: 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49 TYPE:..type = "I
1b40: 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70 nner Content Typ
1b50: 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 e";..break;.
1b60: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41 case SSL3_RT_CHA
1b70: 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a NGE_CIPHER_SPEC:
1b80: 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65 ..type = "Change
1b90: 20 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b Cipher";..break
1ba0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f ;. case SSL3_
1bb0: 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 RT_ALERT:..type
1bc0: 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61 = "Alert";..brea
1bd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 k;. case SSL3
1be0: 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 _RT_HANDSHAKE:..
1bf0: 74 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b type = "Handshak
1c00: 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 e";..break;.
1c10: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 case SSL3_RT_APP
1c20: 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 LICATION_DATA:..
1c30: 74 79 70 65 20 3d 20 22 41 70 70 20 44 61 74 61 type = "App Data
1c40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20 4f ";..break;.#if O
1c50: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
1c60: 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
1c70: 30 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54 4c 00L. case DTL
1c80: 53 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54 3a S1_RT_HEARTBEAT:
1c90: 0a 09 74 79 70 65 20 3d 20 22 48 65 61 72 74 62 ..type = "Heartb
1ca0: 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 eat";..break;.#e
1cb0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 ndif. default
1cc0: 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f :..type = "unkno
1cd0: 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 wn";. }..
1ce0: 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65 /* Needs compile
1cf0: 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e time option "en
1d00: 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e able-ssl-trace".
1d10: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f */. if ((bio
1d20: 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 = BIO_new(BIO_s
1d30: 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c _mem())) != NULL
1d40: 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c ) {..int n;..SSL
1d50: 5f 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20 _trace(write_p,
1d60: 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 version, content
1d70: 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c _type, buf, len,
1d80: 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69 ssl, (void *)bi
1d90: 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61 o);..n = BIO_rea
1da0: 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 d(bio, buffer, B
1db0: 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20 IO_pending(bio)
1dc0: 3c 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70 65 < 15000 ? BIO_pe
1dd0: 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34 39 nding(bio) : 149
1de0: 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 99);..n = (n<0)
1df0: 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65 72 ? 0 : n;..buffer
1e00: 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64 29 [n] = 0;..(void)
1e10: 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a BIO_flush(bio);.
1e20: 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a .BIO_free(bio);.
1e30: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
1e40: 66 28 22 4d 65 73 73 61 67 65 20 64 69 72 65 63 f("Message direc
1e50: 74 69 6f 6e 3d 25 64 2c 20 76 65 72 3d 25 73 2c tion=%d, ver=%s,
1e60: 20 74 79 70 65 3d 25 73 2c 20 6d 65 73 73 61 67 type=%s, messag
1e70: 65 3d 25 73 22 2c 20 77 72 69 74 65 5f 70 2c 20 e=%s", write_p,
1e80: 76 65 72 2c 20 74 79 70 65 2c 20 26 62 75 66 66 ver, type, &buff
1e90: 65 72 5b 30 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 er[0]);.. /*
1ea0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
1eb0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
1ec0: 63 68 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e 2c chan, direction,
1ed0: 20 76 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c 20 version, type,
1ee0: 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 73 and message args
1ef0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
1f00: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
1f10: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c j(statePtr->call
1f20: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c back);. Tcl_L
1f30: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1f40: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1f50: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
1f60: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20 gObj("message",
1f70: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
1f80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1f90: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1fa0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
1fb0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
1fc0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
1fd0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
1fe0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
1ff0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2000: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2010: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2020: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74 (write_p ? "Sent
2030: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20 " : "Received",
2040: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
2050: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2060: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2070: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2080: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20 Obj(ver, -1));.
2090: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
20a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
20b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
20c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70 NewStringObj(typ
20d0: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c e, -1));. Tcl
20e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
20f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
2100: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
2110: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d ingObj(buffer, -
2120: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 1));.. /* Eva
2130: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
2140: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
2150: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
2160: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
2170: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
2180: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
2190: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
21a0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a ount(cmdPtr);.}.
21b0: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d #endif.../*. *--
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2200: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 -. *. * VerifyCa
2210: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 llback --. *. *.
2220: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 Monitors SSL cer
2230: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 tificate validat
2240: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65 ion process. Use
2250: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 d to control the
2260: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65 . *.behavior whe
2270: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59 n the SSL_VERIFY
2280: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65 _PEER flag is se
2290: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 t. This is calle
22a0: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20 d. *.whenever a
22b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 certificate is i
22c0: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69 nspected or deci
22d0: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c ded invalid. Cal
22e0: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20 led for. *.each
22f0: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74 certificate in t
2300: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20 he cert chain..
2310: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 *. * Checks:. *.
2320: 54 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 The certificate
2330: 63 68 61 69 6e 20 69 73 20 63 68 65 63 6b 65 64 chain is checked
2340: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 starting with t
2350: 68 65 20 64 65 65 70 65 73 74 20 6e 65 73 74 69 he deepest nesti
2360: 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74 ng level. *. (t
2370: 68 65 20 72 6f 6f 74 20 43 41 20 63 65 72 74 69 he root CA certi
2380: 66 69 63 61 74 65 29 20 61 6e 64 20 77 6f 72 6b ficate) and work
2390: 65 64 20 75 70 77 61 72 64 20 74 6f 20 74 68 65 ed upward to the
23a0: 20 70 65 65 72 27 73 20 63 65 72 74 69 66 69 63 peer's certific
23b0: 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e ate.. *.All sign
23c0: 61 74 75 72 65 73 20 61 72 65 20 76 61 6c 69 64 atures are valid
23d0: 2c 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 69 , current time i
23e0: 73 20 77 69 74 68 69 6e 20 66 69 72 73 74 20 61 s within first a
23f0: 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 69 74 79 nd last validity
2400: 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20 time.. *.Check
2410: 74 68 61 74 20 74 68 65 20 63 65 72 74 69 66 69 that the certifi
2420: 63 61 74 65 20 69 73 20 69 73 73 75 65 64 20 62 cate is issued b
2430: 79 20 74 68 65 20 69 73 73 75 65 72 20 63 65 72 y the issuer cer
2440: 74 69 66 69 63 61 74 65 20 69 73 73 75 65 72 2e tificate issuer.
2450: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 72 65 . *.Check the re
2460: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 20 vocation status
2470: 66 6f 72 20 65 61 63 68 20 63 65 72 74 69 66 69 for each certifi
2480: 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 cate.. *.Check t
2490: 68 65 20 76 61 6c 69 64 69 74 79 20 6f 66 20 74 he validity of t
24a0: 68 65 20 67 69 76 65 6e 20 43 52 4c 20 61 6e 64 he given CRL and
24b0: 20 74 68 65 20 63 65 72 74 20 72 65 76 6f 63 61 the cert revoca
24c0: 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09 tion status.. *.
24d0: 43 68 65 63 6b 20 74 68 65 20 70 6f 6c 69 63 69 Check the polici
24e0: 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 65 es of all the ce
24f0: 72 74 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a rtificates. *. *
2500: 20 41 72 67 73 0a 20 2a 09 70 72 65 76 65 72 69 Args. *.preveri
2510: 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73 20 fy_ok indicates
2520: 77 68 65 74 68 65 72 20 74 68 65 20 63 65 72 74 whether the cert
2530: 69 66 69 63 61 74 65 20 76 65 72 69 66 69 63 61 ificate verifica
2540: 74 69 6f 6e 20 70 61 73 73 65 64 20 28 31 29 20 tion passed (1)
2550: 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a or not (0). *. *
2560: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 Results:. *.A c
2570: 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f allback bound to
2580: 20 74 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 the socket may
2590: 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 return one of:.
25a0: 2a 09 20 20 20 20 30 09 09 09 2d 20 74 68 65 20 *. 0...- the
25b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64 certificate is d
25c0: 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20 73 eemed invalid, s
25d0: 65 6e 64 20 76 65 72 69 66 69 63 61 74 69 6f 6e end verification
25e0: 0a 20 2a 09 09 09 09 20 20 66 61 69 6c 75 72 65 . *.... failure
25f0: 20 61 6c 65 72 74 20 74 6f 20 70 65 65 72 2c 20 alert to peer,
2600: 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 20 68 61 and terminate ha
2610: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 ndshake.. *.
2620: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 1...- the certif
2630: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 icate is deemed
2640: 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20 valid, continue
2650: 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a with handshake..
2660: 20 2a 09 20 20 20 20 65 6d 70 74 79 20 73 74 72 *. empty str
2670: 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20 ing.- no change
2680: 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 20 76 to certificate v
2690: 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 alidation. *. *
26a0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
26b0: 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f .The err field o
26c0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 f the currently
26d0: 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20 operative State
26e0: 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 is set. *. to a
26f0: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 string describi
2700: 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 ng the SSL negot
2710: 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 iation failure r
2720: 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d eason. *. *-----
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2770: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 */.static int.Ve
2780: 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74 rifyCallback(int
2790: 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f ok, X509_STORE_
27a0: 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 20 20 20 CTX *ctx) {.
27b0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
27c0: 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 . SSL *ssl.
27d0: 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 .= (SSL*)X509_ST
27e0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 ORE_CTX_get_ex_d
27f0: 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 ata(ctx, SSL_get
2800: 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 _ex_data_X509_ST
2810: 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a ORE_CTX_idx());.
2820: 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74 09 X509 *cert.
2830: 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 .= X509_STORE_CT
2840: 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 X_get_current_ce
2850: 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61 rt(ctx);. Sta
2860: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 te *statePtr.= (
2870: 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 State*)SSL_get_a
2880: 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 pp_data(ssl);.
2890: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
28a0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
28b0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 >interp;. int
28c0: 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 depth..= X509_S
28d0: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 TORE_CTX_get_err
28e0: 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 or_depth(ctx);.
28f0: 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 int err..= X5
2900: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
2910: 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20 _error(ctx);..
2920: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
2930: 64 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 d");. dprintf
2940: 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b ("VerifyCallback
2950: 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 : %d", ok);..
2960: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
2970: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a cmd == (Tcl_Obj*
2980: 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65 )NULL) {../* Use
2990: 20 6f 6b 20 76 61 6c 75 65 20 69 66 20 76 65 72 ok value if ver
29a0: 69 66 69 63 61 74 69 6f 6e 20 69 73 20 72 65 71 ification is req
29b0: 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 28 73 74 uired */..if (st
29c0: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 atePtr->vflags &
29d0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
29e0: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
29f0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ) {.. return
2a00: 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 ok;..} else {..
2a10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a return 1;..}.
2a20: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
2a30: 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 ert == NULL || s
2a40: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 sl == NULL) {..r
2a50: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a eturn 0;. }..
2a60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 dprintf("Ver
2a70: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 63 72 65 ifyCallback: cre
2a80: 61 74 65 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d ate callback com
2a90: 6d 61 6e 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 mand");.. /*
2aa0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
2ab0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
2ac0: 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 chan, depth, cer
2ad0: 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 t info list, sta
2ae0: 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 tus, and error a
2af0: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 rgs */. cmdPt
2b00: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
2b10: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
2b20: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
2b30: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2b40: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2b50: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2b60: 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 Obj("verify", -1
2b70: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2b80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2b90: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2ba0: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f ..Tcl_NewStringO
2bb0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
2bc0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
2bd0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
2be0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2bf0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2c00: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
2c10: 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b wIntObj(depth));
2c20: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2c30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2c40: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c terp, cmdPtr, Tl
2c50: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 s_NewX509Obj(int
2c60: 65 72 70 2c 20 63 65 72 74 2c 20 30 29 29 3b 0a erp, cert, 0));.
2c70: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2c80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2c90: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
2ca0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b _NewIntObj(ok));
2cb0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2cc0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2cd0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 terp, cmdPtr,..T
2ce0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2cf0: 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69 (char*)X509_veri
2d00: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 fy_cert_error_st
2d10: 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b ring(err), -1));
2d20: 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 .. /* Prevent
2d30: 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 I/O while callb
2d40: 61 63 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65 ack is in progre
2d50: 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 ss */. /* sta
2d60: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 tePtr->flags |=
2d70: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b TLS_TCL_CALLBACK
2d80: 3b 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 ; */.. dprint
2d90: 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 f("VerifyCallbac
2da0: 6b 3a 20 65 76 61 6c 20 63 61 6c 6c 62 61 63 6b k: eval callback
2db0: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c ");.. /* Eval
2dc0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
2dd0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
2de0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
2df0: 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c );. ok = Eval
2e00: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c Callback(interp,
2e10: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 statePtr, cmdPt
2e20: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 r);. Tcl_Decr
2e30: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
2e40: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
2e50: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 VerifyCallback:
2e60: 63 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74 20 3d command result =
2e70: 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 %d", ok);..
2e80: 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 /* statePtr->fla
2e90: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f gs &= ~(TLS_TCL_
2ea0: 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 CALLBACK); */.
2eb0: 20 20 72 65 74 75 72 6e 20 6f 6b 3b 09 2f 2a 20 return ok;./*
2ec0: 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61 76 By default, leav
2ed0: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75 e verification u
2ee0: 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c nchanged. */.}..
2ef0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2f40: 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a Tls_Error --. *.
2f50: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
2f60: 6b 20 77 69 74 68 20 65 72 72 6f 72 20 6d 65 73 k with error mes
2f70: 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sage.. *. * Side
2f80: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 effects:. *.The
2f90: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 err field of th
2fa0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 e currently oper
2fb0: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 ative State is s
2fc0: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 et. *. to a str
2fd0: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 ing describing t
2fe0: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 he SSL negotiati
2ff0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f on failure reaso
3000: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d n. *. *---------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 ----------. */.v
3050: 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 oid.Tls_Error(St
3060: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 ate *statePtr, c
3070: 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73 67 29 20 onst char *msg)
3080: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 {. Tcl_Interp
3090: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
30a0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
30b0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
30c0: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 , *listPtr;.
30d0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72 unsigned long er
30e0: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d r;. statePtr-
30f0: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 >err = msg;..
3100: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
3110: 20 77 69 74 68 20 6d 65 73 73 61 67 65 20 25 73 with message %s
3120: 22 2c 20 6d 73 67 29 3b 0a 0a 20 20 20 20 69 66 ", msg);.. if
3130: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
3140: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
3150: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
3160: 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 n;. }.. dp
3170: 72 69 6e 74 66 28 22 54 6c 73 5f 45 72 72 6f 72 rintf("Tls_Error
3180: 3a 20 63 72 65 61 74 65 20 63 61 6c 6c 62 61 63 : create callbac
3190: 6b 20 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 20 20 k command");..
31a0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
31b0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 and to eval with
31c0: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d fn, chan, and m
31d0: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 essage args */.
31e0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
31f0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
3200: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
3210: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3220: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3230: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3240: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
3250: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 "error", -1));.
3260: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3270: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3280: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
3290: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
32a0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
32b0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
32c0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
32d0: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 if (msg != NULL)
32e0: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
32f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3300: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
3310: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 _NewStringObj(ms
3320: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 g, -1));.. }
3330: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 else if ((msg =
3340: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63 Tcl_GetString(Tc
3350: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
3360: 6e 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c nterp))) != NULL
3370: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ) {..Tcl_ListObj
3380: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3390: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
33a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
33b0: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d sg, -1));.. }
33c0: 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72 else {..listPtr
33d0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
33e0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 j(0, NULL);..whi
33f0: 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67 le ((err = ERR_g
3400: 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30 et_error()) != 0
3410: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
3420: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3430: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 t(interp, listPt
3440: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
3450: 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65 Obj(ERR_reason_e
3460: 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 rror_string(err)
3470: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f , -1));..}..Tcl_
3480: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3490: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
34a0: 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 Ptr, listPtr);.
34b0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
34c0: 66 28 22 54 6c 73 5f 45 72 72 6f 72 3a 20 65 76 f("Tls_Error: ev
34d0: 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a al callback");..
34e0: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
34f0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
3500: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
3510: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
3520: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 EvalCallback(i
3530: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
3540: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 cmdPtr);. Tc
3550: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
3560: 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 mdPtr);.}.../*.
3570: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35b0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f ----. *. * KeyLo
35c0: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a gCallback --. *.
35d0: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 *.Write receive
35e0: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f d key data to lo
35f0: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 g file.. *. * Si
3600: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
3610: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d one. *. *-------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3660: 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c .void KeyLogCall
3670: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a back(const SSL *
3680: 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 ssl, const char
3690: 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 *line) {. cha
36a0: 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 r *str = getenv(
36b0: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a SSLKEYLOGFILE);.
36c0: 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 FILE *fd;..
36d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
36e0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
36f0: 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 tr) {..fd = fope
3700: 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 n(str, "a");..fp
3710: 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 rintf(fd, "%s\n"
3720: 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 ,line);..fclose(
3730: 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f fd);. }.}.../
3740: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 -------. *. * Pa
3790: 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 ssword Callback
37a0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
37b0: 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 when a password
37c0: 69 73 20 6e 65 65 64 65 64 20 66 6f 72 20 61 20 is needed for a
37d0: 70 72 69 76 61 74 65 20 6b 65 79 20 77 68 65 6e private key when
37e0: 20 6c 6f 61 64 69 6e 67 0a 20 2a 09 6f 72 20 73 loading. *.or s
37f0: 74 6f 72 69 6e 67 20 61 20 50 45 4d 20 63 65 72 toring a PEM cer
3800: 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e tificate with en
3810: 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 cryption. Evals
3820: 63 61 6c 6c 62 61 63 6b 0a 20 2a 09 73 63 72 69 callback. *.scri
3830: 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 pt and returns t
3840: 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 he result as the
3850: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 password string
3860: 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 in buf.. *. * R
3870: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
3880: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
3890: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
38a0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
38b0: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 d). *. * Returns
38c0: 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 :. *.Password si
38d0: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d ze in bytes or -
38e0: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 1 for an error..
38f0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
3940: 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 tic int.Password
3950: 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 Callback(char *b
3960: 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e uf, int size, in
3970: 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a t rwflag, void *
3980: 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 udata) {. Sta
3990: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 te *statePtr.= (
39a0: 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a State *) udata;.
39b0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
39c0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
39d0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
39e0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
39f0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 int code;.
3a00: 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a Tcl_Size len;.
3a10: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
3a20: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 lled");.. /*
3a30: 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 If no callback,
3a40: 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c use default call
3a50: 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 back */. if (
3a60: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
3a70: 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 rd == NULL) {..i
3a80: 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e f (Tcl_EvalEx(in
3a90: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 terp, "tls::pass
3aa0: 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 word", -1, TCL_E
3ab0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 VAL_GLOBAL) == T
3ac0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 CL_OK) {.. ch
3ad0: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 ar *ret = (char
3ae0: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 *) Tcl_GetString
3af0: 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f FromObj(Tcl_GetO
3b00: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 bjResult(interp)
3b10: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 , &len);.. if
3b20: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a (len > (Tcl_Siz
3b30: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 09 6c e) size-1) {...l
3b40: 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 en = (Tcl_Size)
3b50: 73 69 7a 65 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 size-1;.. }..
3b60: 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c strncpy(buf,
3b70: 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c ret, (size_t) l
3b80: 65 6e 29 3b 0a 09 20 20 20 20 62 75 66 5b 6c 65 en);.. buf[le
3b90: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 20 20 20 20 n] = '\0';..
3ba0: 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e return (int) len
3bb0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
3bc0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 return -1;..}.
3bd0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
3be0: 66 28 22 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 f("PasswordCallb
3bf0: 61 63 6b 3a 20 63 72 65 61 74 65 20 63 61 6c 6c ack: create call
3c00: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 22 29 3b 0a back command");.
3c10: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
3c20: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 ommand to eval w
3c30: 69 74 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c 20 ith fn, rwflag,
3c40: 61 6e 64 20 73 69 7a 65 20 61 72 67 73 20 2a 2f and size args */
3c50: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 . cmdPtr = Tc
3c60: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
3c70: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
3c80: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
3c90: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3ca0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3cb0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3cc0: 6a 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 j("password", -1
3cd0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
3ce0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3cf0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3d00: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 Tcl_NewIntObj(r
3d10: 77 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c wflag));. Tcl
3d20: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3d30: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3d40: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 dPtr, Tcl_NewInt
3d50: 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 Obj(size));..
3d60: 20 64 70 72 69 6e 74 66 28 22 50 61 73 73 77 6f dprintf("Passwo
3d70: 72 64 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61 6c rdCallback: eval
3d80: 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 callback");..
3d90: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
3da0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
3db0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 rp);. Tcl_Pre
3dc0: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 serve((ClientDat
3dd0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
3de0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
3df0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 ack command */.
3e00: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
3e10: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
3e20: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c code = Tcl_Eval
3e30: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d ObjEx(interp, cm
3e40: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 dPtr, TCL_EVAL_G
3e50: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 LOBAL);. if (
3e60: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 code != TCL_OK)
3e70: 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 {.#if (TCL_MAJOR
3e80: 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 _VERSION == 8) &
3e90: 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 & (TCL_MINOR_VER
3ea0: 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 SION < 6)..Tcl_B
3eb0: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 ackgroundError(i
3ec0: 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 nterp);.#else..T
3ed0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 cl_BackgroundExc
3ee0: 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 eption(interp, c
3ef0: 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 ode);.#endif.
3f00: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 }. Tcl_DecrR
3f10: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
3f20: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 .. Tcl_Releas
3f30: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
3f40: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f tatePtr);.. /
3f50: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c * If successful,
3f60: 20 70 61 73 73 20 62 61 63 6b 20 70 61 73 73 77 pass back passw
3f70: 6f 72 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74 ord string and t
3f80: 72 75 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c runcate if too l
3f90: 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 ong */. if (c
3fa0: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b ode == TCL_OK) {
3fb0: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 ..char *ret = (c
3fc0: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 har *) Tcl_GetSt
3fd0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f ringFromObj(Tcl_
3fe0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 GetObjResult(int
3ff0: 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 erp), &len);..if
4000: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a (len > (Tcl_Siz
4010: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20 e) size-1) {..
4020: 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a len = (Tcl_Siz
4030: 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 e) size-1;..}..s
4040: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c trncpy(buf, ret,
4050: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a (size_t) len);.
4060: 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 .buf[len] = '\0'
4070: 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 ;..Tcl_Release((
4080: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
4090: 72 70 29 3b 0a 09 72 65 74 75 72 6e 20 28 69 6e rp);..return (in
40a0: 74 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 t) len;. }.
40b0: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 Tcl_Release((C
40c0: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 lientData) inter
40d0: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d p);. return -
40e0: 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 1;.}.../*. *----
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4130: 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 *. * Session Ca
4140: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e llback for Clien
4150: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c ts --. *. *.Call
4160: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 73 65 ed when a new se
4170: 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 ssion is added t
4180: 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 6e 20 o the cache. In
4190: 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 TLS 1.3. *.this
41a0: 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 64 20 may be received
41b0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 multiple times a
41c0: 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 fter the handsha
41d0: 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 ke. For. *.earli
41e0: 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 er versions, thi
41f0: 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76 s will be receiv
4200: 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 61 ed during the ha
4210: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 ndshake.. *.This
4220: 20 69 73 20 74 68 65 20 70 72 65 66 65 72 72 65 is the preferre
4230: 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 d way to obtain
4240: 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 73 73 a resumable sess
4250: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ion.. *. * Resul
4260: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
4270: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
4280: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
4290: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
42a0: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 *. * Return code
42b0: 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 s:. *.0 = error
42c0: 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 77 69 where session wi
42d0: 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c ll be immediatel
42e0: 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 y removed from t
42f0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 he internal cach
4300: 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 65 73 e.. *.1 = succes
4310: 73 20 77 68 65 72 65 20 61 70 70 20 72 65 74 61 s where app reta
4320: 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 ins session in s
4330: 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e ession cache, an
4340: 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f d must call SSL_
4350: 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 SESSION_free() w
4360: 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d hen done.. *. *-
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43b0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
43c0: 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 t.SessionCallbac
43d0: 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f k(SSL *ssl, SSL_
43e0: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e SESSION *session
43f0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
4400: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
4410: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
4420: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a ta((SSL *)ssl);.
4430: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
4440: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
4450: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
4460: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
4470: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
4480: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
4490: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
44a0: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f ned char *sessio
44b0: 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 n_id;. size_t
44c0: 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 len2;. unsig
44d0: 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 ned int ulen;..
44e0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
44f0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
4500: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
4510: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e k == (Tcl_Obj*)N
4520: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
4530: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
4540: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
4550: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl == NULL) {.
4560: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4570: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
4580: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
4590: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
45a0: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e al with fn, chan
45b0: 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 73 65 , session id, se
45c0: 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61 6e ssion ticket, an
45d0: 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67 73 20 d lifetime args
45e0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
45f0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
4600: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
4610: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ack);. Tcl_Li
4620: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4630: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4640: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4650: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d Obj("session", -
4660: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
4670: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4680: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4690: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
46a0: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
46b0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
46c0: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
46d0: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f ;.. /* Sessio
46e0: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 n id */. sess
46f0: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 ion_id = SSL_SES
4700: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 SION_get_id(sess
4710: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 ion, &ulen);.
4720: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4730: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4740: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4750: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 wByteArrayObj(se
4760: 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 ssion_id, (Tcl_S
4770: 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 ize) ulen));..
4780: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 /* Session tic
4790: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 ket */. SSL_S
47a0: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b ESSION_get0_tick
47b0: 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 et(session, &tic
47c0: 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 ket, &len2);.
47d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
47e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
47f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4800: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 wByteArrayObj(ti
4810: 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 cket, (Tcl_Size)
4820: 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a len2));.. /*
4830: 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 Lifetime - numb
4840: 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f er of seconds */
4850: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4860: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4870: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 terp, cmdPtr,..T
4880: 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c cl_NewLongObj((l
4890: 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e ong) SSL_SESSION
48a0: 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 _get_ticket_life
48b0: 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f time_hint(sessio
48c0: 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 n)));.. /* Ev
48d0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
48e0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
48f0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
4900: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c tr);. EvalCal
4910: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
4920: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b atePtr, cmdPtr);
4930: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
4940: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a Count(cmdPtr);..
4950: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 30 20 /* Return 0
4960: 66 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 73 65 for now until se
4970: 73 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 69 ssion handling i
4980: 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 s complete */.
4990: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a return 0;.}...
49a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 --------. *. * A
49f0: 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 LPN Callback for
4a00: 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e Servers and NPN
4a10: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c Callback for Cl
4a20: 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 ients --. *. *.P
4a30: 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 erform protocol
4a40: 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 (http/1.1, h2, h
4a50: 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 3, etc.) selecti
4a60: 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e on for the. *.in
4a70: 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f coming connectio
4a80: 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 n. Called after
4a90: 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 Hello and server
4aa0: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 callbacks.. *.W
4ab0: 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65 here 'out' is se
4ac0: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
4ad0: 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20 and 'in' is the
4ae0: 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20 peer advertised
4af0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 list.. *. * Resu
4b00: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
4b10: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
4b20: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
4b30: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
4b40: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
4b50: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
4b60: 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 T_ERR_OK: ALPN p
4b70: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
4b80: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
4b90: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
4ba0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
4bb0: 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 ERT_FATAL: There
4bc0: 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 was no overlap
4bd0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 between the clie
4be0: 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 nt's. *. supp
4bf0: 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 lied list and th
4c00: 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 e server configu
4c10: 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e ration. The conn
4c20: 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 ection will be a
4c30: 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 borted.. *.SSL_T
4c40: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a LSEXT_ERR_NOACK:
4c50: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e ALPN protocol n
4c60: 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 ot selected, e.g
4c70: 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c ., because no AL
4c80: 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 PN. *. protoc
4c90: 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 ols are configur
4ca0: 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e ed for this conn
4cb0: 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e ection. The conn
4cc0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
4cd0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
4d20: 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 tatic int.ALPNCa
4d30: 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c llback(SSL *ssl,
4d40: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
4d50: 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 char **out, unsi
4d60: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 gned char *outle
4d70: 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e n,..const unsign
4d80: 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 ed char *in, uns
4d90: 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c igned int inlen,
4da0: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 void *arg) {.
4db0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
4dc0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b r = (State*)arg;
4dd0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
4de0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
4df0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
4e00: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
4e10: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 . int code, r
4e20: 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 es;.. dprintf
4e30: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
4e40: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
4e50: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 || arg == NULL)
4e60: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
4e70: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
4e80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
4e90: 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a elect protocol *
4ea0: 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65 /. if (SSL_se
4eb0: 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 lect_next_proto(
4ec0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
4ed0: 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 *) out, outlen,
4ee0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
4ef0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 , statePtr->prot
4f00: 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c os_len,..in, inl
4f10: 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e en) == OPENSSL_N
4f20: 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b PN_NEGOTIATED) {
4f30: 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 ../* Match found
4f40: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 */..res = SSL_T
4f50: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 LSEXT_ERR_OK;.
4f60: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f } else {../* O
4f70: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 PENSSL_NPN_NO_OV
4f80: 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c ERLAP = No overl
4f90: 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 ap, so use first
4fa0: 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e item from clien
4fb0: 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 t protocol list
4fc0: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c */..res = SSL_TL
4fd0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4fe0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
4ff0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d tatePtr->vcmd ==
5000: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 (Tcl_Obj*)NULL)
5010: 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a {..return res;.
5020: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
5030: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
5040: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 eval with fn, ch
5050: 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20 an, depth, cert
5060: 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 info list, statu
5070: 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67 s, and error arg
5080: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 s */. cmdPtr
5090: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
50a0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d bj(statePtr->vcm
50b0: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
50c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
50d0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
50e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
50f0: 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a j("alpn", -1));.
5100: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
5110: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
5120: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
5130: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
5140: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
5150: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
5160: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
5170: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5180: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5190: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
51a0: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73 wStringObj((cons
51b0: 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c 20 t char *) *out,
51c0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
51d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
51e0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
51f0: 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 r, Tcl_NewBoolea
5200: 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f nObj(res == SSL_
5210: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b TLSEXT_ERR_OK));
5220: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
5230: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
5240: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
5250: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
5260: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 if ((code =
5270: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
5280: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
5290: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 mdPtr)) > 1) {..
52a0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
52b0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
52c0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 } else if (code
52d0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 1) {..res = S
52e0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
52f0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
5300: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
5310: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
5320: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
5330: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
5340: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
5350: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d res;.}.../*. *-
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53a0: 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 --. *. * Adverti
53b0: 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c se Protocols Cal
53c0: 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 lback for Next P
53d0: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 rotocol Negotiat
53e0: 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 ion (NPN) in Ser
53f0: 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 verHello --. *.
5400: 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 *.called when a
5410: 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73 TLS server needs
5420: 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f a list of suppo
5430: 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 rted protocols f
5440: 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f or Next. *.Proto
5450: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e col Negotiation.
5460: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
5470: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
5480: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 de effects:. *.
5490: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
54a0: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
54b0: 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 R_OK: NPN protoc
54c0: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 ol selected. The
54d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
54e0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c inues.. *.SSL_TL
54f0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 SEXT_ERR_NOACK:
5500: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 NPN protocol not
5510: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 selected. The c
5520: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
5530: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ues.. *. *------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
5580: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e /.#ifdef USE_NPN
5590: 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 .static int.NPNC
55a0: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
55b0: 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e L *ssl, const un
55c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 signed char **ou
55d0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 t, unsigned int
55e0: 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 *outlen, void *a
55f0: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 rg) {. State
5600: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
5610: 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 te*)arg;.. dp
5620: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
5630: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d .. if (ssl ==
5640: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 NULL || arg ==
5650: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
5660: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
5670: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 OACK;. }..
5680: 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c /* Set protocol
5690: 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 s list */. if
56a0: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 (statePtr->prot
56b0: 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a os != NULL) {..*
56c0: 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e out = statePtr->
56d0: 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e protos;..*outlen
56e0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f = statePtr->pro
56f0: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 tos_len;. } e
5700: 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 lse {..*out = NU
5710: 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 LL;..*outlen = 0
5720: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c ;..return SSL_TL
5730: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
5740: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
5750: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5760: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f OK;.}.#endif.../
5770: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e -------. *. * SN
57c0: 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 I Callback for S
57d0: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 ervers --. *. *.
57e0: 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 Perform server-s
57f0: 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 ide SNI hostname
5800: 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 selection after
5810: 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65 receiving SNI e
5820: 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 xtension. *.in C
5830: 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c lient Hello. Cal
5840: 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 led after hello
5850: 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 callback but bef
5860: 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 ore ALPN callbac
5870: 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 k.. *. * Results
5880: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.None. *. *
5890: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
58a0: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 .Calls callback
58b0: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a (if defined). *.
58c0: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a * Return codes:
58d0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
58e0: 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e RR_OK: SNI hostn
58f0: 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e ame is accepted.
5900: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
5910: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
5920: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 L_TLSEXT_ERR_ALE
5930: 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f RT_FATAL: SNI ho
5940: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 stname is not ac
5950: 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e cepted. The conn
5960: 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 ection. *. is
5970: 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c aborted. Defaul
5980: 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 t for alert is S
5990: 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a SL_AD_UNRECOGNIZ
59a0: 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f ED_NAME.. *.SSL_
59b0: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 TLSEXT_ERR_ALERT
59c0: 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f _WARNING: SNI ho
59d0: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 stname is not ac
59e0: 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 cepted, warning
59f0: 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e alert. *. sen
5a00: 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 t (not supported
5a10: 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 in TLSv1.3). Th
5a20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
5a30: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 tinues.. *.SSL_T
5a40: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a LSEXT_ERR_NOACK:
5a50: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 SNI hostname is
5a60: 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e not accepted an
5a70: 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 d not acknowledg
5a80: 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 ed,. *. e.g.
5a90: 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 if SNI has not b
5aa0: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 een configured.
5ab0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
5ac0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d ontinues.. *. *-
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b10: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
5b20: 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f t.SNICallback(co
5b30: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e nst SSL *ssl, in
5b40: 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a t *alert, void *
5b50: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 arg) {. State
5b60: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
5b70: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 ate*)arg;. Tc
5b80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
5b90: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
5ba0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
5bb0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e *cmdPtr;. in
5bc0: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 t code, res;.
5bd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 const char *ser
5be0: 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a vername = NULL;.
5bf0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
5c00: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
5c10: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 (ssl == NULL ||
5c20: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 arg == NULL) {..
5c30: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
5c40: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
5c50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 }.. /* Only
5c60: 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e works for TLS 1.
5c70: 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 2 and earlier */
5c80: 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 . servername
5c90: 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 = SSL_get_server
5ca0: 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 name(ssl, TLSEXT
5cb0: 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e _NAMETYPE_host_n
5cc0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 ame);. if (!s
5cd0: 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 ervername || ser
5ce0: 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c vername[0] == '\
5cf0: 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 0') {..return SS
5d00: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
5d10: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 CK;. }.. i
5d20: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d f (statePtr->vcm
5d30: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e d == (Tcl_Obj*)N
5d40: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
5d50: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
5d60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
5d70: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
5d80: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
5d90: 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 chan, and server
5da0: 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 name args */.
5db0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
5dc0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
5dd0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
5de0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5df0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5e00: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
5e10: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 wStringObj("sni"
5e20: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
5e30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5e40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5e50: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
5e60: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
5e70: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
5e80: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
5e90: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
5ea0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
5eb0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
5ec0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
5ed0: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 bj(servername ,
5ee0: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 -1));.. /* Ev
5ef0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
5f00: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
5f10: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
5f20: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f tr);. if ((co
5f30: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 de = EvalCallbac
5f40: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
5f50: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 tr, cmdPtr)) > 1
5f60: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 ) {..res = SSL_T
5f70: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
5f80: 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 WARNING;..*alert
5f90: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f = SSL_AD_UNRECO
5fa0: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 GNIZED_NAME; /*
5fb0: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 Not supported by
5fc0: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 TLS 1.3 */.
5fd0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 } else if (code
5fe0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 1) {..res = S
5ff0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
6000: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
6010: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
6020: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
6030: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f ;..*alert = SSL_
6040: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f AD_UNRECOGNIZED_
6050: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 NAME; /* Not sup
6060: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e ported by TLS 1.
6070: 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 3 */. }. T
6080: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
6090: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 cmdPtr);. ret
60a0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a urn res;.}.../*.
60b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60f0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 -----. *. * Clie
6100: 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b ntHello Handshak
6110: 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 e Callback for S
6120: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 ervers --. *. *.
6130: 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74 Used by server t
6140: 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65 o examine the se
6150: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 rver name indica
6160: 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e tion (SNI) exten
6170: 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 sion. *.provided
6180: 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69 by the client i
6190: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63 n order to selec
61a0: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 t an appropriate
61b0: 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a certificate to.
61c0: 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 *.present, and
61d0: 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 make other confi
61e0: 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d guration adjustm
61f0: 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f ents relevant to
6200: 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09 that server. *.
6210: 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e name and its con
6220: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 figuration. This
6230: 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69 includes swappi
6240: 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63 ng out the assoc
6250: 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 iated. *.SSL_CTX
6260: 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 pointer, modify
6270: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 ing the server's
6280: 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74 list of permitt
6290: 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c ed TLS versions,
62a0: 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65 . *.changing the
62b0: 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72 server's cipher
62c0: 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 list in respons
62d0: 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 e to the client'
62e0: 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65 s cipher list, e
62f0: 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 tc.. *.Called be
6300: 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 fore SNI and ALP
6310: 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a N callbacks.. *.
6320: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
6330: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
6340: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
6350: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
6360: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
6370: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
6380: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 L_CLIENT_HELLO_R
6390: 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68 ETRY: suspend th
63a0: 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 e handshake, and
63b0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 the handshake f
63c0: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 unction will ret
63d0: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a urn immediately.
63e0: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 *.SSL_CLIENT_HE
63f0: 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 LLO_ERROR: failu
6400: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f re, terminate co
6410: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c nnection. Set al
6420: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 ert to error cod
6430: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 e.. *.SSL_CLIENT
6440: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 _HELLO_SUCCESS:
6450: 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d success. *. *---
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64a0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
64b0: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53 HelloCallback(SS
64c0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
64d0: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
64e0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
64f0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
6500: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
6510: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
6520: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
6530: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
6540: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
6550: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 , res;. const
6560: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
6570: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
6580: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 igned char *p;.
6590: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 size_t len, r
65a0: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 emaining;.. d
65b0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
65c0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
65d0: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 Ptr->vcmd == (Tc
65e0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
65f0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6600: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b T_HELLO_SUCCESS;
6610: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
6620: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 ssl == (const SS
6630: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 L *)NULL || arg
6640: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 == (void *)NULL)
6650: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 {..return SSL_C
6660: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6670: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6680: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 Get names */.
6690: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e if (!SSL_clien
66a0: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 t_hello_get0_ext
66b0: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 (ssl, TLSEXT_TYP
66c0: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 E_server_name, &
66d0: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c p, &remaining) |
66e0: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 | remaining <= 2
66f0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 ) {..*alert = SS
6700: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f L_R_SSLV3_ALERT_
6710: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 ILLEGAL_PARAMETE
6720: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 R;..return SSL_C
6730: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6740: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6750: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e Extract the len
6760: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c gth of the suppl
6770: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 ied list of name
6780: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 s. */. len =
6790: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 (*(p++) << 8);.
67a0: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 len += *(p++)
67b0: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 ;. if (len +
67c0: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 2 != remaining)
67d0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
67e0: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c R_SSLV3_ALERT_IL
67f0: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b LEGAL_PARAMETER;
6800: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
6810: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
6820: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 . }. remai
6830: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 ning = len;..
6840: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 /* The list in
6850: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 practice only ha
6860: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 s a single eleme
6870: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 nt, so we only c
6880: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 onsider the firs
6890: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 t one. */. if
68a0: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 (remaining == 0
68b0: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 || *p++ != TLSE
68c0: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 XT_NAMETYPE_host
68d0: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 _name) {..*alert
68e0: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
68f0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
6900: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c ROR;..return SSL
6910: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6920: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
6930: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 emaining--;..
6940: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 /* Now we can f
6950: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 inally pull out
6960: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 the byte array w
6970: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 ith the actual h
6980: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 ostname. */.
6990: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d if (remaining <=
69a0: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 2) {..*alert =
69b0: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
69c0: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 T_INTERNAL_ERROR
69d0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
69e0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
69f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 ;. }. len
6a00: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b = (*(p++) << 8);
6a10: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b . len += *(p+
6a20: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 +);. if (len
6a30: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 + 2 > remaining)
6a40: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
6a50: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
6a60: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 NTERNAL_ERROR;..
6a70: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6a80: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
6a90: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
6aa0: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 ng = len;. se
6ab0: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 rvername = (cons
6ac0: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 t char *)p;..
6ad0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
6ae0: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 nd to eval with
6af0: 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 fn, chan, and se
6b00: 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a rver name args *
6b10: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
6b20: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
6b30: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
6b40: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
6b50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
6b60: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
6b70: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
6b80: 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 hello", -1));.
6b90: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
6ba0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
6bb0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
6bc0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
6bd0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
6be0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
6bf0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lf), -1));. T
6c00: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6c10: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
6c20: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
6c30: 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e tringObj(servern
6c40: 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 ame, (Tcl_Size)
6c50: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 len));.. /* E
6c60: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d val callback com
6c70: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f mand */. Tcl_
6c80: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
6c90: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 Ptr);. if ((c
6ca0: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 ode = EvalCallba
6cb0: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ck(interp, state
6cc0: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 Ptr, cmdPtr)) >
6cd0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 1) {..res = SSL_
6ce0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 CLIENT_HELLO_RET
6cf0: 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 RY;..*alert = SS
6d00: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f L_R_TLSV1_ALERT_
6d10: 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a USER_CANCELLED;.
6d20: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
6d30: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 ode == 1) {..res
6d40: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 = SSL_CLIENT_HE
6d50: 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 LLO_SUCCESS;.
6d60: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
6d70: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6d80: 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 O_ERROR;..*alert
6d90: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
6da0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
6db0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 ROR;. }. T
6dc0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
6dd0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 cmdPtr);. ret
6de0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a urn res;.}.../**
6df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6e00: 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 **/./* Commands
6e10: 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a */./****
6e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6e30: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d /../*. *--------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
6e80: 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 * CiphersObjCmd
6e90: 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c -- list availabl
6ea0: 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 e ciphers. *. *.
6eb0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
6ec0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
6ed0: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 cess the "tls::c
6ee0: 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a iphers" command.
6ef0: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c *.to list avail
6f00: 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 able ciphers, ba
6f10: 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f sed upon protoco
6f20: 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 l selected.. *.
6f30: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
6f40: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
6f50: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 ult list.. *. *
6f60: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
6f70: 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 .constructs and
6f80: 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e destroys SSL con
6f90: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a text (CTX). *. *
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fe0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 ---. */.static c
6ff0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f onst char *proto
7000: 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c cols[] = {.."ssl
7010: 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 2", "ssl3", "tls
7020: 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 1", "tls1.1", "t
7030: 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 ls1.2", "tls1.3"
7040: 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 , NULL.};.enum p
7050: 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c rotocol {. TL
7060: 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 S_SSL2, TLS_SSL3
7070: 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f , TLS_TLS1, TLS_
7080: 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 TLS1_1, TLS_TLS1
7090: 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 _2, TLS_TLS1_3,
70a0: 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 TLS_NONE.};..sta
70b0: 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f tic int.CiphersO
70c0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
70d0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
70e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
70f0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
7100: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
7110: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ) {. Tcl_Obj
7120: 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a *objPtr = NULL;.
7130: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 SSL_CTX *ctx
7140: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c = NULL;. SSL
7150: 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *ssl = NULL;.
7160: 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 STACK_OF(SSL_C
7170: 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 IPHER) *sk;.
7180: 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d char buf[BUFSIZ]
7190: 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 69 ;. Tcl_Size i
71a0: 6e 64 65 78 3b 0a 20 20 20 20 69 6e 74 20 76 65 ndex;. int ve
71b0: 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 rbose = 0, use_s
71c0: 75 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 upported = 0;.
71d0: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 const SSL_METH
71e0: 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 20 20 20 20 OD *method;.
71f0: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 (void) clientDat
7200: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 a;.. dprintf(
7210: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
7220: 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c if ((objc < 2) |
7230: 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a | (objc > 4)) {.
7240: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
7250: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
7260: 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 v, "protocol ?ve
7270: 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 rbose? ?supporte
7280: 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 d?");..return TC
7290: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
72a0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e if (Tcl_GetIn
72b0: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
72c0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 p, objv[1], prot
72d0: 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c ocols, "protocol
72e0: 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d ", 0, &index) !=
72f0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
7300: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7310: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a }. if ((obj
7320: 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 c > 2) && Tcl_Ge
7330: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 tBooleanFromObj(
7340: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c interp, objv[2],
7350: 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 &verbose) != TC
7360: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
7370: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7380: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e . if ((objc >
7390: 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 3) && Tcl_GetBo
73a0: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 oleanFromObj(int
73b0: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 erp, objv[3], &u
73c0: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d se_supported) !=
73d0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
73e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
73f0: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
7400: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
7410: 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 switch ((enum p
7420: 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b rotocol)index) {
7430: 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a ..case TLS_SSL2:
7440: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
7450: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 SION_NUMBER >= 0
7460: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 x10100000L || de
7470: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c fined(NO_SSL2) |
7480: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
7490: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 L_NO_SSL2)..
74a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
74b0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
74c0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
74d0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
74e0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
74f0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
7500: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
7510: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 lse.. method
7520: 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 = SSLv2_method()
7530: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
7540: 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a .case TLS_SSL3:.
7550: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 #if defined(NO_S
7560: 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 SL3) || defined(
7570: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
7580: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7590: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 SSL_NO_SSL3_METH
75a0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 OD).. Tcl_App
75b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
75c0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
75d0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
75e0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
75f0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
7600: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
7610: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
7620: 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 method = SSLv3
7630: 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b _method(); break
7640: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 ;.#endif..case T
7650: 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 LS_TLS1:.#if def
7660: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c ined(NO_TLS1) ||
7670: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
7680: 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 _NO_TLS1) || def
7690: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
76a0: 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 TLS1_METHOD)..
76b0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
76c0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f lt(interp, proto
76d0: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 cols[index], ":
76e0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
76f0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
7700: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 ) NULL);.. re
7710: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7720: 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f #else.. metho
7730: 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 d = TLSv1_method
7740: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 (); break;.#endi
7750: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
7760: 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _1:.#if defined(
7770: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
7780: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7790: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
77a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
77b0: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 LS1_1_METHOD)..
77c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
77d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
77e0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
77f0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
7800: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
7810: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 *) NULL);.. r
7820: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7830: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
7840: 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 od = TLSv1_1_met
7850: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 hod(); break;.#e
7860: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
7870: 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e LS1_2:.#if defin
7880: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c ed(NO_TLS1_2) ||
7890: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
78a0: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 _NO_TLS1_2) || d
78b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
78c0: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 O_TLS1_2_METHOD)
78d0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
78e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
78f0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
7900: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
7910: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
7920: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
7930: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
7940: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
7950: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f ethod = TLSv1_2_
7960: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b method(); break;
7970: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c .#endif..case TL
7980: 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 S_TLS1_3:.#if de
7990: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
79a0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
79b0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 SSL_NO_TLS1_3)..
79c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
79d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
79e0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
79f0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
7a00: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
7a10: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
7a20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7a30: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 ;.#else.. met
7a40: 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 hod = TLS_method
7a50: 28 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 ();.. SSL_CTX
7a60: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 _set_min_proto_v
7a70: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
7a80: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 _3_VERSION);..
7a90: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 SSL_CTX_set_ma
7aa0: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 x_proto_version(
7ab0: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 ctx, TLS1_3_VERS
7ac0: 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b ION);.. break
7ad0: 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c ;.#endif..defaul
7ae0: 74 3a 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d t:.. method =
7af0: 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 TLS_method();..
7b00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
7b10: 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f .. ctx = SSL_
7b20: 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b CTX_new(method);
7b30: 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 . if (ctx ==
7b40: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
7b50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
7b60: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
7b70: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
7b80: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
7b90: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
7ba0: 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 ssl = SSL_new(
7bb0: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 ctx);. if (ss
7bc0: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 l == NULL) {..Tc
7bd0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
7be0: 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 nterp, GET_ERR_R
7bf0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
7c00: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 ) NULL);..SSL_CT
7c10: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
7c20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7c30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 }.. /* Us
7c40: 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72 e list and order
7c50: 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e as would be sen
7c60: 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c t in a ClientHel
7c70: 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 lo or all availa
7c80: 62 6c 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 ble ciphers */.
7c90: 20 20 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f if (use_suppo
7ca0: 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 rted) {..sk = SS
7cb0: 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64 L_get1_supported
7cc0: 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 _ciphers(ssl);.
7cd0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 } else {..sk
7ce0: 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 = SSL_get_cipher
7cf0: 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 s(ssl);. }..
7d00: 20 20 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c if (sk != NUL
7d10: 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f L) {..if (!verbo
7d20: 73 65 29 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 se) {.. const
7d30: 20 63 68 61 72 20 2a 63 70 3b 0a 09 20 20 20 20 char *cp;..
7d40: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
7d50: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
7d60: 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 ;.. for (int
7d70: 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 i = 0; i < sk_SS
7d80: 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 L_CIPHER_num(sk)
7d90: 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 ; i++) {...const
7da0: 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d SSL_CIPHER *c =
7db0: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 sk_SSL_CIPHER_v
7dc0: 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 alue(sk, i);...i
7dd0: 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f f (c == NULL) co
7de0: 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 ntinue;..../* ci
7df0: 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f pher name or (NO
7e00: 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 NE) */...cp = SS
7e10: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d L_CIPHER_get_nam
7e20: 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d e(c);...if (cp =
7e30: 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 = NULL) break;..
7e40: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
7e50: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
7e60: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
7e70: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 wStringObj((char
7e80: 20 2a 29 20 63 70 2c 20 2d 31 29 29 3b 0a 09 20 *) cp, -1));..
7e90: 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a }...} else {.
7ea0: 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 . objPtr = Tc
7eb0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
7ec0: 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 ",0);.. for (
7ed0: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 int i = 0; i < s
7ee0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d k_SSL_CIPHER_num
7ef0: 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 (sk); i++) {...c
7f00: 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 onst SSL_CIPHER
7f10: 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 *c = sk_SSL_CIPH
7f20: 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b ER_value(sk, i);
7f30: 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c ...if (c == NULL
7f40: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f ) continue;..../
7f50: 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 * textual descri
7f60: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 ption of the cip
7f70: 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c her */...if (SSL
7f80: 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 _CIPHER_descript
7f90: 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 ion(c, buf, size
7fa0: 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c of(buf)) != NULL
7fb0: 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 ) {... Tcl_Ap
7fc0: 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 pendToObj(objPtr
7fd0: 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 , buf, (Tcl_Size
7fe0: 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a ) strlen(buf));.
7ff0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 ..} else {...
8000: 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a Tcl_AppendToObj
8010: 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 (objPtr, "UNKNOW
8020: 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 N\n", 8);...}..
8030: 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 }..}..if (use
8040: 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 _supported) {..
8050: 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 sk_SSL_CIPHER
8060: 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 _free(sk);..}.
8070: 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 }. SSL_free
8080: 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 (ssl);. SSL_C
8090: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 TX_free(ctx);..
80a0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
80b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ult(interp, objP
80c0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
80d0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 TCL_OK;.}.../*.
80e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8120: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f ----. *. * Proto
8130: 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 colsObjCmd -- li
8140: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f st available pro
8150: 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 tocols. *. *.Thi
8160: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
8170: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
8180: 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 s the "tls::prot
8190: 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 ocols" command.
81a0: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 *.to list availa
81b0: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 ble protocols..
81c0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
81d0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
81e0: 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a result list.. *.
81f0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
8200: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d . *.none. *. *--
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8250: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
8260: 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 .ProtocolsObjCmd
8270: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
8280: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
8290: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
82a0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
82b0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
82c0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
82d0: 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 tr;. (void) c
82e0: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 lientData;..
82f0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
8300: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
8310: 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 != 1) {..Tcl_Wr
8320: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
8330: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b p, 1, objv, "");
8340: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
8350: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 OR;. }.. E
8360: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
8370: 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 ;.. objPtr =
8380: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
8390: 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 , NULL);..#if OP
83a0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
83b0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
83c0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
83d0: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
83e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
83f0: 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 SL2). Tcl_Lis
8400: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
8410: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
8420: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
8430: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
8440: 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 _SSL2], -1));.#e
8450: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
8460: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 d(NO_SSL3) && !d
8470: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
8480: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
8490: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
84a0: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 SL3_METHOD).
84b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
84c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
84d0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
84e0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 StringObj(protoc
84f0: 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d ols[TLS_SSL3], -
8500: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
8510: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
8520: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
8530: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 ENSSL_NO_TLS1) &
8540: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
8550: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
8560: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f D). Tcl_ListO
8570: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
8580: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
8590: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
85a0: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 (protocols[TLS_T
85b0: 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 LS1], -1));.#end
85c0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
85d0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
85e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
85f0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
8600: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8610: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a _TLS1_1_METHOD).
8620: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
8630: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
8640: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
8650: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
8660: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
8670: 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 _1], -1));.#endi
8680: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
8690: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
86a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
86b0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
86c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
86d0: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 TLS1_2_METHOD).
86e0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
86f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
8700: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
8710: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
8720: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f tocols[TLS_TLS1_
8730: 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 2], -1));.#endif
8740: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
8750: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 _TLS1_3) && !def
8760: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8770: 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f TLS1_3). Tcl_
8780: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
8790: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
87a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
87b0: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
87c0: 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 TLS_TLS1_3], -1)
87d0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 );.#endif.. T
87e0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
87f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
8800: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
8810: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
8820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8860: 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 . *. * Handshake
8870: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
8880: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 This command is
8890: 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 used to verify w
88a0: 68 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 hether the hands
88b0: 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 hake is complete
88c0: 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 . *.or not.. *.
88d0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
88e0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
88f0: 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e ult. 1 means han
8900: 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c dshake complete,
8910: 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 0 means pending
8920: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
8930: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 ects:. *.May for
8940: 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 ce SSL negotiati
8950: 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 on to take place
8960: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
8970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
89a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
89b0: 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68 tatic int Handsh
89c0: 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 akeObjCmd(Client
89d0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
89e0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
89f0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
8a00: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
8a10: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
8a20: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 Channel chan;
8a30: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e /* The chan
8a40: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 nel to set a mod
8a50: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 e on. */. Sta
8a60: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20 te *statePtr;
8a70: 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 /* client s
8a80: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 tate for ssl soc
8a90: 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 ket */. const
8aa0: 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20 char *errStr =
8ab0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 NULL;. int re
8ac0: 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 t = 1;. int e
8ad0: 72 72 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 rr = 0;. (voi
8ae0: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a d) clientData;..
8af0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
8b00: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
8b10: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 objc != 2) {..Tc
8b20: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
8b30: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
8b40: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 "channel");..ret
8b50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
8b60: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
8b70: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
8b80: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
8b90: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
8ba0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
8bb0: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 jv[1]), NULL);.
8bc0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
8bd0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
8be0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
8bf0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
8c00: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
8c10: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
8c20: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
8c30: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
8c40: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
8c50: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 l(chan);. if
8c60: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
8c70: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
8c80: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
8c90: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
8ca0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
8cb0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
8cc0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
8cd0: 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 (chan),.. "\"
8ce0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
8cf0: 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e nel", (char *) N
8d00: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 ULL);..Tcl_SetEr
8d10: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
8d20: 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b "TLS", "HANDSHAK
8d30: 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 E", "CHANNEL", "
8d40: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
8d50: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
8d60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
8d70: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 }. statePtr
8d80: 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 = (State *)Tcl_G
8d90: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 etChannelInstanc
8da0: 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 eData(chan);..
8db0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 dprintf("Calli
8dc0: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f ng Tls_WaitForCo
8dd0: 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 nnect");. ret
8de0: 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f = Tls_WaitForCo
8df0: 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 nnect(statePtr,
8e00: 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 &err, 1);. dp
8e10: 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 rintf("Tls_WaitF
8e20: 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e orConnect return
8e30: 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a ed: %i", ret);..
8e40: 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 if (ret < 0
8e50: 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 && ((statePtr->f
8e60: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 lags & TLS_TCL_A
8e70: 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d SYNC) && (err ==
8e80: 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 EAGAIN))) {..dp
8e90: 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 rintf("Async set
8ea0: 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 and err = EAGAI
8eb0: 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 N");..ret = 0;.
8ec0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 } else if (re
8ed0: 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 t < 0) {..long r
8ee0: 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d esult;..errStr =
8ef0: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a statePtr->err;.
8f00: 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 .Tcl_ResetResult
8f10: 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 (interp);..Tcl_S
8f20: 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 etErrno(err);...
8f30: 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 if (!errStr || (
8f40: 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b *errStr == 0)) {
8f50: 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 .. errStr = T
8f60: 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e cl_PosixError(in
8f70: 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f terp);..}...Tcl_
8f80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
8f90: 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 erp, "handshake
8fa0: 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 failed: ", errSt
8fb0: 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c r, (char *) NULL
8fc0: 29 3b 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20 );..if ((result
8fd0: 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 = SSL_get_verify
8fe0: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 _result(statePtr
8ff0: 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f ->ssl)) != X509_
9000: 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c V_OK) {.. Tcl
9010: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
9020: 74 65 72 70 2c 20 22 20 64 75 65 20 74 6f 20 5c terp, " due to \
9030: 22 22 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f "", X509_verify_
9040: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e cert_error_strin
9050: 67 28 72 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c g(result), "\"",
9060: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
9070: 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f ..}..Tcl_SetErro
9080: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
9090: 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 LS", "HANDSHAKE"
90a0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
90b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 r *) NULL);..dpr
90c0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 intf("Returning
90d0: 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 TCL_ERROR with h
90e0: 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a andshake failed:
90f0: 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 %s", errStr);..
9100: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
9110: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
9120: 69 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a if (err != 0) {.
9130: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f . dprintf("Go
9140: 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 t an error with
9150: 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 a completed hand
9160: 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 shake: err = %i"
9170: 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 , err);..}..ret
9180: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 = 1;. }..
9190: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
91a0: 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 ng TCL_OK with d
91b0: 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 ata \"%i\"", ret
91c0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 );. Tcl_SetOb
91d0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
91e0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 Tcl_NewIntObj(re
91f0: 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 t));. return
9200: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 TCL_OK;.}.../*.
9210: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9250: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 ----. *. * Impor
9260: 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a tObjCmd --. *. *
9270: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
9280: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 is invoked to pr
9290: 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 ocess the "ssl"
92a0: 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 command. *. *.Th
92b0: 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 e ssl command pu
92c0: 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 shes SSL over a
92d0: 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 (newly connected
92e0: 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a ) tcp socket. *.
92f0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
9300: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
9310: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
9320: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 effects:. *.May
9330: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 modify the beha
9340: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 vior of an IO ch
9350: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d annel.. *. *----
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
93a0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 */.static int.I
93b0: 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 mportObjCmd(Clie
93c0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
93d0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
93e0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
93f0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
9400: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
9410: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 l_Channel chan;.
9420: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 ./* The channel
9430: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e to set a mode on
9440: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a . */. State *
9450: 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c statePtr;../* cl
9460: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 ient state for s
9470: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 sl socket */.
9480: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 09 3d SSL_CTX *ctx..=
9490: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f NULL;. Tcl_O
94a0: 62 6a 20 2a 73 63 72 69 70 74 09 09 3d 20 4e 55 bj *script..= NU
94b0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 LL;. Tcl_Obj
94c0: 2a 70 61 73 73 77 6f 72 64 09 09 3d 20 4e 55 4c *password..= NUL
94d0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a L;. Tcl_Obj *
94e0: 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 vcmd..= NULL;.
94f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 Tcl_DString up
9500: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
9510: 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e ation, upperChan
9520: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 nelBlocking, upp
9530: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
9540: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 g, upperChannelE
9550: 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 OFChar;. int
9560: 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a idx;. Tcl_Siz
9570: 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 e len;. int f
9580: 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f 54 43 4c lags...= TLS_TCL
9590: 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 _INIT;. int s
95a0: 65 72 76 65 72 09 09 09 3d 20 30 3b 09 2f 2a 20 erver...= 0;./*
95b0: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e is connection in
95c0: 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 coming or outgoi
95d0: 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 ng? */. char
95e0: 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55 4c 4c *keyfile..= NULL
95f0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 ;. char *cert
9600: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 file..= NULL;.
9610: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
9620: 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 *key..= NULL;.
9630: 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c Tcl_Size key_l
9640: 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75 6e 73 en..= 0;. uns
9650: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 igned char *cert
9660: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 ..= NULL;. Tc
9670: 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e 09 l_Size cert_len.
9680: 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a .= 0;. char *
9690: 63 69 70 68 65 72 73 09 09 3d 20 4e 55 4c 4c 3b ciphers..= NULL;
96a0: 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 . char *ciphe
96b0: 72 73 75 69 74 65 73 09 09 3d 20 4e 55 4c 4c 3b rsuites..= NULL;
96c0: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c . char *CAfil
96d0: 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 e..= NULL;. c
96e0: 68 61 72 20 2a 43 41 70 61 74 68 09 09 3d 20 4e har *CApath..= N
96f0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 ULL;. char *C
9700: 41 73 74 6f 72 65 09 09 3d 20 4e 55 4c 4c 3b 0a Astore..= NULL;.
9710: 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 char *DHpara
9720: 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ms..= NULL;.
9730: 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 3d 20 char *model...=
9740: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
9750: 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e 55 servername..= NU
9760: 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 LL;./* hostname
9770: 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 for Server Name
9780: 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 Indication */.
9790: 20 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f char *session_
97a0: 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 id..= NULL;.
97b0: 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d Tcl_Obj *alpn..=
97c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 NULL;. int s
97d0: 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 sl2 = 0, ssl3 =
97e0: 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 0;. int tls1
97f0: 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c = 1, tls1_1 = 1,
9800: 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 tls1_2 = 1, tls
9810: 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 1_3 = 1;. int
9820: 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 proto = 0, leve
9830: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 l = -1;. int
9840: 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 verify = 0, requ
9850: 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 ire = 0, request
9860: 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 = 1, post_hands
9870: 68 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 28 76 hake = 0;. (v
9880: 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b oid) clientData;
9890: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
98a0: 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 alled");..#if de
98b0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c fined(NO_TLS1) |
98c0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
98d0: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 L_NO_TLS1). t
98e0: 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a ls1 = 0;.#endif.
98f0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
9900: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_1) || define
9910: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
9920: 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 1_1). tls1_1
9930: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 0;.#endif.#if
9940: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
9950: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
9960: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
9970: 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b . tls1_2 = 0;
9980: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
9990: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c ned(NO_TLS1_3) |
99a0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
99b0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
99c0: 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e tls1_3 = 0;.#en
99d0: 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a dif.. if (obj
99e0: 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 c < 2) {..Tcl_Wr
99f0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
9a00: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
9a10: 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 nnel ?options?")
9a20: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
9a30: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
9a40: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
9a50: 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 );.. chan = T
9a60: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
9a70: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
9a80: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 ing(objv[1]), NU
9a90: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
9aa0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
9ab0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
9ac0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
9ad0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
9ae0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
9af0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
9b00: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
9b10: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
9b20: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a Channel(chan);..
9b30: 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 for (idx = 2
9b40: 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 ; idx < objc; id
9b50: 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 x++) {..char *op
9b60: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e t = Tcl_GetStrin
9b70: 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a 0a 09 g(objv[idx]);...
9b80: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d if (opt[0] != '-
9b90: 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a ').. break;..
9ba0: 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c .OPTOBJ("-alpn",
9bb0: 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 alpn);..OPTSTR(
9bc0: 22 2d 63 61 64 69 72 22 2c 20 43 41 70 61 74 68 "-cadir", CApath
9bd0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 );..OPTSTR("-caf
9be0: 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 ile", CAfile);..
9bf0: 4f 50 54 53 54 52 28 22 2d 63 61 73 74 6f 72 65 OPTSTR("-castore
9c00: 22 2c 20 43 41 73 74 6f 72 65 29 3b 0a 09 4f 50 ", CAstore);..OP
9c10: 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 TBYTE("-cert", c
9c20: 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a ert, cert_len);.
9c30: 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 69 .OPTSTR("-certfi
9c40: 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a le", certfile);.
9c50: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 .OPTSTR("-cipher
9c60: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 ", ciphers);..OP
9c70: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c TSTR("-ciphers",
9c80: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 ciphers);..OPTS
9c90: 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 65 TR("-ciphersuite
9ca0: 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 s", ciphersuites
9cb0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d );..OPTOBJ("-com
9cc0: 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a mand", script);.
9cd0: 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 61 .OPTSTR("-dhpara
9ce0: 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a ms", DHparams);.
9cf0: 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c .OPTBYTE("-key",
9d00: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a key, key_len);.
9d10: 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c .OPTSTR("-keyfil
9d20: 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f e", keyfile);..O
9d30: 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 PTSTR("-model",
9d40: 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 model);..OPTOBJ(
9d50: 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73 "-password", pas
9d60: 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c sword);..OPTBOOL
9d70: 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b ("-post_handshak
9d80: 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 e", post_handsha
9d90: 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d ke);..OPTBOOL("-
9da0: 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 65 73 request", reques
9db0: 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 t);..OPTBOOL("-r
9dc0: 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 equire", require
9dd0: 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 );..OPTINT("-sec
9de0: 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 6c 65 urity_level", le
9df0: 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 vel);..OPTBOOL("
9e00: 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 65 72 -server", server
9e10: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72 );..OPTSTR("-ser
9e20: 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 vername", server
9e30: 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 name);..OPTSTR("
9e40: 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 -session_id", se
9e50: 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 ssion_id);..OPTB
9e60: 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c OOL("-ssl2", ssl
9e70: 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 2);..OPTBOOL("-s
9e80: 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 sl3", ssl3);..OP
9e90: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 TBOOL("-tls1", t
9ea0: 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 ls1);..OPTBOOL("
9eb0: 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 -tls1.1", tls1_1
9ec0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c );..OPTBOOL("-tl
9ed0: 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a s1.2", tls1_2);.
9ee0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e .OPTBOOL("-tls1.
9ef0: 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 3", tls1_3);..OP
9f00: 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 63 TOBJ("-validatec
9f10: 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a ommand", vcmd);.
9f20: 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c .OPTOBJ("-vcmd",
9f30: 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44 vcmd);...OPTBAD
9f40: 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 ("option", "-alp
9f50: 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 n, -cadir, -cafi
9f60: 6c 65 2c 20 2d 63 61 73 74 6f 72 65 2c 20 2d 63 le, -castore, -c
9f70: 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 ert, -certfile,
9f80: 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 -cipher, -cipher
9f90: 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 suites, -command
9fa0: 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 , -dhparams, -ke
9fb0: 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f y, -keyfile, -mo
9fc0: 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 del, -password,
9fd0: 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c -post_handshake,
9fe0: 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75 -request, -requ
9ff0: 69 72 65 2c 20 2d 73 65 63 75 72 69 74 79 5f 6c ire, -security_l
a000: 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d evel, -server, -
a010: 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 servername, -ses
a020: 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 sion_id, -ssl2,
a030: 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 -ssl3, -tls1, -t
a040: 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 ls1.1, -tls1.2,
a050: 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c -tls1.3, or -val
a060: 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a idatecommand");.
a070: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
a080: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
a090: 20 28 72 65 71 75 65 73 74 29 09 09 76 65 72 69 (request)..veri
a0a0: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 fy |= SSL_VERIFY
a0b0: 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 _CLIENT_ONCE | S
a0c0: 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a SL_VERIFY_PEER;.
a0d0: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 if (request
a0e0: 26 26 20 72 65 71 75 69 72 65 29 09 76 65 72 69 && require).veri
a0f0: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 fy |= SSL_VERIFY
a100: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 _FAIL_IF_NO_PEER
a110: 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 _CERT;. if (r
a120: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 equest && post_h
a130: 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 andshake).verify
a140: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 |= SSL_VERIFY_P
a150: 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 OST_HANDSHAKE;.
a160: 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d if (verify ==
a170: 20 30 29 09 09 76 65 72 69 66 79 20 3d 20 53 53 0)..verify = SS
a180: 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a L_VERIFY_NONE;..
a190: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 proto |= (ss
a1a0: 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 l2 ? TLS_PROTO_S
a1b0: 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 SL2 : 0);. pr
a1c0: 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 oto |= (ssl3 ? T
a1d0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 LS_PROTO_SSL3 :
a1e0: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
a1f0: 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f (tls1 ? TLS_PRO
a200: 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 TO_TLS1 : 0);.
a210: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
a220: 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _1 ? TLS_PROTO_T
a230: 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 LS1_1 : 0);.
a240: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 proto |= (tls1_2
a250: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
a260: 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 1_2 : 0);. pr
a270: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f oto |= (tls1_3 ?
a280: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
a290: 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 3 : 0);.. /*
a2a0: 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 reset to NULL if
a2b0: 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 blank string pr
a2c0: 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 ovided */. if
a2d0: 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 (cert && !*cert
a2e0: 29 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09 ).. cert.
a2f0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
a300: 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 if (key && !
a310: 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b *key).. k
a320: 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c ey. = NUL
a330: 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 L;. if (certf
a340: 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c ile && !*certfil
a350: 65 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66 e) certf
a360: 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ile.= NULL;.
a370: 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 if (keyfile && !
a380: 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 *keyfile)..keyfi
a390: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c le. = NUL
a3a0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 L;. if (ciphe
a3b0: 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 rs && !*ciphers)
a3c0: 09 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73 . ciphers
a3d0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
a3e0: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 . if (ciphers
a3f0: 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 uites && !*ciphe
a400: 72 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73 rsuites) ciphers
a410: 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b uites = NULL;
a420: 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 . if (CAfile
a430: 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 && !*CAfile).
a440: 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 CAfile.
a450: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a460: 69 66 20 28 43 41 70 61 74 68 20 26 26 20 21 2a if (CApath && !*
a470: 43 41 70 61 74 68 29 09 20 20 20 20 20 20 20 20 CApath).
a480: 43 41 70 61 74 68 09 20 20 20 20 20 20 20 20 3d CApath. =
a490: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 NULL;. if (C
a4a0: 41 73 74 6f 72 65 20 26 26 20 21 2a 43 41 73 74 Astore && !*CAst
a4b0: 6f 72 65 29 09 20 20 20 20 20 20 20 20 43 41 73 ore). CAs
a4c0: 74 6f 72 65 09 20 20 20 20 20 20 20 20 3d 20 4e tore. = N
a4d0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 ULL;. if (DHp
a4e0: 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 arams && !*DHpar
a4f0: 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70 ams). DHp
a500: 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e arams = N
a510: 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 ULL;.. /* new
a520: 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 SSL state */.
a530: 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 statePtr..= (S
a540: 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 tate *) ckalloc(
a550: 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f (unsigned) sizeo
a560: 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d f(State));. m
a570: 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 emset(statePtr,
a580: 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 0, sizeof(State)
a590: 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 );.. statePtr
a5a0: 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b ->flags.= flags;
a5b0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 . statePtr->i
a5c0: 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a nterp.= interp;.
a5d0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 statePtr->wa
a5e0: 6e 74 09 3d 20 30 3b 0a 20 20 20 20 73 74 61 74 nt.= 0;. stat
a5f0: 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 ePtr->vflags.= v
a600: 65 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 erify;. state
a610: 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a Ptr->err.= "";..
a620: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 /* allocate
a630: 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 script */. if
a640: 20 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f (script) {..(vo
a650: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e id) Tcl_GetStrin
a660: 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c gFromObj(script,
a670: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e &len);..if (len
a680: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 ) {.. statePt
a690: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 r->callback = sc
a6a0: 72 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 ript;.. Tcl_I
a6b0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ncrRefCount(stat
a6c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
a6d0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
a6e0: 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 * allocate passw
a6f0: 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 ord */. if (p
a700: 61 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 assword) {..(voi
a710: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 d) Tcl_GetString
a720: 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 FromObj(password
a730: 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 , &len);..if (le
a740: 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 n) {.. stateP
a750: 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 tr->password = p
a760: 61 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 assword;.. Tc
a770: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 l_IncrRefCount(s
a780: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
a790: 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 d);..}. }..
a7a0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 /* allocate va
a7b0: 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a lidate command *
a7c0: 2f 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 /. if (vcmd)
a7d0: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 {..(void) Tcl_Ge
a7e0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 tStringFromObj(v
a7f0: 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 cmd, &len);..if
a800: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 (len) {.. sta
a810: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 tePtr->vcmd = vc
a820: 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 md;.. Tcl_Inc
a830: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
a840: 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 tr->vcmd);..}.
a850: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 }.. if (mod
a860: 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 el != NULL) {..i
a870: 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 nt mode;../* Get
a880: 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e the "model" con
a890: 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 text */..chan =
a8a0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
a8b0: 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d nterp, model, &m
a8c0: 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 ode);..if (chan
a8d0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
a8e0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c NULL) {.. Tl
a8f0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 s_Free((tls_free
a900: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 _type *) statePt
a910: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
a920: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
a930: 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 /*.. * Make sure
a940: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
a950: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
a960: 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 el.. */..chan =
a970: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
a980: 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 l(chan);..if (Tc
a990: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
a9a0: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
a9b0: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
a9c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
a9d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
a9e0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
a9f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
aa00: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 e(chan),..."\":
aa10: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
aa20: 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c l", (char *) NUL
aa30: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
aa40: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
aa50: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
aa60: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 ", "CHANNEL", "I
aa70: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a NVALID", (char *
aa80: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c ) NULL);.. Tl
aa90: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 s_Free((tls_free
aaa0: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 _type *) statePt
aab0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
aac0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 TCL_ERROR;..}..c
aad0: 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54 tx = ((State *)T
aae0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
aaf0: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29 tanceData(chan))
ab00: 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 ->ctx;. } els
ab10: 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20 e {..if ((ctx =
ab20: 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 CTX_Init(statePt
ab30: 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f r, server, proto
ab40: 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66 , keyfile, certf
ab50: 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 ile, key, cert,
ab60: 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 63 65 key_len,.. ce
ab70: 72 74 5f 6c 65 6e 2c 20 43 41 70 61 74 68 2c 20 rt_len, CApath,
ab80: 43 41 73 74 6f 72 65 2c 20 43 41 66 69 6c 65 2c CAstore, CAfile,
ab90: 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 ciphers, cipher
aba0: 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 suites, level, D
abb0: 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c Hparams)) == NUL
abc0: 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 L) {.. Tls_Fr
abd0: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 ee((tls_free_typ
abe0: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a e *) statePtr);.
abf0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
ac00: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
ac10: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 . statePtr->c
ac20: 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f tx = ctx;.. /
ac30: 2a 20 50 72 65 73 65 72 76 65 20 63 68 61 6e 6e * Preserve chann
ac40: 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 el config */.
ac50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
ac60: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 (&upperChannelTr
ac70: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 anslation);.
ac80: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
ac90: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f &upperChannelBlo
aca0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f cking);. Tcl_
acb0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 DStringInit(&upp
acc0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
acd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
ace0: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
acf0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 nnelEncoding);.
ad00: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
ad10: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
ad20: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 chan, "-eofchar"
ad30: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 , &upperChannelE
ad40: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c OFChar);. Tcl
ad50: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
ad60: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
ad70: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 "-encoding", &up
ad80: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
ad90: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ng);. Tcl_Get
ada0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
adb0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 terp, chan, "-tr
adc0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 anslation", &upp
add0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
ade0: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 tion);. Tcl_G
adf0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
ae00: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
ae10: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 blocking", &uppe
ae20: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
ae30: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 73 75 72 );.. /* Ensur
ae40: 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f e the channel wo
ae50: 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 6d 6f rks in binary mo
ae60: 64 65 20 28 66 6f 72 20 74 68 65 20 65 6e 63 72 de (for the encr
ae70: 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 yption not to ge
ae80: 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 20 2a 2f t goofed up). */
ae90: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
aea0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
aeb0: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c , chan, "-transl
aec0: 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 ation", "binary"
aed0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
aee0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
aef0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 rp, chan, "-bloc
af00: 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a king", "true");.
af10: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 73 . /* Create s
af20: 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 2a tacked channel *
af30: 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 /. dprintf("C
af40: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 onsuming Tcl cha
af50: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 nnel %s", Tcl_Ge
af60: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
af70: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 n));. statePt
af80: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 r->self = Tcl_St
af90: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 ackChannel(inter
afa0: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 p, Tls_ChannelTy
afb0: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 pe(), (ClientDat
afc0: 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54 a) statePtr,..(T
afd0: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 CL_READABLE | TC
afe0: 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 L_WRITABLE), cha
aff0: 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 n);. dprintf(
b000: 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c "Created channel
b010: 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f named %s", Tcl_
b020: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
b030: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b tatePtr->self));
b040: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
b050: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f r->self == (Tcl_
b060: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
b070: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 ../*.. * No use
b080: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c of Tcl_Eventuall
b090: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f yFree because no
b0a0: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 possible Tcl_Pr
b0b0: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c eserve... */..Tl
b0c0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 s_Free((tls_free
b0d0: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 _type *) statePt
b0e0: 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 r);..Tcl_DString
b0f0: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e Free(&upperChann
b100: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
b110: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
b120: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e (&upperChannelEn
b130: 63 6f 64 69 6e 67 29 3b 0a 09 54 63 6c 5f 44 53 coding);..Tcl_DS
b140: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
b150: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
b160: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
b170: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 e(&upperChannelB
b180: 6c 6f 63 6b 69 6e 67 29 3b 0a 09 72 65 74 75 72 locking);..retur
b190: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
b1a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 6f }.. /* Resto
b1b0: 72 65 20 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 69 re channel confi
b1c0: 67 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 g */. Tcl_Set
b1d0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
b1e0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e terp, statePtr->
b1f0: 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 self, "-translat
b200: 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e ion", Tcl_DStrin
b210: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
b220: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 nnelTranslation)
b230: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
b240: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
b250: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
b260: 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c lf, "-encoding",
b270: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 Tcl_DStringValu
b280: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 e(&upperChannelE
b290: 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 ncoding));. T
b2a0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
b2b0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ion(interp, stat
b2c0: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f ePtr->self, "-eo
b2d0: 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 fchar", Tcl_DStr
b2e0: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 ingValue(&upperC
b2f0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b hannelEOFChar));
b300: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
b310: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
b320: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
b330: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 , "-blocking", T
b340: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
b350: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f &upperChannelBlo
b360: 63 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c cking));. Tcl
b370: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 _DStringFree(&up
b380: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
b390: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f ation);. Tcl_
b3a0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 DStringFree(&upp
b3b0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
b3c0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 g);. Tcl_DStr
b3d0: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 ingFree(&upperCh
b3e0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 annelEOFChar);.
b3f0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
b400: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ee(&upperChannel
b410: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 Blocking);..
b420: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e /*. * SSL In
b430: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 itialization.
b440: 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 */. statePt
b450: 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 r->ssl = SSL_new
b460: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b (statePtr->ctx);
b470: 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50 . if (!stateP
b480: 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 tr->ssl) {../* S
b490: 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 SL library error
b4a0: 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 */..Tcl_AppendR
b4b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 esult(interp, "c
b4c0: 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 ouldn't construc
b4d0: 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 t ssl session: "
b4e0: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
b4f0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
b500: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
b510: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
b520: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
b530: 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c ", "INIT", "FAIL
b540: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
b550: 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 LL);..Tls_Free((
b560: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 tls_free_type *)
b570: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 statePtr);..ret
b580: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
b590: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 }.. /* Set
b5a0: 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d host server nam
b5b0: 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 e */. if (ser
b5c0: 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 vername) {../* S
b5d0: 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e ets the server n
b5e0: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 ame indication (
b5f0: 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 SNI) in ClientHe
b600: 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f llo extension */
b610: 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 ../* Per RFC 606
b620: 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 6, hostname is a
b630: 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 ASCII encoded s
b640: 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 tring, though RF
b650: 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46 2d C 4366 says UTF-
b660: 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 8. */..if (!SSL_
b670: 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f set_tlsext_host_
b680: 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 name(statePtr->s
b690: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 sl, servername)
b6a0: 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 && require) {..
b6b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
b6c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 ult(interp, "Set
b6d0: 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 SNI extension f
b6e0: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 ailed: ", GET_ER
b6f0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
b700: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
b710: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 Tcl_SetErrorCod
b720: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
b730: 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 "IMPORT", "SNI"
b740: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
b750: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
b760: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 Tls_Free((tls_f
b770: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 ree_type *) stat
b780: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
b790: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
b7a0: 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 .../* Set hostna
b7b0: 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 me for peer cert
b7c0: 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 ificate hostname
b7d0: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e verification in
b7e0: 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f clients... Do
b7f0: 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31 n't use SSL_set1
b800: 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68 _host since it h
b810: 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 as limitations.
b820: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 */..if (!SSL_add
b830: 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 1_host(statePtr-
b840: 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 >ssl, servername
b850: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
b860: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
b870: 70 2c 20 22 53 65 74 20 44 4e 53 20 68 6f 73 74 p, "Set DNS host
b880: 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 name failed: ",
b890: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
b8a0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b8b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
b8c0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
b8d0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
b8e0: 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 "HOSTNAME", "FA
b8f0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
b900: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f NULL);.. Tls_
b910: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 Free((tls_free_t
b920: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 ype *) statePtr)
b930: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
b940: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 L_ERROR;..}.
b950: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 }.. /* Resume
b960: 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 session id */.
b970: 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 if (session_i
b980: 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 d && strlen(sess
b990: 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d ion_id) <= SSL_M
b9a0: 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 AX_SID_CTX_LENGT
b9b0: 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 H) {../* SSL_set
b9c0: 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 _session() */..i
b9d0: 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f f (!SSL_SESSION_
b9e0: 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 set1_id_context(
b9f0: 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_get_session(
ba00: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 0a statePtr->ssl),.
ba10: 09 09 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 ..(const unsigne
ba20: 64 20 63 68 61 72 20 2a 29 20 73 65 73 73 69 6f d char *) sessio
ba30: 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 n_id, (unsigned
ba40: 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73 int) strlen(sess
ba50: 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 ion_id))) {..
ba60: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
ba70: 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d t(interp, "Resum
ba80: 65 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64 e session failed
ba90: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
baa0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
bab0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
bac0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
bad0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
bae0: 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c ORT", "SESSION",
baf0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
bb00: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
bb10: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 Tls_Free((tls_fr
bb20: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 ee_type *) state
bb30: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
bb40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
bb50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e }.. /* En
bb60: 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e able Application
bb70: 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 -Layer Protocol
bb80: 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 Negotiation. Exa
bb90: 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f mples are: http/
bba0: 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 1.0,..http/1.1,
bbb0: 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 h2, h3, ftp, ima
bbc0: 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c p, pop3, xmpp-cl
bbd0: 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 ient, xmpp-serve
bbe0: 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 r, mqtt, irc, et
bbf0: 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c c. */. if (al
bc00: 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 pn) {../* Conver
bc10: 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 t a TCL list int
bc20: 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 o a protocol-lis
bc30: 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 t in wire-format
bc40: 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 */..unsigned ch
bc50: 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a ar *protos, *p;.
bc60: 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 .unsigned int pr
bc70: 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 otos_len = 0;..T
bc80: 63 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a cl_Size cnt, i;.
bc90: 09 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a .int j;..Tcl_Obj
bca0: 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 **list;...if (T
bcb0: 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 cl_ListObjGetEle
bcc0: 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c ments(interp, al
bcd0: 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 pn, &cnt, &list)
bce0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 != TCL_OK) {..
bcf0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 Tls_Free((tls
bd00: 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 _free_type *) st
bd10: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
bd20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
bd30: 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e .}.../* Determin
bd40: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 e the memory req
bd50: 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 uired for the pr
bd60: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 otocol-list */..
bd70: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 for (i = 0; i <
bd80: 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 cnt; i++) {..
bd90: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
bda0: 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 omObj(list[i], &
bdb0: 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c len);.. if (l
bdc0: 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 en > 255) {...Tc
bdd0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
bde0: 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f nterp, "ALPN pro
bdf0: 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 tocol names too
be00: 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 long", (char *)
be10: 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 NULL);...Tcl_Set
be20: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
be30: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
be40: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c ", "ALPN", "FAIL
be50: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
be60: 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 LL);...Tls_Free(
be70: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a (tls_free_type *
be80: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 ) statePtr);...r
be90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
bea0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f .. }.. pro
beb0: 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 tos_len += 1 + (
bec0: 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f int) len;..}.../
bed0: 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 * Build the comp
bee0: 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 lete protocol-li
bef0: 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 st */..protos =
bf00: 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c ckalloc(protos_l
bf10: 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f en);../* protoco
bf20: 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 l-lists consist
bf30: 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d of 8-bit length-
bf40: 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 prefixed, byte s
bf50: 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 trings */..for (
bf60: 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f j = 0, p = proto
bf70: 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 s; j < cnt; j++)
bf80: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 {.. char *st
bf90: 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e r = Tcl_GetStrin
bfa0: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d gFromObj(list[j]
bfb0: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 , &len);.. *p
bfc0: 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 ++ = (unsigned c
bfd0: 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d har) len;.. m
bfe0: 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 emcpy(p, str, (s
bff0: 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 ize_t) len);..
c000: 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a p += len;..}..
c010: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e ./* SSL_set_alpn
c020: 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 _protos makes a
c030: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 copy of the prot
c040: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a ocol-list */../*
c050: 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 Note: This func
c060: 74 69 6f 6e 20 72 65 76 65 72 73 65 73 20 74 68 tion reverses th
c070: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 e return value c
c080: 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 onvention */..if
c090: 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 (SSL_set_alpn_p
c0a0: 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e rotos(statePtr->
c0b0: 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f ssl, protos, pro
c0c0: 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 tos_len)) {..
c0d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
c0e0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 t(interp, "Set A
c0f0: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 LPN protocols fa
c100: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 iled: ", GET_ERR
c110: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 _REASON(), (char
c120: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
c130: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
c140: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
c150: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 "IMPORT", "ALPN"
c160: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
c170: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
c180: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 Tls_Free((tls_f
c190: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 ree_type *) stat
c1a0: 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 ePtr);.. ckfr
c1b0: 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 ee(protos);..
c1c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
c1d0: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 R;..}.../* Store
c1e0: 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 protocols list
c1f0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 */..statePtr->pr
c200: 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 otos = protos;..
c210: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
c220: 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 _len = protos_le
c230: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a n;. } else {.
c240: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
c250: 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 s = NULL;..state
c260: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 Ptr->protos_len
c270: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 = 0;. }..
c280: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 /*. * SSL Ca
c290: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a llbacks. */.
c2a0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f SSL_set_app_
c2b0: 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 data(statePtr->s
c2c0: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 sl, (void *)stat
c2d0: 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 ePtr);./* point
c2e0: 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 back to us */.
c2f0: 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 SSL_set_verify
c300: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c310: 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 verify, VerifyCa
c320: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 2f 2a 53 llback);. /*S
c330: 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 5f 64 65 SL_set_verify_de
c340: 70 74 68 28 53 53 4c 5f 73 65 74 5f 76 65 72 69 pth(SSL_set_veri
c350: 66 79 5f 64 65 70 74 68 2c 20 30 29 3b 2a 2f 0a fy_depth, 0);*/.
c360: 20 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f SSL_set_info
c370: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 _callback(stateP
c380: 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c tr->ssl, InfoCal
c390: 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 lback);.. /*
c3a0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 Callback for obs
c3b0: 65 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 erving protocol
c3c0: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e messages */.#ifn
c3d0: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 def OPENSSL_NO_S
c3e0: 53 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 SL_TRACE. /*
c3f0: 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 void SSL_CTX_set
c400: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 _msg_callback_ar
c410: 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c g(statePtr->ctx,
c420: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
c430: 72 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c r);. void SSL
c440: 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c _CTX_set_msg_cal
c450: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e lback(statePtr->
c460: 63 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c ctx, MessageCall
c470: 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 back); */. SS
c480: 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 L_set_msg_callba
c490: 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d ck_arg(statePtr-
c4a0: 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 >ssl, (void *)st
c4b0: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c atePtr);. SSL
c4c0: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 _set_msg_callbac
c4d0: 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c k(statePtr->ssl,
c4e0: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b MessageCallback
c4f0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f );.#endif.. /
c500: 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 * Create Tcl_Cha
c510: 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 nnel BIO Handler
c520: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
c530: 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 ->p_bio.= BIO_ne
c540: 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 w_tcl(statePtr,
c550: 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 BIO_NOCLOSE);.
c560: 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 statePtr->bio.
c570: 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f = BIO_new(BIO_f_
c580: 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 ssl());.. if
c590: 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 (server) {../* S
c5a0: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 erver callbacks
c5b0: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f */..SSL_CTX_set_
c5c0: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d tlsext_servernam
c5d0: 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e e_arg(statePtr->
c5e0: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ctx, (void *)sta
c5f0: 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 tePtr);..SSL_CTX
c600: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 _set_tlsext_serv
c610: 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 ername_callback(
c620: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 statePtr->ctx, S
c630: 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 NICallback);..SS
c640: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 L_CTX_set_client
c650: 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 _hello_cb(stateP
c660: 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 tr->ctx, HelloCa
c670: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
c680: 73 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 statePtr);..if (
c690: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
c6a0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
c6b0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 SSL_CTX_set_alp
c6c0: 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 n_select_cb(stat
c6d0: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 ePtr->ctx, ALPNC
c6e0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
c6f0: 29 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 )statePtr);.#ifd
c700: 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 ef USE_NPN..
c710: 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 if (tls1_2 == 0
c720: 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 && tls1_3 == 0)
c730: 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {...SSL_CTX_set_
c740: 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 next_protos_adve
c750: 72 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 rtised_cb(stateP
c760: 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c tr->ctx, NPNCall
c770: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 back, (void *)st
c780: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a atePtr);.. }.
c790: 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 #endif..}.../* E
c7a0: 6e 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 nable server to
c7b0: 73 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 send cert reques
c7c0: 74 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b t after handshak
c7d0: 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 e (TLS 1.3 only)
c7e0: 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 */../* A write
c7f0: 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 operation must t
c800: 61 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 ake place for th
c810: 65 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 e Certificate Re
c820: 71 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 quest to be..
c830: 73 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 sent to the clie
c840: 6e 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 nt, this can be
c850: 64 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f done with SSL_do
c860: 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f _handshake(). */
c870: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 ..if (request &&
c880: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 post_handshake
c890: 26 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 && tls1_3) {..
c8a0: 20 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 SSL_verify_cli
c8b0: 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 ent_post_handsha
c8c0: 6b 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ke(statePtr->ssl
c8d0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 73 );..}.../* Set s
c8e0: 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 erver mode */..s
c8f0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c tatePtr->flags |
c900: 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 = TLS_TCL_SERVER
c910: 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 ;..SSL_set_accep
c920: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 t_state(statePtr
c930: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c ->ssl);. } el
c940: 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 se {../* Client
c950: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66 callbacks */.#if
c960: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20 def USE_NPN..if
c970: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
c980: 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73 s != NULL && tls
c990: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 1_2 == 0 && tls1
c9a0: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 _3 == 0) {..
c9b0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 SSL_CTX_set_next
c9c0: 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62 _proto_select_cb
c9d0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c9e0: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 ALPNCallback, (v
c9f0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
ca00: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 ..}.#endif.../*
ca10: 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 20 Session caching
ca20: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f */..SSL_CTX_set_
ca30: 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f session_cache_mo
ca40: 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 de(statePtr->ctx
ca50: 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 , SSL_SESS_CACHE
ca60: 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45 _CLIENT | SSL_SE
ca70: 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 SS_CACHE_NO_INTE
ca80: 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53 RNAL_STORE);..SS
ca90: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e L_CTX_sess_set_n
caa0: 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e ew_cb(statePtr->
cab0: 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c ctx, SessionCall
cac0: 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 back);.../* Enab
cad0: 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61 6b le post handshak
cae0: 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e e Authentication
caf0: 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 extension. TLS
cb00: 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 1.3 only, not ht
cb10: 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65 tp/2. */..if (re
cb20: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 quest && post_ha
cb30: 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 ndshake) {..
cb40: 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e SSL_set_post_han
cb50: 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61 74 dshake_auth(stat
cb60: 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 ePtr->ssl, 1);..
cb70: 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e }.../* Set clien
cb80: 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 t mode */..SSL_s
cb90: 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 et_connect_state
cba0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
cbb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
cbc0: 65 74 20 42 49 4f 20 66 6f 72 20 72 65 61 64 20 et BIO for read
cbd0: 61 6e 64 20 77 72 69 74 65 20 6f 70 65 72 61 74 and write operat
cbe0: 69 6f 6e 73 20 6f 6e 20 53 53 4c 20 6f 62 6a 65 ions on SSL obje
cbf0: 63 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 ct */. SSL_se
cc00: 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d 3e t_bio(statePtr->
cc10: 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 ssl, statePtr->p
cc20: 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e _bio, statePtr->
cc30: 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f p_bio);. BIO_
cc40: 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72 set_ssl(statePtr
cc50: 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d ->bio, statePtr-
cc60: 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 >ssl, BIO_NOCLOS
cc70: 45 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f E);. BIO_set_
cc80: 73 73 6c 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 ssl_mode(statePt
cc90: 72 2d 3e 62 69 6f 2c 20 28 6c 6f 6e 67 29 20 21 r->bio, (long) !
cca0: 73 65 72 76 65 72 29 3b 0a 0a 20 20 20 20 2f 2a server);.. /*
ccb0: 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 . * End of S
ccc0: 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a SL Init. */.
ccd0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 dprintf("Ret
cce0: 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f urning %s", Tcl_
ccf0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
cd00: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b tatePtr->self));
cd10: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
cd20: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 lt(interp, (char
cd30: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e *) Tcl_GetChann
cd40: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
cd50: 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 >self), TCL_VOLA
cd60: 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 TILE);.. retu
cd70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
cd80: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
cd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cdc0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e -------. *. * Un
cdd0: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a importObjCmd --.
cde0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
cdf0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
ce00: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f to remove the to
ce10: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 pmost channel fi
ce20: 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 lter.. *. * Resu
ce30: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
ce40: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
ce50: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
ce60: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 s:. *.May modify
ce70: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 the behavior of
ce80: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a an IO channel..
ce90: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
cea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ced0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
cee0: 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 tic int.Unimport
cef0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
cf00: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
cf10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
cf20: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
cf30: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
cf40: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
cf50: 6e 6e 65 6c 20 63 68 61 6e 2c 20 70 61 72 65 6e nnel chan, paren
cf60: 74 3b 09 2f 2a 20 54 68 65 20 73 74 61 63 6b 65 t;./* The stacke
cf70: 64 20 61 6e 64 20 75 6e 64 65 72 6c 79 69 6e 67 d and underlying
cf80: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 20 channels */.
cf90: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 Tcl_DString upp
cfa0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
cfb0: 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e tion, upperChann
cfc0: 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 elBlocking, uppe
cfd0: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
cfe0: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f , upperChannelEO
cff0: 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 72 FChar;. int r
d000: 65 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 es = TCL_OK;.
d010: 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 (void) clientDa
d020: 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 ta;.. dprintf
d030: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
d040: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 if (objc != 2)
d050: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
d060: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
d070: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b bjv, "channel");
d080: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
d090: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
d0a0: 2a 20 56 61 6c 69 64 61 74 65 20 63 68 61 6e 6e * Validate chann
d0b0: 65 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 el name */. c
d0c0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
d0d0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c nnel(interp, Tcl
d0e0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
d0f0: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 1]), NULL);.
d100: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
d110: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
d120: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
d130: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
d140: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
d150: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
d160: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
d170: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
d180: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
d190: 68 61 6e 29 3b 0a 20 20 20 20 70 61 72 65 6e 74 han);. parent
d1a0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 = Tcl_GetStacke
d1b0: 64 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a dChannel(chan);.
d1c0: 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 69 . /* Verify i
d1d0: 73 20 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e s a stacked chan
d1e0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 nel */. if (p
d1f0: 61 72 65 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b arent == NULL) {
d200: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
d210: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 lt(interp, "bad
d220: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c channel \"", Tcl
d230: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
d240: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f chan),..."\": no
d250: 74 20 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e t a stacked chan
d260: 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e nel", (char *) N
d270: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 ULL);.. Tcl_S
d280: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
d290: 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d rp, "TLS", "UNIM
d2a0: 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 PORT", "CHANNEL"
d2b0: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
d2c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
d2d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
d2e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6c }.. /* Fl
d2f0: 75 73 68 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 ush any pending
d300: 64 61 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 data */. if (
d310: 54 63 6c 5f 4f 75 74 70 75 74 42 75 66 66 65 72 Tcl_OutputBuffer
d320: 65 64 28 63 68 61 6e 29 20 3e 20 30 20 26 26 20 ed(chan) > 0 &&
d330: 54 63 6c 5f 46 6c 75 73 68 28 63 68 61 6e 29 20 Tcl_Flush(chan)
d340: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 != TCL_OK) {..Tc
d350: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d360: 6e 74 65 72 70 2c 20 22 63 61 6e 27 74 20 66 6c nterp, "can't fl
d370: 75 73 68 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 ush channel", (c
d380: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
d390: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
d3a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 . }.. /* I
d3b0: 6e 69 74 20 73 74 6f 72 61 67 65 20 2a 2f 0a 20 nit storage */.
d3c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
d3d0: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
d3e0: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 Translation);.
d3f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
d400: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 t(&upperChannelB
d410: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 locking);. Tc
d420: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
d430: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
d440: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ar);. Tcl_DSt
d450: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
d460: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b hannelEncoding);
d470: 0a 0a 20 20 20 20 2f 2a 20 50 72 65 73 65 72 76 .. /* Preserv
d480: 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 6e 65 e current channe
d490: 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20 l config */.
d4a0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
d4b0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
d4c0: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 n, "-blocking",
d4d0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f &upperChannelBlo
d4e0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f cking);. Tcl_
d4f0: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
d500: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
d510: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 -encoding", &upp
d520: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
d530: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 g);. Tcl_GetC
d540: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
d550: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 erp, chan, "-eof
d560: 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 char", &upperCha
d570: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 nnelEOFChar);.
d580: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
d590: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
d5a0: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 han, "-translati
d5b0: 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e on", &upperChann
d5c0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
d5d0: 0a 20 20 20 20 2f 2a 20 55 6e 73 74 61 63 6b 20 . /* Unstack
d5e0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 the channel */.
d5f0: 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 if (Tcl_Unsta
d600: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 ckChannel(interp
d610: 2c 20 63 68 61 6e 29 20 21 3d 20 54 43 4c 5f 4f , chan) != TCL_O
d620: 4b 29 20 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f K) {..res = TCL_
d630: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
d640: 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 63 68 61 /* Restore cha
d650: 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 nnel config */.
d660: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
d670: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
d680: 70 61 72 65 6e 74 2c 20 22 2d 65 6e 63 6f 64 69 parent, "-encodi
d690: 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 ng", Tcl_DString
d6a0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
d6b0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 nelEncoding));.
d6c0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
d6d0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
d6e0: 70 61 72 65 6e 74 2c 20 22 2d 65 6f 66 63 68 61 parent, "-eofcha
d6f0: 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 r", Tcl_DStringV
d700: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
d710: 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 elEOFChar));.
d720: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
d730: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 70 61 ption(interp, pa
d740: 72 65 6e 74 2c 20 22 2d 74 72 61 6e 73 6c 61 74 rent, "-translat
d750: 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e ion", Tcl_DStrin
d760: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
d770: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 nnelTranslation)
d780: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
d790: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
d7a0: 72 70 2c 20 70 61 72 65 6e 74 2c 20 22 2d 62 6c rp, parent, "-bl
d7b0: 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 ocking", Tcl_DSt
d7c0: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
d7d0: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 ChannelBlocking)
d7e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e );.. /* Clean
d7f0: 2d 75 70 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 -up */. Tcl_D
d800: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 StringFree(&uppe
d810: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
d820: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ion);. Tcl_DS
d830: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
d840: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
d850: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
d860: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e gFree(&upperChan
d870: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 nelEOFChar);.
d880: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
d890: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c (&upperChannelBl
d8a0: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 72 65 74 ocking);. ret
d8b0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a urn res;.}.../*.
d8c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
d8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d900: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f -----. *. * CTX_
d910: 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 Init -- construc
d920: 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 t a SSL_CTX inst
d930: 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ance. *. * Resul
d940: 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 ts:. *.A valid S
d950: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 SL_CTX instance
d960: 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 or NULL.. *. * S
d970: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
d980: 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 constructs SSL c
d990: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a ontext (CTX). *.
d9a0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
d9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d9e0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
d9f0: 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 SSL_CTX *.CTX_I
da00: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 nit(State *state
da10: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 Ptr, int isServe
da20: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 r, int proto, ch
da30: 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 ar *keyfile, cha
da40: 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 r *certfile,.
da50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
da60: 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 key, unsigned ch
da70: 61 72 20 2a 63 65 72 74 2c 20 54 63 6c 5f 53 69 ar *cert, Tcl_Si
da80: 7a 65 20 6b 65 79 5f 6c 65 6e 2c 20 54 63 6c 5f ze key_len, Tcl_
da90: 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e 2c 20 63 Size cert_len, c
daa0: 68 61 72 20 2a 43 41 70 61 74 68 2c 0a 20 20 20 har *CApath,.
dab0: 20 63 68 61 72 20 2a 43 41 73 74 6f 72 65 2c 20 char *CAstore,
dac0: 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 char *CAfile, ch
dad0: 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 ar *ciphers, cha
dae0: 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c r *ciphersuites,
daf0: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 int level, char
db00: 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 *DHparams) {.
db10: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
db20: 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d terp = statePtr-
db30: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c >interp;. SSL
db40: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
db50: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
db60: 67 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66 g ds;. int of
db70: 66 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 f = 0, abort = 0
db80: 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 ;. int load_p
db90: 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 rivate_key;.
dba0: 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 const SSL_METHOD
dbb0: 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 *method;.. d
dbc0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
dbd0: 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 ;.. if (!prot
dbe0: 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 o) {..Tcl_Append
dbf0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
dc00: 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f no valid protoco
dc10: 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68 l selected", (ch
dc20: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
dc30: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
dc40: 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 .. /* create
dc50: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 SSL context */.#
dc60: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
dc70: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 ON_NUMBER >= 0x1
dc80: 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 0100000L || defi
dc90: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 ned(NO_SSL2) ||
dca0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
dcb0: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 NO_SSL2). if
dcc0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
dcd0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 TLS_PROTO_SSL2))
dce0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
dcf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 sult(interp, "SS
dd00: 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 L2 protocol not
dd10: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
dd20: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
dd30: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
dd40: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
dd50: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 ed(NO_SSL3) || d
dd60: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
dd70: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 O_SSL3). if (
dd80: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
dd90: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 LS_PROTO_SSL3))
dda0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
ddb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c ult(interp, "SSL
ddc0: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 3 protocol not s
ddd0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
dde0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
ddf0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
de00: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
de10: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 d(NO_TLS1) || de
de20: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
de30: 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 _TLS1). if (E
de40: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
de50: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b S_PROTO_TLS1)) {
de60: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
de70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 lt(interp, "TLS
de80: 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 1.0 protocol not
de90: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
dea0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
deb0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
dec0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
ded0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c ned(NO_TLS1_1) |
dee0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
def0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 L_NO_TLS1_1).
df00: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
df10: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
df20: 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 S1_1)) {..Tcl_Ap
df30: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
df40: 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 p, "TLS 1.1 prot
df50: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
df60: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ed", (char *) NU
df70: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
df80: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
df90: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
dfa0: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
dfb0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
dfc0: 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 1_2). if (ENA
dfd0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
dfe0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b PROTO_TLS1_2)) {
dff0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
e000: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 lt(interp, "TLS
e010: 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 1.2 protocol not
e020: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
e030: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
e040: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
e050: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
e060: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c ned(NO_TLS1_3) |
e070: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
e080: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
e090: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
e0a0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
e0b0: 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 S1_3)) {..Tcl_Ap
e0c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
e0d0: 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 p, "TLS 1.3 prot
e0e0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
e0f0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ed", (char *) NU
e100: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
e110: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
e120: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d if (proto ==
e130: 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 0) {../* Use fu
e140: 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c ll range */..SSL
e150: 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f _CTX_set_min_pro
e160: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 to_version(ctx,
e170: 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 0);..SSL_CTX_set
e180: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _max_proto_versi
e190: 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 on(ctx, 0);.
e1a0: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 }.. switch (p
e1b0: 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e roto) {.#if OPEN
e1c0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
e1d0: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c ER < 0x10100000L
e1e0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f && !defined(NO_
e1f0: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 SSL2) && !define
e200: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
e210: 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 2). case TLS_
e220: 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 PROTO_SSL2:..met
e230: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
e240: 20 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 SSLv2_server_me
e250: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 thod() : SSLv2_c
e260: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
e270: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
e280: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 if !defined(NO_S
e290: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
e2a0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
e2b0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
e2c0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 ENSSL_NO_SSL3_ME
e2d0: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 THOD). case T
e2e0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 LS_PROTO_SSL3:..
e2f0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
e300: 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 r ? SSLv3_server
e310: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 _method() : SSLv
e320: 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 3_client_method(
e330: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
e340: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
e350: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
e360: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
e370: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
e380: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
e390: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 _METHOD). cas
e3a0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
e3b0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 :..method = isSe
e3c0: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 rver ? TLSv1_ser
e3d0: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 ver_method() : T
e3e0: 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 LSv1_client_meth
e3f0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
e400: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
e410: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 d(NO_TLS1_1) &&
e420: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e430: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 _NO_TLS1_1) && !
e440: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e450: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 NO_TLS1_1_METHOD
e460: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
e470: 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 ROTO_TLS1_1:..me
e480: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
e490: 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 ? TLSv1_1_server
e4a0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 _method() : TLSv
e4b0: 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 1_1_client_metho
e4c0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
e4d0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
e4e0: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 (NO_TLS1_2) && !
e4f0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e500: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
e510: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e520: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 O_TLS1_2_METHOD)
e530: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
e540: 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 OTO_TLS1_2:..met
e550: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
e560: 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f TLSv1_2_server_
e570: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 method() : TLSv1
e580: 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 _2_client_method
e590: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
e5a0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
e5b0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
e5c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e5d0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 O_TLS1_3). ca
e5e0: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
e5f0: 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 1_3:../* Use the
e600: 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 generic method
e610: 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 and constraint r
e620: 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 ange after conte
e630: 78 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f xt is created */
e640: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
e650: 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 ver ? TLS_server
e660: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f _method() : TLS_
e670: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
e680: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
e690: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a default:../*
e6a0: 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 Negotiate highe
e6b0: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c st available SSL
e6c0: 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a /TLS version */.
e6d0: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
e6e0: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f er ? TLS_server_
e6f0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 method() : TLS_c
e700: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
e710: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
e720: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
e730: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
e740: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 ined(NO_SSL2) &&
e750: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
e760: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 L_NO_SSL2)..off
e770: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 |= (ENABLED(prot
e780: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c o, TLS_PROTO_SSL
e790: 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 2) ? 0 : SSL_O
e7a0: 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e P_NO_SSLv2);.#en
e7b0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
e7c0: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 (NO_SSL3) && !de
e7d0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e7e0: 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 _SSL3)..off |= (
e7f0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
e800: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 LS_PROTO_SSL3)
e810: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
e820: 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a _SSLv3);.#endif.
e830: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
e840: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 TLS1) && !define
e850: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
e860: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 1)..off |= (ENAB
e870: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
e880: 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 ROTO_TLS1) ? 0
e890: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
e8a0: 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 v1);.#endif.#if
e8b0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
e8c0: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
e8d0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
e8e0: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 1)..off |= (ENAB
e8f0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
e900: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 ROTO_TLS1_1) ? 0
e910: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
e920: 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 v1_1);.#endif.#i
e930: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
e940: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
e950: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
e960: 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 1_2)..off |= (EN
e970: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
e980: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f _PROTO_TLS1_2) ?
e990: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
e9a0: 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a LSv1_2);.#endif.
e9b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
e9c0: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 TLS1_3) && !defi
e9d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
e9e0: 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 LS1_3)..off |= (
e9f0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
ea00: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
ea10: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
ea20: 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 _TLSv1_3);.#endi
ea30: 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a f..break;. }.
ea40: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
ea50: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 rror();.. ctx
ea60: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d = SSL_CTX_new(m
ea70: 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 ethod);. if (
ea80: 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 20 !ctx) {..return
ea90: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
eaa0: 20 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b if (getenv(SSLK
eab0: 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 EYLOGFILE)) {..S
eac0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f SL_CTX_set_keylo
ead0: 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 g_callback(ctx,
eae0: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b KeyLogCallback);
eaf0: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 . }..#if !def
eb00: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
eb10: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
eb20: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
eb30: 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 if (proto ==
eb40: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
eb50: 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 ) {..SSL_CTX_set
eb60: 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _min_proto_versi
eb70: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 on(ctx, TLS1_3_V
eb80: 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 ERSION);..SSL_CT
eb90: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f X_set_max_proto_
eba0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 version(ctx, TLS
ebb0: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 1_3_VERSION);.
ebc0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 }.#endif..
ebd0: 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 /* Force cipher
ebe0: 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 selection order
ebf0: 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 by server */.
ec00: 20 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20 if (!isServer)
ec10: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f {..SSL_CTX_set_o
ec20: 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f ptions(ctx, SSL_
ec30: 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 OP_CIPHER_SERVER
ec40: 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 _PREFERENCE);.
ec50: 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c }..#if OPENSSL
ec60: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
ec70: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 < 0x10100000L.
ec80: 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c OpenSSL_add_al
ec90: 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 l_algorithms();
eca0: 2f 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20 /* Load ciphers
ecb0: 61 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 and digests */.#
ecc0: 65 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 endif.. SSL_C
ecd0: 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 TX_set_app_data(
ece0: 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 ctx, (void*)inte
ecf0: 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 rp);./* remember
ed00: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 the interpreter
ed10: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f */. SSL_CTX_
ed20: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c set_options(ctx,
ed30: 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a SSL_OP_ALL);./*
ed40: 20 45 6e 61 62 6c 65 20 61 6c 6c 20 53 53 4c 20 Enable all SSL
ed50: 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 bug workarounds
ed60: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
ed70: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
ed80: 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 SSL_OP_NO_COMPRE
ed90: 53 53 49 4f 4e 29 3b 09 2f 2a 20 44 69 73 61 62 SSION);./* Disab
eda0: 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 le compression e
edb0: 76 65 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 ven if supported
edc0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f */. SSL_CTX_
edd0: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c set_options(ctx,
ede0: 20 6f 66 66 29 3b 09 09 2f 2a 20 44 69 73 61 62 off);../* Disab
edf0: 6c 65 20 73 70 65 63 69 66 69 65 64 20 70 72 6f le specified pro
ee00: 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a tocol versions *
ee10: 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 20 /.. /* Allow
ee20: 77 72 69 74 65 73 20 74 6f 20 72 65 70 6f 72 74 writes to report
ee30: 20 73 75 63 63 65 73 73 20 77 68 65 6e 20 6c 65 success when le
ee40: 73 73 20 74 68 61 6e 20 61 6c 6c 20 72 65 63 6f ss than all reco
ee50: 72 64 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 rds have been wr
ee60: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 53 53 4c itten */. SSL
ee70: 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 _CTX_set_mode(ct
ee80: 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 45 4e 41 42 x, SSL_MODE_ENAB
ee90: 4c 45 5f 50 41 52 54 49 41 4c 5f 57 52 49 54 45 LE_PARTIAL_WRITE
eea0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 62 );.. /* Disab
eeb0: 6c 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 74 le attempts to t
eec0: 72 79 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 ry to process th
eed0: 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20 69 6e e next record in
eee0: 73 74 65 61 64 20 6f 66 20 72 65 74 75 72 6e 69 stead of returni
eef0: 6e 67 20 61 66 74 65 72 20 61 0a 20 20 20 20 20 ng after a.
ef00: 20 20 6e 6f 6e 2d 61 70 70 20 72 65 63 6f 72 64 non-app record
ef10: 2e 20 41 76 6f 69 64 73 20 68 61 6e 67 73 20 69 . Avoids hangs i
ef20: 6e 20 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c n blocking mode,
ef30: 20 77 68 65 6e 20 75 73 69 6e 67 20 53 53 4c 5f when using SSL_
ef40: 72 65 61 64 28 29 20 61 6e 64 20 61 0a 20 20 20 read() and a.
ef50: 20 20 20 20 6e 6f 6e 2d 61 70 70 6c 69 63 61 74 non-applicat
ef60: 69 6f 6e 20 72 65 63 6f 72 64 20 77 61 73 20 73 ion record was s
ef70: 65 6e 74 20 77 69 74 68 6f 75 74 20 61 6e 79 20 ent without any
ef80: 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 61 74 61 application data
ef90: 2e 20 2a 2f 0a 20 20 20 20 2f 2a 53 53 4c 5f 43 . */. /*SSL_C
efa0: 54 58 5f 63 6c 65 61 72 5f 6d 6f 64 65 28 63 74 TX_clear_mode(ct
efb0: 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f x, SSL_MODE_AUTO
efc0: 5f 52 45 54 52 59 29 3b 2a 2f 0a 0a 20 20 20 20 _RETRY);*/..
efd0: 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 SSL_CTX_sess_set
efe0: 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c _cache_size(ctx,
eff0: 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 128);.. /* S
f000: 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 et user defined
f010: 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 ciphers, cipher
f020: 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 suites, and secu
f030: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 rity level */.
f040: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 if ((ciphers !
f050: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f = NULL) && !SSL_
f060: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c CTX_set_cipher_l
f070: 69 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 ist(ctx, ciphers
f080: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
f090: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
f0a0: 53 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c Set ciphers fail
f0b0: 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 ed: No valid cip
f0c0: 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 hers", (char *)
f0d0: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f NULL);..SSL_CTX_
f0e0: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 free(ctx);..retu
f0f0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 rn NULL;. }.
f100: 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75 if ((ciphersu
f110: 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 ites != NULL) &&
f120: 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 !SSL_CTX_set_ci
f130: 70 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 phersuites(ctx,
f140: 63 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b ciphersuites)) {
f150: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
f160: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 lt(interp, "Set
f170: 63 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61 cipher suites fa
f180: 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 iled: No valid c
f190: 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a iphers", (char *
f1a0: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 ) NULL);..SSL_CT
f1b0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
f1c0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
f1d0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 61 75 74 .. /* set aut
f1e0: 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 6c omatic curve sel
f1f0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 ection */. SS
f200: 4c 5f 43 54 58 5f 73 65 74 5f 65 63 64 68 5f 61 L_CTX_set_ecdh_a
f210: 75 74 6f 28 63 74 78 2c 20 31 29 3b 0a 0a 20 20 uto(ctx, 1);..
f220: 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 /* Set securit
f230: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 y level */. i
f240: 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 f (level > -1 &&
f250: 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f level < 6) {../
f260: 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 * SSL_set_securi
f270: 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c ty_level */..SSL
f280: 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 _CTX_set_securit
f290: 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 y_level(ctx, lev
f2a0: 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 el);. }..
f2b0: 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c /* set some call
f2c0: 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c backs */. SSL
f2d0: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 _CTX_set_default
f2e0: 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 _passwd_cb(ctx,
f2f0: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b PasswordCallback
f300: 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 );. SSL_CTX_s
f310: 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 et_default_passw
f320: 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 d_cb_userdata(ct
f330: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 x, (void *)state
f340: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 Ptr);.. /* re
f350: 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c ad a Diffie-Hell
f360: 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 man parameters f
f370: 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 ile, or use the
f380: 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a built-in one */.
f390: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
f3a0: 6e 69 74 28 26 64 73 29 3b 0a 23 69 66 64 65 66 nit(&ds);.#ifdef
f3b0: 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 OPENSSL_NO_DH.
f3c0: 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 if (DHparams
f3d0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f != NULL) {..Tcl_
f3e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f3f0: 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74 erp, "DH paramet
f400: 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 er support not a
f410: 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 vailable", (char
f420: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f *) NULL);..SSL_
f430: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
f440: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
f450: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 }.#else. {..
f460: 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 DH* dh;..if (DHp
f470: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b arams != NULL) {
f480: 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a .. BIO *bio;.
f490: 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f .. bio = BIO_
f4a0: 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 new_file(F2N(DHp
f4b0: 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 arams, &ds), "r"
f4c0: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f );.. if (!bio
f4d0: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
f4e0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 gFree(&ds);...Tc
f4f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
f500: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f nterp, "Could no
f510: 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 t find DH parame
f520: 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 ters file", (cha
f530: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
f540: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
f550: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
f560: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 . }... dh
f570: 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 = PEM_read_bio_D
f580: 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c Hparams(bio, NUL
f590: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a L, NULL, NULL);.
f5a0: 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 . BIO_free(bi
f5b0: 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 o);.. Tcl_DSt
f5c0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
f5d0: 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 if (!dh) {..
f5e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
f5f0: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 t(interp, "Could
f600: 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 not read DH par
f610: 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c ameters from fil
f620: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c e", (char *) NUL
f630: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
f640: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
f650: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 n NULL;.. }..
f660: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
f670: 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b tmp_dh(ctx, dh);
f680: 0a 09 20 20 20 20 44 48 5f 66 72 65 65 28 64 68 .. DH_free(dh
f690: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 );...} else {..
f6a0: 20 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b /* Use well k
f6b0: 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 74 65 nown DH paramete
f6c0: 72 73 20 74 68 61 74 20 68 61 76 65 20 62 75 69 rs that have bui
f6d0: 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 69 6e lt-in support in
f6e0: 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 OpenSSL */..
f6f0: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 if (!SSL_CTX_se
f700: 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 t_dh_auto(ctx, 1
f710: 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e )) {...Tcl_Appen
f720: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
f730: 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c "Could not enabl
f740: 65 20 73 65 74 20 44 48 20 61 75 74 6f 3a 20 22 e set DH auto: "
f750: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
f760: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
f770: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
f780: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
f790: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 n NULL;.. }..
f7a0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a }. }.#endif..
f7b0: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 /* set our c
f7c0: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 ertificate */.
f7d0: 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b load_private_k
f7e0: 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 ey = 0;. if (
f7f0: 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c certfile != NULL
f800: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 ) {..load_privat
f810: 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 69 66 20 e_key = 1;...if
f820: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 (SSL_CTX_use_cer
f830: 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 tificate_file(ct
f840: 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c x, F2N(certfile,
f850: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 &ds), SSL_FILET
f860: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b YPE_PEM) <= 0) {
f870: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
f880: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 gFree(&ds);..
f890: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
f8a0: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
f8b0: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 e to set certifi
f8c0: 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 cate file ", cer
f8d0: 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 tfile, ": ",...G
f8e0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
f8f0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
f900: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 .. SSL_CTX_fr
f910: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 ee(ctx);.. re
f920: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 turn NULL;..}..T
f930: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
f940: 64 73 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 ds);.. } else
f950: 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c if (cert != NUL
f960: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 L) {..load_priva
f970: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 te_key = 1;..if
f980: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 (SSL_CTX_use_cer
f990: 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 tificate_ASN1(ct
f9a0: 78 2c 20 28 69 6e 74 29 20 63 65 72 74 5f 6c 65 x, (int) cert_le
f9b0: 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b n, cert) <= 0) {
f9c0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
f9d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
f9e0: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 unable to set ce
f9f0: 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 rtificate: ",...
fa00: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
fa10: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
fa20: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
fa30: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
fa40: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 eturn NULL;..}.
fa50: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 } else {..cer
fa60: 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 tfile = (char*)X
fa70: 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 509_get_default_
fa80: 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 cert_file();...i
fa90: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
faa0: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 ertificate_file(
fab0: 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 ctx, certfile, S
fac0: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 SL_FILETYPE_PEM)
fad0: 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 <= 0) {.#if 0..
fae0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
faf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e sult(interp, "un
fb00: 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 able to use defa
fb10: 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20 ult certificate
fb20: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 file ", certfile
fb30: 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 , ": ",...GET_ER
fb40: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
fb50: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
fb60: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
fb70: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
fb80: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a NULL;.#endif..}.
fb90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 }.. /* se
fba0: 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 t our private ke
fbb0: 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 y */. if (loa
fbc0: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b d_private_key) {
fbd0: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d ..if (keyfile ==
fbe0: 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 NULL && key ==
fbf0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 NULL) {.. key
fc00: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b file = certfile;
fc10: 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c ..}...if (keyfil
fc20: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 e != NULL) {..
fc30: 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 /* get the pri
fc40: 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 vate key associa
fc50: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 ted with this ce
fc60: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 rtificate */..
fc70: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d if (keyfile ==
fc80: 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 NULL) {...keyfi
fc90: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 le = certfile;..
fca0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 }... if (
fcb0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 SSL_CTX_use_Priv
fcc0: 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c ateKey_file(ctx,
fcd0: 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 F2N(keyfile, &d
fce0: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 s), SSL_FILETYPE
fcf0: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 _PEM) <= 0) {...
fd00: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
fd10: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 &ds);.../* flush
fd20: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 the passphrase
fd30: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c which might be l
fd40: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c eft in the resul
fd50: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 t */...Tcl_SetRe
fd60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c sult(interp, NUL
fd70: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a L, TCL_STATIC);.
fd80: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
fd90: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 lt(interp, "unab
fda0: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 le to set public
fdb0: 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 key file ", key
fdc0: 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 20 20 20 file, " ",...
fdd0: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
fde0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
fdf0: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 );...SSL_CTX_fre
fe00: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e e(ctx);...return
fe10: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 NULL;.. }..
fe20: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
fe30: 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 ee(&ds);...} els
fe40: 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c e if (key != NUL
fe50: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 L) {.. if (SS
fe60: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 L_CTX_use_Privat
fe70: 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b eKey_ASN1(EVP_PK
fe80: 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 EY_RSA, ctx, key
fe90: 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e 29 , (int) key_len)
fea0: 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66 6c <= 0) {.../* fl
feb0: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 ush the passphra
fec0: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 se which might b
fed0: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 e left in the re
fee0: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 sult */...Tcl_Se
fef0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
ff00: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 NULL, TCL_STATIC
ff10: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 );...Tcl_AppendR
ff20: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
ff30: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 nable to set pub
ff40: 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 45 54 5f lic key: ", GET_
ff50: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
ff60: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
ff70: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
ff80: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
ff90: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 ;.. }..}../*
ffa0: 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 Now we know that
ffb0: 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 a key and cert
ffc0: 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 have been set ag
ffd0: 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 ainst.. * the SS
ffe0: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 L context */..if
fff0: 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b (!SSL_CTX_check
10000 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 _private_key(ctx
10010 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
10020 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
10030 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 p, "private key
10040 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 does not match t
10050 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 70 he certificate p
10060 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 ublic key",....
10070 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (char *) NUL
10080 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
10090 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
100a0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d return NULL;..}
100b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
100c0 65 74 20 74 6f 20 75 73 65 20 74 68 65 20 64 65 et to use the de
100d0 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61 fault location a
100e0 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 65 72 74 nd file for Cert
100f0 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74 ificate Authorit
10100 79 20 28 43 41 29 20 63 65 72 74 69 66 69 63 61 y (CA) certifica
10110 74 65 73 2e 0a 20 20 20 20 20 2a 20 54 68 65 20 tes.. * The
10120 64 65 66 61 75 6c 74 20 43 41 20 63 65 72 74 69 default CA certi
10130 66 69 63 61 74 65 73 20 64 69 72 65 63 74 6f 72 ficates director
10140 79 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72 74 y is called cert
10150 73 20 69 6e 20 74 68 65 20 64 65 66 61 75 6c 74 s in the default
10160 20 4f 70 65 6e 53 53 4c 0a 20 20 20 20 20 2a 20 OpenSSL. *
10170 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20 63 6f directory. It co
10180 6e 74 61 69 6e 73 20 74 68 65 20 43 41 20 63 65 ntains the CA ce
10190 72 74 69 66 69 63 61 74 65 73 20 69 6e 20 50 45 rtificates in PE
101a0 4d 20 66 6f 72 6d 61 74 2c 20 77 69 74 68 20 6f M format, with o
101b0 6e 65 20 63 65 72 74 69 66 69 63 61 74 65 20 70 ne certificate p
101c0 65 72 0a 20 20 20 20 20 2a 20 66 69 6c 65 2e 20 er. * file.
101d0 54 68 65 20 76 65 72 69 66 79 20 70 61 74 68 20 The verify path
101e0 61 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62 65 and store can be
101f0 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 overridden by t
10200 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 he SSL_CERT_DIR
10210 65 6e 76 20 76 61 72 2e 20 54 68 65 0a 20 20 20 env var. The.
10220 20 20 2a 20 64 65 66 61 75 6c 74 20 43 41 20 63 * default CA c
10230 65 72 74 69 66 69 63 61 74 65 73 20 66 69 6c 65 ertificates file
10240 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72 74 2e is called cert.
10250 70 65 6d 20 69 6e 20 74 68 65 20 64 65 66 61 75 pem in the defau
10260 6c 74 20 4f 70 65 6e 53 53 4c 20 64 69 72 65 63 lt OpenSSL direc
10270 74 6f 72 79 2e 0a 20 20 20 20 20 2a 20 54 68 65 tory.. * The
10280 20 76 65 72 69 66 79 20 66 69 6c 65 20 63 61 6e verify file can
10290 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 be overridden b
102a0 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 y the SSL_CERT_F
102b0 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a ILE env var. */.
102c0 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 if (!SSL_CTX
102d0 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 _set_default_ver
102e0 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 ify_paths(ctx))
102f0 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 {..abort++;.
10300 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 }.. /* Overri
10310 64 65 73 20 66 6f 72 20 74 68 65 20 43 41 20 76 des for the CA v
10320 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 66 erify path and f
10330 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 ile */. {.#if
10340 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
10350 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
10360 30 30 30 30 4c 0a 09 69 66 20 28 43 41 70 61 74 0000L..if (CApat
10370 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 h != NULL || CAf
10380 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ile != NULL) {..
10390 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
103a0 64 73 31 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 ds1;.. Tcl_DS
103b0 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b tringInit(&ds1);
103c0 0a 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f ... if (!SSL_
103d0 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f CTX_load_verify_
103e0 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 locations(ctx, F
103f0 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 2N(CAfile, &ds),
10400 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73 F2N(CApath, &ds
10410 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 1))) {...abort++
10420 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
10430 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c .. }.. Tcl
10440 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
10450 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 );.. Tcl_DStr
10460 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 0a ingFree(&ds1);..
10470 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 . /* Set list
10480 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20 of CAs to send
10490 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 to client when r
104a0 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65 equesting a clie
104b0 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a nt certificate *
104c0 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 73 3a /.. /* https:
104d0 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 //sourceforge.ne
104e0 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f t/p/tls/bugs/57/
104f0 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 58 3a */.. /* XXX:
10500 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 TODO: Let the us
10510 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 er supply values
10520 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 here instead of
10530 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 something that
10540 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 exists on the fi
10550 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 20 20 lesystem */..
10560 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e STACK_OF(X509_N
10570 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 AME) *certNames
10580 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e = SSL_load_clien
10590 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 t_CA_file(F2N(CA
105a0 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 file, &ds));..
105b0 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 if (certNames
105c0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c != NULL) {...SSL
105d0 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
105e0 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 CA_list(ctx, cer
105f0 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a tNames);.. }.
10600 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
10610 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 23 Free(&ds);..}..#
10620 65 6c 73 65 0a 09 2f 2a 20 53 65 74 20 64 69 72 else../* Set dir
10630 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e ectory containin
10640 67 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65 g CA certificate
10650 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d 61 74 2e s in PEM format.
10660 20 2a 2f 0a 09 69 66 20 28 43 41 70 61 74 68 20 */..if (CApath
10670 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
10680 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 if (!SSL_CTX_loa
10690 64 5f 76 65 72 69 66 79 5f 64 69 72 28 63 74 78 d_verify_dir(ctx
106a0 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 , F2N(CApath, &d
106b0 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b s))) {...abort++
106c0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 ;.. }.. Tc
106d0 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
106e0 73 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 s);..}.../* Set
106f0 55 52 49 20 66 6f 72 20 74 6f 20 61 20 73 74 6f URI for to a sto
10700 72 65 2c 20 77 68 69 63 68 20 6d 61 79 20 62 65 re, which may be
10710 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e 74 61 69 a single contai
10720 6e 65 72 20 6f 72 20 61 20 63 61 74 61 6c 6f 67 ner or a catalog
10730 20 6f 66 20 63 6f 6e 74 61 69 6e 65 72 73 2e 20 of containers.
10740 2a 2f 0a 09 69 66 20 28 43 41 73 74 6f 72 65 20 */..if (CAstore
10750 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
10760 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 if (!SSL_CTX_loa
10770 64 5f 76 65 72 69 66 79 5f 73 74 6f 72 65 28 63 d_verify_store(c
10780 74 78 2c 20 46 32 4e 28 43 41 73 74 6f 72 65 2c tx, F2N(CAstore,
10790 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 &ds))) {...abor
107a0 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 t++;.. }..
107b0 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
107c0 28 26 64 73 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 (&ds);..}.../* S
107d0 65 74 20 66 69 6c 65 20 6f 66 20 43 41 20 63 65 et file of CA ce
107e0 72 74 69 66 69 63 61 74 65 73 20 69 6e 20 50 45 rtificates in PE
107f0 4d 20 66 6f 72 6d 61 74 2e 20 20 2a 2f 0a 09 69 M format. */..i
10800 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c f (CAfile != NUL
10810 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 L) {.. if (!S
10820 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 SL_CTX_load_veri
10830 66 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e fy_file(ctx, F2N
10840 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20 (CAfile, &ds)))
10850 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 {...abort++;..
10860 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
10870 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a ringFree(&ds);..
10880 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 . /* Set list
10890 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20 of CAs to send
108a0 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 to client when r
108b0 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65 equesting a clie
108c0 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a nt certificate *
108d0 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 /.. STACK_OF(
108e0 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 X509_NAME) *cert
108f0 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 Names = SSL_load
10900 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 _client_CA_file(
10910 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 F2N(CAfile, &ds)
10920 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 );.. if (cert
10930 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b Names != NULL) {
10940 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 ...SSL_CTX_set_c
10950 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 lient_CA_list(ct
10960 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 x, certNames);..
10970 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 }.. Tcl_D
10980 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
10990 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d ..}.#endif. }
109a0 0a 0a 20 20 20 20 69 66 20 28 61 62 6f 72 74 20 .. if (abort
109b0 3e 20 30 29 20 7b 0a 09 2f 2a 20 72 65 74 75 72 > 0) {../* retur
109c0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 7d n error */. }
109d0 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b . return ctx;
109e0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
109f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
10a30 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 . * StatusObjCmd
10a40 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 -- return certi
10a50 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 ficate for conne
10a60 63 74 65 64 20 70 65 65 72 20 69 6e 66 6f 2e 0a cted peer info..
10a70 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
10a80 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
10a90 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
10aa0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
10ab0 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
10ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
10b00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 */.static int.St
10b10 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e atusObjCmd(Clien
10b20 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
10b30 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
10b40 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
10b50 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
10b60 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 bjv[]) {. Sta
10b70 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 te *statePtr;.
10b80 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 X509 *peer;.
10b90 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
10ba0 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e r;. Tcl_Chann
10bb0 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 el chan;. cha
10bc0 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 r *channelName,
10bd0 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e *ciphers;. in
10be0 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 t mode;. cons
10bf0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
10c00 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 *proto;. unsi
10c10 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 gned int len;.
10c20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a int nid, res;.
10c30 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e (void) clien
10c40 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 tData;.. dpri
10c50 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
10c60 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
10c70 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 || objc > 3 ||
10c80 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 73 (objc == 3 && !s
10c90 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 trcmp(Tcl_GetStr
10ca0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d ing(objv[1]), "-
10cb0 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c local"))) {..Tcl
10cc0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
10cd0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
10ce0 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c ?-local? channel
10cf0 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
10d00 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
10d10 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c /* Get channel
10d20 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e Id */. chann
10d30 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 elName = Tcl_Get
10d40 53 74 72 69 6e 67 28 6f 62 6a 76 5b 28 6f 62 6a String(objv[(obj
10d50 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d c == 2 ? 1 : 2)]
10d60 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 );. chan = Tc
10d70 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
10d80 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 erp, channelName
10d90 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 , &mode);. if
10da0 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
10db0 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
10dc0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
10dd0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
10de0 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
10df0 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
10e00 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a most channel */.
10e10 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
10e20 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
10e30 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f n);. if (Tcl_
10e40 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
10e50 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
10e60 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 nelType()) {..Tc
10e70 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
10e80 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
10e90 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
10ea0 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
10eb0 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
10ec0 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 TLS channel", (c
10ed0 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 har *) NULL);..T
10ee0 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
10ef0 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
10f00 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 STATUS", "CHANNE
10f10 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 L", "INVALID", (
10f20 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
10f30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
10f40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 ;. }. stat
10f50 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
10f60 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 Tcl_GetChannelI
10f70 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e nstanceData(chan
10f80 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 );.. /* Get c
10f90 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 70 ertificate for p
10fa0 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 eer or self */.
10fb0 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 if (objc == 2
10fc0 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f ) {..peer = SSL_
10fd0 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 get_peer_certifi
10fe0 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 cate(statePtr->s
10ff0 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 sl);. } else
11000 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 {..peer = SSL_ge
11010 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 t_certificate(st
11020 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
11030 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 }. /* Get X
11040 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 509 certificate
11050 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 info */. if (
11060 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 peer) {..objPtr
11070 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a = Tls_NewX509Obj
11080 28 69 6e 74 65 72 70 2c 20 70 65 65 72 2c 20 31 (interp, peer, 1
11090 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 );..if (objc ==
110a0 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 2) {.. X509_f
110b0 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20 ree(peer);..
110c0 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a peer = NULL;..}.
110d0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 } else {..ob
110e0 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
110f0 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
11100 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 }.. /* Pe
11110 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c er name */. L
11120 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11130 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 65 72 p, objPtr, "peer
11140 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f name", SSL_get0_
11150 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 peername(statePt
11160 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 r->ssl), -1);.
11170 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e LAPPEND_INT(in
11180 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
11190 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63 bits", SSL_get_c
111a0 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 ipher_bits(state
111b0 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 Ptr->ssl, NULL))
111c0 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d ;.. ciphers =
111d0 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f (char*)SSL_get_
111e0 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d cipher(statePtr-
111f0 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45 >ssl);. LAPPE
11200 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11210 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c bjPtr, "cipher",
11220 20 63 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a ciphers, -1);..
11230 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 /* Verify th
11240 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61 e X509 certifica
11250 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 79 20 te presented by
11260 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 the peer */.
11270 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11280 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 rp, objPtr, "ver
11290 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 35 30 ifyResult",..X50
112a0 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 9_verify_cert_er
112b0 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 ror_string(SSL_g
112c0 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 et_verify_result
112d0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 (statePtr->ssl))
112e0 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 , -1);.. /* V
112f0 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 erify mode */.
11300 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 mode = SSL_get
11310 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 _verify_mode(sta
11320 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
11330 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f if (mode & SSL_
11340 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 VERIFY_NONE) {..
11350 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11360 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 rp, objPtr, "ver
11370 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 ifyMode", "none"
11380 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 , -1);. } els
11390 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 e {..Tcl_Obj *li
113a0 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e stObjPtr = Tcl_N
113b0 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
113c0 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 L);..if (mode &
113d0 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 29 SSL_VERIFY_PEER)
113e0 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
113f0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
11400 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a (interp, listObj
11410 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
11420 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 ngObj("peer", -1
11430 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 ));..}..if (mode
11440 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 & SSL_VERIFY_FA
11450 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 IL_IF_NO_PEER_CE
11460 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c RT) {.. Tcl_L
11470 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
11480 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 ent(interp, list
11490 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ObjPtr, Tcl_NewS
114a0 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 tringObj("fail i
114b0 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c f no peer cert",
114c0 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d -1));..}..if (m
114d0 6f 64 65 20 26 20 53 53 4c 5f 56 45 52 49 46 59 ode & SSL_VERIFY
114e0 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a _CLIENT_ONCE) {.
114f0 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
11500 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
11510 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 terp, listObjPtr
11520 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
11530 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 bj("client once"
11540 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
11550 6d 6f 64 65 20 26 20 53 53 4c 5f 56 45 52 49 46 mode & SSL_VERIF
11560 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 Y_POST_HANDSHAKE
11570 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
11580 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
11590 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 t(interp, listOb
115a0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
115b0 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e ingObj("post han
115c0 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 dshake", -1));..
115d0 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 }..LAPPEND_OBJ(i
115e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
115f0 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 verifyMode", lis
11600 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a tObjPtr). }..
11610 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f /* Verify mo
11620 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 de depth */.
11630 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
11640 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 rp, objPtr, "ver
11650 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 ifyDepth", SSL_g
11660 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 et_verify_depth(
11670 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b statePtr->ssl));
11680 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 .. /* Report
11690 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f the selected pro
116a0 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c tocol as a resul
116b0 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 t of the negotia
116c0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f tion */. SSL_
116d0 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 get0_alpn_select
116e0 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ed(statePtr->ssl
116f0 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b , &proto, &len);
11700 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
11710 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11720 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a "alpn", (char *
11730 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a )proto, (Tcl_Siz
11740 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 e) len);. LAP
11750 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11760 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 objPtr, "protoc
11770 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 ol", SSL_get_ver
11780 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 sion(statePtr->s
11790 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f sl), -1);.. /
117a0 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d * Valid for non-
117b0 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e RSA signature an
117c0 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 d TLS 1.3 */.
117d0 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 if (objc == 2)
117e0 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 {..res = SSL_get
117f0 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f _peer_signature_
11800 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
11810 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 l, &nid);. }
11820 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 else {..res = SS
11830 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f L_get_signature_
11840 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
11850 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a l, &nid);. }.
11860 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e if (!res) {n
11870 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 id = 0;}. LAP
11880 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11890 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 objPtr, "signat
118a0 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d ureHashAlgorithm
118b0 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 ", OBJ_nid2ln(ni
118c0 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a d), -1);.. /*
118d0 20 41 64 64 65 64 20 69 6e 20 4f 70 65 6e 53 53 Added in OpenSS
118e0 4c 20 31 2e 31 2e 31 61 20 2a 2f 0a 23 69 66 20 L 1.1.1a */.#if
118f0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
11900 4e 55 4d 42 45 52 20 3e 20 30 78 31 30 31 30 31 NUMBER > 0x10101
11910 30 30 30 4c 0a 20 20 20 20 69 66 20 28 6f 62 6a 000L. if (obj
11920 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d c == 2) {..res =
11930 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 SSL_get_peer_si
11940 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 gnature_type_nid
11950 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
11960 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 &nid);. } els
11970 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 e {..res = SSL_g
11980 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 et_signature_typ
11990 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
119a0 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 ssl, &nid);.
119b0 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 }. if (!res)
119c0 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c {nid = 0;}. L
119d0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
119e0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e p, objPtr, "sign
119f0 61 74 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f atureType", OBJ_
11a00 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 nid2ln(nid), -1)
11a10 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 ;.#endif.. Tc
11a20 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
11a30 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
11a40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
11a50 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
11a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
11aa0 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e *. * Connection
11ab0 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 InfoObjCmd -- re
11ac0 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 turn connection
11ad0 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 info from OpenSS
11ae0 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 L.. *. * Results
11af0 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 :. *.A list of c
11b00 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 onnection info.
11b10 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
11b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b50 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
11b60 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 atic int Connect
11b70 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c ionInfoObjCmd(Cl
11b80 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
11b90 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
11ba0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
11bb0 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
11bc0 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
11bd0 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
11be0 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 ;../* The channe
11bf0 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
11c00 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 on */. State
11c10 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 *statePtr;../* c
11c20 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 lient state for
11c30 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 ssl socket */.
11c40 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
11c50 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 r, *listPtr;.
11c60 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b const SSL *ssl;
11c70 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 . const SSL_C
11c80 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 IPHER *cipher;.
11c90 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 const SSL_SES
11ca0 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 SION *session;.
11cb0 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 const EVP_MD
11cc0 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 *md;. (void)
11cd0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
11ce0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
11cf0 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
11d00 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
11d10 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
11d20 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
11d30 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
11d40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
11d50 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 }.. chan = Tc
11d60 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
11d70 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 erp, Tcl_GetStri
11d80 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c ng(objv[1]), NUL
11d90 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e L);. if (chan
11da0 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
11db0 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
11dc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
11dd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 }.. /* Make
11de0 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
11df0 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
11e00 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
11e10 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
11e20 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 hannel(chan);.
11e30 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 if (Tcl_GetCha
11e40 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 nnelType(chan) !
11e50 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 = Tls_ChannelTyp
11e60 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 e()) {..Tcl_Appe
11e70 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
11e80 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
11e90 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
11ea0 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 lName(chan),..
11eb0 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 "\": not a TLS
11ec0 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 channel", (char
11ed0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f *) NULL);..Tcl_
11ee0 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
11ef0 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e erp, "TLS", "CON
11f00 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e NECTION", "CHANN
11f10 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 EL", "INVALID",
11f20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
11f30 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
11f40 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 R;. }.. ob
11f50 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
11f60 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
11f70 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 . /* Connecti
11f80 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 on info */. s
11f90 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
11fa0 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *)Tcl_GetChanne
11fb0 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
11fc0 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 an);. ssl = s
11fd0 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 tatePtr->ssl;.
11fe0 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c if (ssl != NUL
11ff0 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 L) {..const unsi
12000 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f gned char *proto
12010 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 ;..unsigned int
12020 75 6c 65 6e 3b 0a 0a 09 2f 2a 20 49 6e 69 74 69 ulen;.../* Initi
12030 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6e 69 73 68 alization finish
12040 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 ed */..LAPPEND_B
12050 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
12060 74 72 2c 20 22 69 6e 69 74 5f 66 69 6e 69 73 68 tr, "init_finish
12070 65 64 22 2c 20 53 53 4c 5f 69 73 5f 69 6e 69 74 ed", SSL_is_init
12080 5f 66 69 6e 69 73 68 65 64 28 73 73 6c 29 29 3b _finished(ssl));
12090 0a 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e .../* connection
120a0 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 state */..LAPPE
120b0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
120c0 62 6a 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20 bjPtr, "state",
120d0 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 SSL_state_string
120e0 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b _long(ssl), -1);
120f0 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 .../* Get SNI re
12100 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20 6e quested server n
12110 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ame */..LAPPEND_
12120 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12130 74 72 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22 tr, "servername"
12140 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 , SSL_get_server
12150 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 name(ssl, TLSEXT
12160 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e _NAMETYPE_host_n
12170 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 ame), -1);.../*
12180 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 Report the selec
12190 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 ted protocol as
121a0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 a result of the
121b0 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 negotiation */..
121c0 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 SSL_get0_alpn_se
121d0 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d lected(statePtr-
121e0 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 >ssl, &proto, &u
121f0 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 len);..LAPPEND_S
12200 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12210 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 r, "alpn", (char
12220 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 *)proto, (Tcl_S
12230 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a ize) ulen);.../*
12240 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f Get protocol */
12250 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
12260 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 terp, objPtr, "p
12270 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 rotocol", SSL_ge
12280 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 t_version(ssl),
12290 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f -1);.../* Renego
122a0 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 tiation allowed
122b0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
122c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
122d0 20 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f "renegotiation_
122e0 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 allowed", SSL_ge
122f0 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 t_secure_renegot
12300 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 28 iation_support((
12310 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b 0a 0a 09 SSL *) ssl));...
12320 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 20 /* Get security
12330 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e level */..LAPPEN
12340 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
12350 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74 79 5f jPtr, "security_
12360 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f level", SSL_get_
12370 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 security_level(s
12380 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 sl));.../* Sessi
12390 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 on info */..LAPP
123a0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
123b0 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
123c0 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 n_reused", SSL_s
123d0 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 ession_reused(ss
123e0 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 l));.../* Is ser
123f0 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 ver info */..LAP
12400 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 PEND_BOOL(interp
12410 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 , objPtr, "is_se
12420 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 rver", SSL_is_se
12430 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a rver(ssl));.../*
12440 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 Is DTLS */..LAP
12450 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 PEND_BOOL(interp
12460 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 , objPtr, "is_dt
12470 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 ls", SSL_is_dtls
12480 28 73 73 6c 29 29 3b 0a 0a 23 69 66 20 4f 50 45 (ssl));..#if OPE
12490 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
124a0 42 45 52 20 3e 3d 20 30 78 33 30 32 30 30 30 30 BER >= 0x3020000
124b0 30 4c 0a 09 2f 2a 20 49 73 20 51 55 49 43 20 2a 0L../* Is QUIC *
124c0 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
124d0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
124e0 22 69 73 5f 71 75 69 63 22 2c 20 53 53 4c 5f 69 "is_quic", SSL_i
124f0 73 5f 71 75 69 63 28 73 73 6c 29 29 3b 0a 0a 09 s_quic(ssl));...
12500 2f 2a 20 49 73 20 54 4c 53 20 2a 2f 0a 09 4c 41 /* Is TLS */..LA
12510 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
12520 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 74 p, objPtr, "is_t
12530 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 74 6c 73 28 ls", SSL_is_tls(
12540 73 73 6c 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 ssl));.#endif...
12550 2f 2a 20 44 41 4e 45 20 54 4c 53 20 61 75 74 68 /* DANE TLS auth
12560 65 6e 74 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 4c entication */..L
12570 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
12580 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 61 6e rp, objPtr, "dan
12590 65 5f 61 75 74 68 22 2c 20 53 53 4c 5f 67 65 74 e_auth", SSL_get
125a0 30 5f 64 61 6e 65 28 28 53 53 4c 20 2a 29 73 73 0_dane((SSL *)ss
125b0 6c 29 20 21 3d 20 4e 55 4c 4c 29 3b 0a 0a 09 2f l) != NULL);.../
125c0 2a 20 57 61 69 74 69 6e 67 20 66 6f 72 20 61 73 * Waiting for as
125d0 79 6e 63 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ync */..LAPPEND_
125e0 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
125f0 50 74 72 2c 20 22 77 61 69 74 69 6e 67 5f 66 6f Ptr, "waiting_fo
12600 72 5f 61 73 79 6e 63 22 2c 20 53 53 4c 5f 77 61 r_async", SSL_wa
12610 69 74 69 6e 67 5f 66 6f 72 5f 61 73 79 6e 63 28 iting_for_async(
12620 28 53 53 4c 20 2a 29 73 73 6c 29 29 3b 0a 0a 09 (SSL *)ssl));...
12630 2f 2a 20 54 69 6d 65 2d 6f 75 74 20 2a 2f 0a 09 /* Time-out */..
12640 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 LAPPEND_LONG(int
12650 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 erp, objPtr, "ti
12660 6d 65 2d 6f 75 74 22 2c 20 53 53 4c 5f 67 65 74 me-out", SSL_get
12670 5f 64 65 66 61 75 6c 74 5f 74 69 6d 65 6f 75 74 _default_timeout
12680 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 (ssl));.../* Is
12690 43 65 72 74 69 66 69 63 61 74 65 20 54 72 61 6e Certificate Tran
126a0 73 70 61 72 65 6e 63 79 20 76 61 6c 69 64 61 74 sparency validat
126b0 69 6f 6e 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 09 ion enabled */..
126c0 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
126d0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 74 erp, objPtr, "ct
126e0 5f 65 6e 61 62 6c 65 64 22 2c 20 53 53 4c 5f 63 _enabled", SSL_c
126f0 74 5f 69 73 5f 65 6e 61 62 6c 65 64 28 73 73 6c t_is_enabled(ssl
12700 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ));. }.. /
12710 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f * Cipher info */
12720 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 . cipher = SS
12730 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 L_get_current_ci
12740 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 pher(ssl);. i
12750 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c f (cipher != NUL
12760 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 L) {..char buf[B
12770 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 UFSIZ] = {0};..i
12780 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 nt bits, alg_bit
12790 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e s;.../* Cipher n
127a0 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ame */..LAPPEND_
127b0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
127c0 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53 tr, "cipher", SS
127d0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d L_CIPHER_get_nam
127e0 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a e(cipher), -1);.
127f0 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 ../* RFC name of
12800 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 cipher */..LAPP
12810 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
12820 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72 objPtr, "standar
12830 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 d_name", SSL_CIP
12840 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d HER_standard_nam
12850 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a e(cipher), -1);.
12860 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d ../* OpenSSL nam
12870 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 e of cipher */..
12880 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12890 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 rp, objPtr, "ope
128a0 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e nssl_name", OPEN
128b0 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 SSL_cipher_name(
128c0 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 SSL_CIPHER_stand
128d0 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 ard_name(cipher)
128e0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d ), -1);.../* num
128f0 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 69 ber of secret bi
12900 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 68 ts used for ciph
12910 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 er */..bits = SS
12920 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 L_CIPHER_get_bit
12930 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 s(cipher, &alg_b
12940 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 its);..LAPPEND_I
12950 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
12960 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 22 r, "secret_bits"
12970 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e , bits);..LAPPEN
12980 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
12990 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d jPtr, "algorithm
129a0 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 _bits", alg_bits
129b0 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 );../* alg_bits
129c0 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 is actual key se
129d0 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 cret bits. If us
129e0 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 e bits and secre
129f0 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 t (algorithm) bi
12a00 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 ts differ,.. t
12a10 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 he rest of the b
12a20 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 its are fixed, i
12a30 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 .e. for limited
12a40 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 export ciphers (
12a50 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 bits < 56) */...
12a60 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 69 /* Indicates whi
12a70 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f ch SSL/TLS proto
12a80 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73 col version firs
12a90 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 69 t defined the ci
12aa0 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 pher */..LAPPEND
12ab0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12ac0 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f Ptr, "min_versio
12ad0 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 n", SSL_CIPHER_g
12ae0 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 et_version(ciphe
12af0 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 r), -1);.../* Ci
12b00 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 pher NID */..LAP
12b10 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
12b20 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 objPtr, "cipher
12b30 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 NID", (char *)OB
12b40 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 J_nid2ln(SSL_CIP
12b50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e HER_get_cipher_n
12b60 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 id(cipher)), -1)
12b70 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
12b80 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12b90 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61 digestNID", (cha
12ba0 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 r *)OBJ_nid2ln(S
12bb0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69 SL_CIPHER_get_di
12bc0 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29 gest_nid(cipher)
12bd0 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ), -1);..LAPPEND
12be0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12bf0 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 Ptr, "keyExchang
12c00 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f eNID", (char *)O
12c10 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
12c20 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 PHER_get_kx_nid(
12c30 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 cipher)), -1);..
12c40 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12c50 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 rp, objPtr, "aut
12c60 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c henticationNID",
12c70 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 (char *)OBJ_nid
12c80 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 2ln(SSL_CIPHER_g
12c90 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68 et_auth_nid(ciph
12ca0 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 er)), -1);.../*
12cb0 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 message authenti
12cc0 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 cation code - Ci
12cd0 70 68 65 72 20 69 73 20 41 45 41 44 20 28 65 2e pher is AEAD (e.
12ce0 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61 g. GCM or ChaCha
12cf0 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 20/Poly1305) or
12d00 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 not */../* Authe
12d10 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 74 nticated Encrypt
12d20 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61 ion with associa
12d30 74 65 64 20 64 61 74 61 20 28 41 45 41 44 29 20 ted data (AEAD)
12d40 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e check */..LAPPEN
12d50 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
12d60 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 bjPtr, "cipher_i
12d70 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 s_aead", SSL_CIP
12d80 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68 HER_is_aead(ciph
12d90 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 er));.../* Diges
12da0 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 68 t used during th
12db0 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 e SSL/TLS handsh
12dc0 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74 ake when using t
12dd0 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d he cipher. */..m
12de0 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 d = SSL_CIPHER_g
12df0 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 et_handshake_dig
12e00 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 est(cipher);..LA
12e10 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12e20 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 , objPtr, "hands
12e30 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63 hake_digest", (c
12e40 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d har *)EVP_MD_nam
12e50 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a e(md), -1);.../*
12e60 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 Get OpenSSL-spe
12e70 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 cific ID, not IA
12e80 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e NA ID */..LAPPEN
12e90 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
12ea0 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64 jPtr, "cipher_id
12eb0 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 ", (int) SSL_CIP
12ec0 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 HER_get_id(ciphe
12ed0 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 r));.../* Two-by
12ee0 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 68 te ID used in th
12ef0 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f e TLS protocol o
12f00 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 68 f the given ciph
12f10 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 er */..LAPPEND_I
12f20 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
12f30 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 r, "protocol_id"
12f40 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 , (int) SSL_CIPH
12f50 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f ER_get_protocol_
12f60 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f id(cipher));.../
12f70 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 69 * Textual descri
12f80 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 ption of the cip
12f90 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f her */..if (SSL_
12fa0 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 CIPHER_descripti
12fb0 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 on(cipher, buf,
12fc0 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 sizeof(buf)) !=
12fd0 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 NULL) {.. LAP
12fe0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
12ff0 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69 objPtr, "descri
13000 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 ption", buf, -1)
13010 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
13020 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 /* Session info
13030 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d */. session =
13040 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e SSL_get_session
13050 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 (ssl);. if (s
13060 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 ession != NULL)
13070 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 {..const unsigne
13080 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a d char *ticket;.
13090 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 .size_t len2;..u
130a0 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e nsigned int ulen
130b0 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 ;..const unsigne
130c0 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f d char *session_
130d0 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e 73 id, *proto;..uns
130e0 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 65 igned char buffe
130f0 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 r[SSL_MAX_MASTER
13100 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 _KEY_LENGTH];...
13110 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 /* Report the se
13120 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
13130 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 as a result of t
13140 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 he ALPN negotiat
13150 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 ion */..SSL_SESS
13160 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 ION_get0_alpn_se
13170 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 lected(session,
13180 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a &proto, &len2);.
13190 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
131a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c erp, objPtr, "al
131b0 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 pn", (char *) pr
131c0 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 oto, (Tcl_Size)
131d0 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f len2);.../* Repo
131e0 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 rt the selected
131f0 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 protocol as a re
13200 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 sult of the NPN
13210 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 negotiation */.#
13220 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 ifdef USE_NPN..S
13230 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f SL_get0_next_pro
13240 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73 to_negotiated(ss
13250 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e l, &proto, &ulen
13260 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
13270 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
13280 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 "npn", (char *)
13290 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 proto, (Tcl_Size
132a0 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a ) ulen);.#endif.
132b0 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 ../* Resumable s
132c0 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 ession */..LAPPE
132d0 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
132e0 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 62 objPtr, "resumab
132f0 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e le", SSL_SESSION
13300 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 _is_resumable(se
13310 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 ssion));.../* Se
13320 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 ssion start time
13330 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 (seconds since
13340 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 45 epoch) */..LAPPE
13350 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
13360 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74 objPtr, "start_t
13370 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f ime", SSL_SESSIO
13380 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 N_get_time(sessi
13390 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f on));.../* Timeo
133a0 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 ut value - SSL_C
133b0 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 TX_get_timeout (
133c0 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 in seconds) */..
133d0 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 LAPPEND_LONG(int
133e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 erp, objPtr, "ti
133f0 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 meout", SSL_SESS
13400 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 ION_get_timeout(
13410 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 session));.../*
13420 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 Session id - TLS
13430 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f v1.2 and below o
13440 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f nly */..session_
13450 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e id = SSL_SESSION
13460 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c _get_id(session,
13470 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e &ulen);..LAPPEN
13480 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c D_BARRAY(interp,
13490 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
134a0 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 n_id", session_i
134b0 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c d, (Tcl_Size) ul
134c0 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f en);.../* Sessio
134d0 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 n context */..se
134e0 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 ssion_id = SSL_S
134f0 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 ESSION_get0_id_c
13500 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 ontext(session,
13510 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 &ulen);..LAPPEND
13520 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
13530 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e objPtr, "session
13540 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69 _context", sessi
13550 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 on_id, (Tcl_Size
13560 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 ) ulen);.../* Se
13570 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 ssion ticket - c
13580 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 lient only */..S
13590 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
135a0 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 ticket(session,
135b0 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b &ticket, &len2);
135c0 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
135d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
135e0 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 "session_ticket
135f0 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f ", ticket, (Tcl_
13600 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f Size) len2);.../
13610 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 * Session ticket
13620 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 lifetime hint (
13630 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 in seconds) */..
13640 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 LAPPEND_LONG(int
13650 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 erp, objPtr, "li
13660 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 fetime", SSL_SES
13670 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f SION_get_ticket_
13680 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 lifetime_hint(se
13690 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 ssion));.../* Ti
136a0 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f cket app data */
136b0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
136c0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
136d0 33 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f 53 30000000L..SSL_S
136e0 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b ESSION_get0_tick
136f0 65 74 5f 61 70 70 64 61 74 61 28 28 53 53 4c 5f et_appdata((SSL_
13700 53 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 73 69 SESSION *) sessi
13710 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 on, &ticket, &le
13720 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 n2);..LAPPEND_BA
13730 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a RRAY(interp, obj
13740 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 Ptr, "ticket_app
13750 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 _data", ticket,
13760 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 (Tcl_Size) len2)
13770 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47 65 ;.#endif.../* Ge
13780 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a t master key */.
13790 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 .len2 = SSL_SESS
137a0 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b ION_get_master_k
137b0 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 ey(session, buff
137c0 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 er, SSL_MAX_MAST
137d0 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a ER_KEY_LENGTH);.
137e0 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
137f0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
13800 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 "master_key", bu
13810 66 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 29 ffer, (Tcl_Size)
13820 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d len2);.../* Com
13830 70 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 pression id */..
13840 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 20 unsigned int id
13850 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
13860 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 65 t_compress_id(se
13870 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 ssion);..LAPPEND
13880 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
13890 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f Ptr, "compressio
138a0 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f n_id", id == 1 ?
138b0 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22 "zlib" : "none"
138c0 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 , -1);. }..
138d0 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e /* Compression
138e0 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 info */. if
138f0 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl != NULL) {.
13900 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f #ifdef HAVE_SSL_
13910 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e COMPRESSION..con
13920 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a st COMP_METHOD *
13930 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f comp, *expn;..co
13940 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 mp = SSL_get_cur
13950 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e rent_compression
13960 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 (ssl);..expn = S
13970 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 SL_get_current_e
13980 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a xpansion(ssl);..
13990 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
139a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f erp, objPtr, "co
139b0 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 mpression", comp
139c0 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f ? SSL_COMP_get_
139d0 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f name(comp) : "no
139e0 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 ne", -1);..LAPPE
139f0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
13a00 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f bjPtr, "expansio
13a10 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43 n", expn ? SSL_C
13a20 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 OMP_get_name(exp
13a30 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 n) : "none", -1)
13a40 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 ;.#else..LAPPEND
13a50 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
13a60 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f Ptr, "compressio
13a70 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b n", "none", -1);
13a80 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
13a90 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 terp, objPtr, "e
13aa0 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 xpansion", "none
13ab0 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 ", -1);.#endif.
13ac0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 }.. /* Ser
13ad0 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 ver info */.
13ae0 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 {..long mode = S
13af0 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 SL_CTX_get_sessi
13b00 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 on_cache_mode(st
13b10 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 atePtr->ctx);..c
13b20 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 har *msg;...if (
13b30 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
13b40 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 CACHE_OFF) {..
13b50 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 msg = "off";..
13b60 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 } else if (mode
13b70 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
13b80 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 _CLIENT) {..
13b90 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a msg = "client";.
13ba0 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 .} else if (mode
13bb0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
13bc0 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 E_SERVER) {..
13bd0 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22 3b msg = "server";
13be0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 ..} else if (mod
13bf0 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 e & SSL_SESS_CAC
13c00 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 HE_BOTH) {..
13c10 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d msg = "both";..}
13c20 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 else {.. msg
13c30 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d = "unknown";..}
13c40 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
13c50 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
13c60 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 ession_cache_mod
13c70 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 e", msg, -1);.
13c80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c }.. /* CA L
13c90 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 ist */. /* IF
13ca0 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20 73 not a server, s
13cb0 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30 5f ame as SSL_get0_
13cc0 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 peer_CA_list. If
13cd0 20 73 65 72 76 65 72 20 73 61 6d 65 20 61 73 20 server same as
13ce0 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 SSL_CTX_get_clie
13cf0 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 nt_CA_list */.
13d00 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f listPtr = Tcl_
13d10 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
13d20 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f LL);. STACK_O
13d30 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 F(X509_NAME) *ca
13d40 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 28 _list;. if ((
13d50 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 ca_list = SSL_ge
13d60 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 t_client_CA_list
13d70 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 (ssl)) != NULL)
13d80 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 42 {..char buffer[B
13d90 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e UFSIZ];..for (in
13da0 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f t i = 0; i < sk_
13db0 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 X509_NAME_num(ca
13dc0 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 _list); i++) {..
13dd0 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e X509_NAME *n
13de0 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 ame = sk_X509_NA
13df0 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 ME_value(ca_list
13e00 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 6e , i);.. if (n
13e10 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 ame) {...X509_NA
13e20 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c ME_oneline(name,
13e30 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 buffer, BUFSIZ)
13e40 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ;...Tcl_ListObjA
13e50 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
13e60 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 erp, listPtr, Tc
13e70 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 l_NewStringObj(b
13e80 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 uffer, -1));..
13e90 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 }..}. }.
13ea0 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 LAPPEND_OBJ(int
13eb0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 erp, objPtr, "ca
13ec0 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29 3b List", listPtr);
13ed0 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 . LAPPEND_INT
13ee0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
13ef0 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20 "caListCount",
13f00 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d sk_X509_NAME_num
13f10 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 20 (ca_list));..
13f20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
13f30 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
13f40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
13f50 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
13f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fa0 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e --. *. * Version
13fb0 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e ObjCmd -- return
13fc0 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 version string
13fd0 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a from OpenSSL.. *
13fe0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
13ff0 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
14000 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
14010 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
14020 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
14030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
14070 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 .static int.Vers
14080 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 ionObjCmd(Client
14090 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
140a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
140b0 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
140c0 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
140d0 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
140e0 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 Obj *objPtr;.
140f0 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 (void) clientDa
14100 74 61 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 6f ta;. (void) o
14110 62 6a 63 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 bjc;. (void)
14120 6f 62 6a 76 3b 0a 0a 20 20 20 20 64 70 72 69 6e objv;.. dprin
14130 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
14140 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
14150 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45 NewStringObj(OPE
14160 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58 NSSL_VERSION_TEX
14170 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c 5f T, -1);. Tcl_
14180 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
14190 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 erp, objPtr);..
141a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
141b0 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
141c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
141d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
141e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
141f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
14200 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 *. * MiscObjCmd
14210 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 -- misc commands
14220 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
14230 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
14240 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
14250 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
14260 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
14270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
142a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
142b0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d */.static int.M
142c0 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 iscObjCmd(Client
142d0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
142e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
142f0 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
14300 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
14310 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 jv[]) {. stat
14320 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 ic const char *c
14330 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 ommands [] = { "
14340 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 req", "strreq",
14350 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d NULL };. enum
14360 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 command { C_REQ
14370 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 , C_STRREQ, C_DU
14380 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 53 MMY };. Tcl_S
14390 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e 74 ize cmd;. int
143a0 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 isStr;. char
143b0 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a buffer[16384];.
143c0 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e (void) clien
143d0 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 tData;.. dpri
143e0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
143f0 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
14400 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
14410 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
14420 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 objv, "subcomma
14430 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 nd ?args?");..re
14440 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
14450 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 }. if (Tc
14460 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 l_GetIndexFromOb
14470 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 j(interp, objv[1
14480 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f ], commands, "co
14490 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64 29 mmand", 0, &cmd)
144a0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
144b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
144c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
144d0 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
144e0 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 isStr = (cmd
144f0 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 == C_STRREQ);.
14500 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d switch ((enum
14510 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b command) cmd) {
14520 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 ..case C_REQ:..c
14530 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a ase C_STRREQ: {.
14540 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 . EVP_PKEY *p
14550 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 key=NULL;.. X
14560 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 509 *cert=NULL;.
14570 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a . X509_NAME *
14580 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 name=NULL;..
14590 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b Tcl_Obj **listv;
145a0 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c .. Tcl_Size l
145b0 69 73 74 63 3b 0a 09 20 20 20 20 69 6e 74 20 69 istc;.. int i
145c0 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 ;... BIO *out
145d0 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 =NULL;... cha
145e0 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d r *k_C="",*k_ST=
145f0 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d "",*k_L="",*k_O=
14600 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 "",*k_OU="",*k_C
14610 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 N="",*k_Email=""
14620 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 ;.. char *key
14630 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 out,*pemout,*str
14640 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 ;.. int keysi
14650 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 ze,serial=0,days
14660 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 =365;..#if OPENS
14670 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
14680 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
14690 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 . BIGNUM *bne
146a0 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 = NULL;.. RS
146b0 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 A *rsa = NULL;.#
146c0 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b else.. EVP_PK
146d0 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 EY_CTX *ctx = NU
146e0 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 LL;.#endif...
146f0 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c if ((objc<5) ||
14700 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 (objc>6)) {...T
14710 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
14720 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c interp, 2, objv,
14730 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c "keysize keyfil
14740 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f e certfile ?info
14750 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 ?");...return TC
14760 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
14770 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 .. if (Tcl_Ge
14780 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 tIntFromObj(inte
14790 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 rp, objv[2], &ke
147a0 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b ysize) != TCL_OK
147b0 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c ) {...return TCL
147c0 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 _ERROR;.. }..
147d0 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 keyout=Tcl_G
147e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d etString(objv[3]
147f0 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 );.. pemout=T
14800 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
14810 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 v[4]);.. if (
14820 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 isStr) {...Tcl_S
14830 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 etVar(interp,key
14840 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c out,"",0);...Tcl
14850 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 _SetVar(interp,p
14860 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 emout,"",0);..
14870 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 }... if (ob
14880 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 jc>=6) {...if (T
14890 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 cl_ListObjGetEle
148a0 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 ments(interp, ob
148b0 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20 26 jv[5], &listc, &
148c0 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b listv) != TCL_OK
148d0 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e ) {... return
148e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a TCL_ERROR;...}.
148f0 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 ...if ((listc%2)
14900 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 != 0) {... T
14910 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
14920 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e erp,"Information
14930 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 list must have
14940 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 even number of a
14950 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b rguments",NULL);
14960 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
14970 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 L_ERROR;...}...f
14980 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 or (i=0; i<listc
14990 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 ; i+=2) {...
149a0 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e str=Tcl_GetStrin
149b0 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 g(listv[i]);...
149c0 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 if (strcmp(st
149d0 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a r,"days")==0) {.
149e0 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e ...if (Tcl_GetIn
149f0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c tFromObj(interp,
14a00 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 listv[i+1],&days
14a10 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 )!=TCL_OK)....
14a20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
14a30 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 OR;... } else
14a40 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
14a50 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a "serial")==0) {.
14a60 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e ...if (Tcl_GetIn
14a70 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c tFromObj(interp,
14a80 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 listv[i+1],&seri
14a90 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 al)!=TCL_OK)....
14aa0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
14ab0 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c RROR;... } el
14ac0 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
14ad0 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 r,"C")==0) {....
14ae0 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e k_C=Tcl_GetStrin
14af0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
14b00 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
14b10 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 strcmp(str,"ST")
14b20 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 ==0) {....k_ST=T
14b30 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
14b40 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
14b50 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
14b60 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b p(str,"L")==0) {
14b70 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 ....k_L=Tcl_GetS
14b80 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
14b90 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
14ba0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
14bb0 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f O")==0) {....k_O
14bc0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
14bd0 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
14be0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
14bf0 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 cmp(str,"OU")==0
14c00 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f ) {....k_OU=Tcl_
14c10 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
14c20 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
14c30 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
14c40 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 tr,"CN")==0) {..
14c50 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 ..k_CN=Tcl_GetSt
14c60 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
14c70 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
14c80 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 f (strcmp(str,"E
14c90 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 mail")==0) {....
14ca0 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 k_Email=Tcl_GetS
14cb0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
14cc0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
14cd0 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 {....Tcl_SetResu
14ce0 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f lt(interp,"Unkno
14cf0 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 wn parameter",NU
14d00 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 LL);....return T
14d10 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 CL_ERROR;...
14d20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 }...}.. }..#i
14d30 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
14d40 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
14d50 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 00000L.. bne
14d60 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 = BN_new();..
14d70 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 rsa = RSA_new()
14d80 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 ;.. pkey = EV
14d90 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 P_PKEY_new();..
14da0 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 if (bne == NU
14db0 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c LL || rsa == NUL
14dc0 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c L || pkey == NUL
14dd0 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 L || !BN_set_wor
14de0 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c d(bne,RSA_F4) ||
14df0 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 ...!RSA_generate
14e00 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 _key_ex(rsa, key
14e10 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 size, bne, NULL)
14e20 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 || !EVP_PKEY_as
14e30 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 sign_RSA(pkey, r
14e40 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 sa)) {...EVP_PKE
14e50 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 Y_free(pkey);...
14e60 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 /* RSA_free(rsa)
14e70 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 ; freed by EVP_P
14e80 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e KEY_free */...BN
14e90 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 _free(bne);.#els
14ea0 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 e.. pkey = EV
14eb0 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 P_RSA_gen((unsig
14ec0 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 ned int) keysize
14ed0 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 );.. ctx = EV
14ee0 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 P_PKEY_CTX_new(p
14ef0 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 key,NULL);..
14f00 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c if (pkey == NULL
14f10 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 || ctx == NULL
14f20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 || !EVP_PKEY_key
14f30 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c gen_init(ctx) ||
14f40 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 ...!EVP_PKEY_CTX
14f50 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f _set_rsa_keygen_
14f60 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a bits(ctx, keysiz
14f70 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f e) || !EVP_PKEY_
14f80 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 keygen(ctx, &pke
14f90 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 y)) {...EVP_PKEY
14fa0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 _free(pkey);...E
14fb0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 VP_PKEY_CTX_free
14fc0 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 (ctx);.#endif...
14fd0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
14fe0 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 terp,"Error gene
14ff0 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b rating private k
15000 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 ey",NULL);...ret
15010 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
15020 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 } else {...i
15030 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 f (isStr) {...
15040 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
15050 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 O_s_mem());...
15060 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
15070 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 PrivateKey(out,p
15080 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c key,NULL,NULL,0,
15090 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 NULL,NULL);...
150a0 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 i=BIO_read(out
150b0 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 ,buffer,sizeof(b
150c0 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 uffer)-1);...
150d0 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 i=(i<0) ? 0 : i
150e0 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 ;... buffer[i
150f0 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 ]='\0';... Tc
15100 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
15110 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 keyout,buffer,0)
15120 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 ;... BIO_flus
15130 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 h(out);... BI
15140 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d O_free(out);...}
15150 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 else {... ou
15160 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
15170 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 file());... B
15180 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d IO_write_filenam
15190 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 e(out,keyout);..
151a0 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
151b0 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 io_PrivateKey(ou
151c0 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c t,pkey,NULL,NULL
151d0 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 ,0,NULL,NULL);..
151e0 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 . /* PEM_writ
151f0 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 e_bio_RSAPrivate
15200 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 Key(out, rsa, NU
15210 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c LL, NULL, 0, NUL
15220 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 L, NULL); */...
15230 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 BIO_free_all(
15240 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 out);.. .}....if
15250 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 ((cert=X509_new
15260 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 ())==NULL) {...
15270 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
15280 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 (interp,"Error g
15290 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 enerating certif
152a0 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e icate request",N
152b0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f ULL);... EVP_
152c0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
152d0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
152e0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
152f0 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 30000000L...
15300 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
15310 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 ndif... retur
15320 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
15330 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72 ....X509_set_ver
15340 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 sion(cert,2);...
15350 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 ASN1_INTEGER_set
15360 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c (X509_get_serial
15370 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72 Number(cert),ser
15380 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 ial);...X509_gmt
15390 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 ime_adj(X509_get
153a0 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 m_notBefore(cert
153b0 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 ),0);...X509_gmt
153c0 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 ime_adj(X509_get
153d0 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 m_notAfter(cert)
153e0 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a ,(long)60*60*24*
153f0 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 days);...X509_se
15400 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b t_pubkey(cert,pk
15410 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 ey);....name=X50
15420 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 9_get_subject_na
15430 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 me(cert);....X50
15440 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
15450 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 _by_txt(name,"C"
15460 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
15470 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
15480 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c char *) k_C, -1,
15490 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
154a0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
154b0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c y_txt(name,"ST",
154c0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
154d0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
154e0 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c har *) k_ST, -1,
154f0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
15500 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
15510 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 y_txt(name,"L",
15520 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
15530 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
15540 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d ar *) k_L, -1, -
15550 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
15560 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
15570 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 txt(name,"O", MB
15580 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
15590 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
155a0 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c *) k_O, -1, -1,
155b0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
155c0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
155d0 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 t(name,"OU", MBS
155e0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
155f0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
15600 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c *) k_OU, -1, -1,
15610 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
15620 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
15630 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 t(name,"CN", MBS
15640 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
15650 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
15660 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c *) k_CN, -1, -1,
15670 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
15680 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
15690 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 t(name,"Email",
156a0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
156b0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
156c0 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d ar *) k_Email, -
156d0 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 1, -1, 0);....X5
156e0 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 09_set_subject_n
156f0 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a ame(cert,name);.
15700 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 ...if (!X509_sig
15710 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f n(cert,pkey,EVP_
15720 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20 sha256())) {...
15730 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 X509_free(cer
15740 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b t);... EVP_PK
15750 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 EY_free(pkey);.#
15760 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
15770 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
15780 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 000000L... BN
15790 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 _free(bne);.#end
157a0 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 if... Tcl_Set
157b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 Result(interp,"E
157c0 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 rror signing cer
157d0 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b tificate",NULL);
157e0 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
157f0 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 L_ERROR;...}....
15800 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 if (isStr) {...
15810 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
15820 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 IO_s_mem());...
15830 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
15840 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b _X509(out,cert);
15850 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 ... i=BIO_rea
15860 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a d(out,buffer,siz
15870 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a eof(buffer)-1);.
15880 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 .. i=(i<0) ?
15890 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 0 : i;... buf
158a0 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 fer[i]='\0';...
158b0 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e Tcl_SetVar(in
158c0 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 terp,pemout,buff
158d0 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f er,0);... BIO
158e0 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 _flush(out);...
158f0 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 BIO_free(out)
15900 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 ;...} else {...
15910 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
15920 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 IO_s_file());...
15930 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 BIO_write_fi
15940 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 lename(out,pemou
15950 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 t);... PEM_wr
15960 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 ite_bio_X509(out
15970 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 ,cert);... BI
15980 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b O_free_all(out);
15990 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 ...}....X509_fre
159a0 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 e(cert);...EVP_P
159b0 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
159c0 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
159d0 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
159e0 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 0000000L...BN_fr
159f0 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
15a00 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b . }..}..break
15a10 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 ;. default:..
15a20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 break;. }.
15a30 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
15a40 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a }.../***********
15a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e *********/./* In
15a60 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2a it *
15a70 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /./*************
15a80 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d *******/../*. *-
15a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ad0 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 --. *. * Tls_Fre
15ae0 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 e --. *. *.This
15af0 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 procedure cleans
15b00 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 up when a SSL s
15b10 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e ocket based chan
15b20 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 nel. *.is closed
15b30 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e and its referen
15b40 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 ce count falls b
15b50 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 elow 1. *. * Res
15b60 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ults:. *.none. *
15b70 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
15b80 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 :. *.Frees all t
15b90 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d he state. *. *--
15ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15be0 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 -. */.void.Tls_F
15bf0 72 65 65 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 ree(tls_free_typ
15c00 65 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 e *blockPtr) {.
15c10 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
15c20 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c tr = (State *)bl
15c30 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 ockPtr;.. dpr
15c40 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
15c50 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 . Tls_Clean(s
15c60 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b tatePtr);. ck
15c70 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a free(blockPtr);.
15c80 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
15c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
15cd0 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a * Tls_Clean --.
15ce0 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
15cf0 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 dure cleans up w
15d00 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 hen a SSL socket
15d10 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 based channel.
15d20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 *.is closed and
15d30 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f its reference co
15d40 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 unt falls below
15d50 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 1. This should.
15d60 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e *.be called syn
15d70 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 chronously by th
15d80 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 e CloseProc, not
15d90 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 in the. *.Event
15da0 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 uallyFree callba
15db0 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ck.. *. * Result
15dc0 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.none. *. *
15dd0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
15de0 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 *.Frees all the
15df0 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d state. *. *-----
15e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
15e40 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 */.void Tls_Clea
15e50 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 n(State *statePt
15e60 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 r) {. dprintf
15e70 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
15e80 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 /*. * we're
15e90 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 assuming here t
15ea0 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 hat we're single
15eb0 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a -threaded. *
15ec0 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 /. if (stateP
15ed0 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 tr->timer != (Tc
15ee0 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 l_TimerToken) NU
15ef0 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 LL) {..Tcl_Delet
15f00 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 eTimerHandler(st
15f10 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a atePtr->timer);.
15f20 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 .statePtr->timer
15f30 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a = NULL;. }..
15f40 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 61 /* Remove ca
15f50 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 69 llbacks */. i
15f60 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
15f70 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 lback) {..Tcl_De
15f80 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
15f90 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
15fa0 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 .statePtr->callb
15fb0 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ack = NULL;.
15fc0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
15fd0 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a tr->password) {.
15fe0 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
15ff0 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 t(statePtr->pass
16000 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 word);..statePtr
16010 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c ->password = NUL
16020 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
16030 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
16040 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 {..Tcl_DecrRefC
16050 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 ount(statePtr->v
16060 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d cmd);..statePtr-
16070 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 >vcmd = NULL;.
16080 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 }.. if (sta
16090 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b tePtr->protos) {
160a0 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 ..ckfree(statePt
160b0 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 r->protos);..sta
160c0 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 tePtr->protos =
160d0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
160e0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 if (statePtr->b
160f0 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 io) {../* This w
16100 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 ill call SSL_shu
16110 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 tdown. Bug 14140
16120 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 45 */..dprintf("
16130 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 BIO_free_all(%p)
16140 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ", statePtr->bio
16150 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c );..BIO_free_all
16160 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b (statePtr->bio);
16170 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 ..statePtr->bio
16180 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 = NULL;. }..
16190 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
161a0 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 >ssl) {..dprintf
161b0 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c ("SSL_free(%p)",
161c0 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b statePtr->ssl);
161d0 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 ..SSL_free(state
161e0 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 Ptr->ssl);..stat
161f0 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c ePtr->ssl = NULL
16200 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
16210 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 (statePtr->ctx)
16220 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 {..SSL_CTX_free(
16230 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a statePtr->ctx);.
16240 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d .statePtr->ctx =
16250 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
16260 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 dprintf("Retur
16270 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ning");.}.../*.
16280 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
16290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
162a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
162b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
162c0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 75 -------. *. * Bu
162d0 69 6c 64 20 49 6e 66 6f 20 43 6f 6d 6d 61 6e 64 ild Info Command
162e0 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 --. *. *.Create
162f0 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 72 65 74 75 command to retu
16300 72 6e 20 62 75 69 6c 64 20 69 6e 66 6f 20 66 6f rn build info fo
16310 72 20 70 61 63 6b 61 67 65 2e 0a 20 2a 0a 20 2a r package.. *. *
16320 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
16330 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
16340 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 lt. *. * Side ef
16350 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 fects:. *.Create
16360 64 20 62 75 69 6c 64 2d 69 6e 66 6f 20 63 6f 6d d build-info com
16370 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d mand.. *. *-----
16380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
163a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
163b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
163c0 2d 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 -. */..#ifndef S
163d0 54 52 49 4e 47 49 46 59 0a 23 20 20 64 65 66 69 TRINGIFY.# defi
163e0 6e 65 20 53 54 52 49 4e 47 49 46 59 28 78 29 20 ne STRINGIFY(x)
163f0 53 54 52 49 4e 47 49 46 59 31 28 78 29 0a 23 20 STRINGIFY1(x).#
16400 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49 46 define STRINGIF
16410 59 31 28 78 29 20 23 78 0a 23 65 6e 64 69 66 0a Y1(x) #x.#endif.
16420 0a 69 6e 74 0a 42 75 69 6c 64 49 6e 66 6f 43 6f .int.BuildInfoCo
16430 6d 6d 61 6e 64 28 54 63 6c 5f 49 6e 74 65 72 70 mmand(Tcl_Interp
16440 2a 20 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 * interp) {.
16450 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 69 6e 66 6f Tcl_CmdInfo info
16460 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 ;.. if (Tcl_G
16470 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e etCommandInfo(in
16480 74 65 72 70 2c 20 22 3a 3a 74 63 6c 3a 3a 62 75 terp, "::tcl::bu
16490 69 6c 64 2d 69 6e 66 6f 22 2c 20 26 69 6e 66 6f ild-info", &info
164a0 29 29 20 7b 0a 09 54 63 6c 5f 43 72 65 61 74 65 )) {..Tcl_Create
164b0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
164c0 70 2c 20 22 3a 3a 74 6c 73 3a 3a 62 75 69 6c 64 p, "::tls::build
164d0 2d 69 6e 66 6f 22 2c 20 69 6e 66 6f 2e 6f 62 6a -info", info.obj
164e0 50 72 6f 63 2c 20 28 76 6f 69 64 20 2a 29 28 0a Proc, (void *)(.
164f0 09 09 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f ..PACKAGE_VERSIO
16500 4e 20 22 2b 22 20 53 54 52 49 4e 47 49 46 59 28 N "+" STRINGIFY(
16510 54 4c 53 5f 56 45 52 53 49 4f 4e 5f 55 55 49 44 TLS_VERSION_UUID
16520 29 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f ).#if defined(__
16530 63 6c 61 6e 67 5f 5f 29 20 26 26 20 64 65 66 69 clang__) && defi
16540 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f ned(__clang_majo
16550 72 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 63 6c r__).... ".cl
16560 61 6e 67 2d 22 20 53 54 52 49 4e 47 49 46 59 28 ang-" STRINGIFY(
16570 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 __clang_major__)
16580 0a 23 69 66 20 5f 5f 63 6c 61 6e 67 5f 6d 69 6e .#if __clang_min
16590 6f 72 5f 5f 20 3c 20 31 30 0a 09 09 09 20 20 20 or__ < 10....
165a0 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 09 09 20 "0".#endif....
165b0 20 20 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 STRINGIFY(__c
165c0 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 29 0a 23 65 lang_minor__).#e
165d0 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
165e0 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 20 26 26 (__cplusplus) &&
165f0 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f 42 4a 43 !defined(__OBJC
16600 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 63 70 6c __).... ".cpl
16610 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 usplus".#endif.#
16620 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 09 09 ifndef NDEBUG...
16630 09 20 20 20 20 22 2e 64 65 62 75 67 22 0a 23 65 . ".debug".#e
16640 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
16650 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20 d(__clang__) &&
16660 21 64 65 66 69 6e 65 64 28 5f 5f 49 4e 54 45 4c !defined(__INTEL
16670 5f 43 4f 4d 50 49 4c 45 52 29 20 26 26 20 64 65 _COMPILER) && de
16680 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a fined(__GNUC__).
16690 09 09 09 20 20 20 20 22 2e 67 63 63 2d 22 20 53 ... ".gcc-" S
166a0 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f TRINGIFY(__GNUC_
166b0 5f 29 0a 23 69 66 20 5f 5f 47 4e 55 43 5f 4d 49 _).#if __GNUC_MI
166c0 4e 4f 52 5f 5f 20 3c 20 31 30 0a 09 09 09 20 20 NOR__ < 10....
166d0 20 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 09 09 "0".#endif....
166e0 20 20 20 20 53 54 52 49 4e 47 49 46 59 28 5f 5f STRINGIFY(__
166f0 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 29 0a 23 65 GNUC_MINOR__).#e
16700 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 49 4e ndif.#ifdef __IN
16710 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 0a 09 09 09 TEL_COMPILER....
16720 20 20 20 20 22 2e 69 63 63 2d 22 20 53 54 52 49 ".icc-" STRI
16730 4e 47 49 46 59 28 5f 5f 49 4e 54 45 4c 5f 43 4f NGIFY(__INTEL_CO
16740 4d 50 49 4c 45 52 29 0a 23 65 6e 64 69 66 0a 23 MPILER).#endif.#
16750 69 66 64 65 66 20 54 43 4c 5f 4d 45 4d 5f 44 45 ifdef TCL_MEM_DE
16760 42 55 47 0a 09 09 09 20 20 20 20 22 2e 6d 65 6d BUG.... ".mem
16770 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 debug".#endif.#i
16780 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 f defined(_MSC_V
16790 45 52 29 0a 09 09 09 20 20 20 20 22 2e 6d 73 76 ER).... ".msv
167a0 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 4d c-" STRINGIFY(_M
167b0 53 43 5f 56 45 52 29 0a 23 65 6e 64 69 66 0a 23 SC_VER).#endif.#
167c0 69 66 64 65 66 20 55 53 45 5f 4e 4d 41 4b 45 0a ifdef USE_NMAKE.
167d0 09 09 09 20 20 20 20 22 2e 6e 6d 61 6b 65 22 0a ... ".nmake".
167e0 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 54 #endif.#ifndef T
167f0 43 4c 5f 43 46 47 5f 4f 50 54 49 4d 49 5a 45 44 CL_CFG_OPTIMIZED
16800 0a 09 09 09 20 20 20 20 22 2e 6e 6f 2d 6f 70 74 .... ".no-opt
16810 69 6d 69 7a 65 22 0a 23 65 6e 64 69 66 0a 23 69 imize".#endif.#i
16820 66 64 65 66 20 5f 5f 4f 42 4a 43 5f 5f 0a 09 09 fdef __OBJC__...
16830 09 20 20 20 20 22 2e 6f 62 6a 65 63 74 69 76 65 . ".objective
16840 2d 63 22 0a 23 69 66 20 64 65 66 69 6e 65 64 28 -c".#if defined(
16850 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a 09 09 09 __cplusplus)....
16860 20 20 20 20 22 70 6c 75 73 70 6c 75 73 22 0a 23 "plusplus".#
16870 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 endif.#endif.#if
16880 64 65 66 20 54 43 4c 5f 43 46 47 5f 50 52 4f 46 def TCL_CFG_PROF
16890 49 4c 45 44 0a 09 09 09 20 20 20 20 22 2e 70 72 ILED.... ".pr
168a0 6f 66 69 6c 65 22 0a 23 65 6e 64 69 66 0a 23 69 ofile".#endif.#i
168b0 66 64 65 66 20 50 55 52 49 46 59 0a 09 09 09 20 fdef PURIFY....
168c0 20 20 20 22 2e 70 75 72 69 66 79 22 0a 23 65 6e ".purify".#en
168d0 64 69 66 0a 23 69 66 64 65 66 20 53 54 41 54 49 dif.#ifdef STATI
168e0 43 5f 42 55 49 4c 44 0a 09 09 09 20 20 20 20 22 C_BUILD.... "
168f0 2e 73 74 61 74 69 63 22 0a 23 65 6e 64 69 66 0a .static".#endif.
16900 09 09 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 ..), NULL);.
16910 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c }. return TCL
16920 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
16930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16960 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 54 6c 73 4c ----*. *. * TlsL
16970 69 62 53 68 75 74 64 6f 77 6e 20 2d 2d 0a 20 2a ibShutdown --. *
16980 0a 20 2a 09 53 68 75 74 64 6f 77 6e 20 53 53 4c . *.Shutdown SSL
16990 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 library once pe
169a0 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a r application. *
169b0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
169c0 41 20 73 74 61 6e 64 61 72 64 20 54 43 4c 20 72 A standard TCL r
169d0 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 esult. *. * Side
169e0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 68 75 effects:. *.Shu
169f0 74 64 6f 77 6e 20 53 53 4c 20 6c 69 62 72 61 72 tdown SSL librar
16a00 79 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d y. *. *---------
16a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
16a40 2a 2f 0a 76 6f 69 64 20 54 6c 73 4c 69 62 53 68 */.void TlsLibSh
16a50 75 74 64 6f 77 6e 28 43 6c 69 65 6e 74 44 61 74 utdown(ClientDat
16a60 61 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a a clientData) {.
16a70 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
16a80 6c 65 64 22 29 3b 0a 0a 20 20 20 20 42 49 4f 5f led");.. BIO_
16a90 63 6c 65 61 6e 75 70 28 29 3b 0a 7d 0a 0a 2f 2a cleanup();.}../*
16aa0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
16ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a ---------*. *. *
16ae0 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 .TlsLibInit --.
16af0 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 *. *.Initializes
16b00 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 SSL library onc
16b10 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f e per applicatio
16b20 6e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a n. *. * Results:
16b30 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
16b40 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 cl result. *. *
16b50 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
16b60 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c .Initializes SSL
16b70 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 2d 2d library. *. *--
16b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16bb0 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 ----*. */.static
16bc0 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 int TlsLibInit(
16bd0 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 ) {. static i
16be0 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d nt initialized =
16bf0 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 0;.. dprintf
16c00 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
16c10 20 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 if (!initialize
16c20 64 29 20 7b 0a 09 2f 2a 20 49 6e 69 74 69 61 6c d) {../* Initial
16c30 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70 ize BOTH libcryp
16c40 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a to and libssl. *
16c50 2f 0a 09 69 66 20 28 21 4f 50 45 4e 53 53 4c 5f /..if (!OPENSSL_
16c60 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c init_ssl(OPENSSL
16c70 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 _INIT_LOAD_SSL_S
16c80 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c TRINGS | OPENSSL
16c90 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 _INIT_LOAD_CRYPT
16ca0 4f 5f 53 54 52 49 4e 47 53 0a 09 20 20 20 20 7c O_STRINGS.. |
16cb0 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 OPENSSL_INIT_AD
16cc0 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 D_ALL_CIPHERS |
16cd0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 OPENSSL_INIT_ADD
16ce0 5f 41 4c 4c 5f 44 49 47 45 53 54 53 0a 09 20 20 _ALL_DIGESTS..
16cf0 20 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 | OPENSSL_INIT
16d00 5f 4c 4f 41 44 5f 43 4f 4e 46 49 47 20 7c 20 4f _LOAD_CONFIG | O
16d10 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 53 59 4e PENSSL_INIT_ASYN
16d20 43 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09 20 20 20 C, NULL)) {..
16d30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
16d40 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 R;..}.../* Creat
16d50 65 20 42 49 4f 20 68 61 6e 64 6c 65 72 73 20 2a e BIO handlers *
16d60 2f 0a 09 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e /..BIO_new_tcl(N
16d70 55 4c 4c 2c 20 30 29 3b 0a 0a 09 2f 2a 20 43 72 ULL, 0);.../* Cr
16d80 65 61 74 65 20 65 78 69 74 20 68 61 6e 64 6c 65 eate exit handle
16d90 72 20 2a 2f 0a 09 54 63 6c 5f 43 72 65 61 74 65 r */..Tcl_Create
16da0 45 78 69 74 48 61 6e 64 6c 65 72 28 54 6c 73 4c ExitHandler(TlsL
16db0 69 62 53 68 75 74 64 6f 77 6e 2c 20 4e 55 4c 4c ibShutdown, NULL
16dc0 29 3b 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 );..initialized
16dd0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 = 1;. }. r
16de0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
16df0 0c 0a 2f 2a 20 49 6e 69 74 20 73 63 72 69 70 74 ../* Init script
16e00 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 */.static const
16e10 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 char tlsTclInit
16e20 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e Script[] = {.#in
16e30 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 clude "tls.tcl.h
16e40 22 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ".};../*. *-----
16e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
16e90 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d *. * Tls_Init --
16ea0 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 . *. *.This is a
16eb0 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c package initial
16ec0 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 ization procedur
16ed0 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c e, which is call
16ee0 65 64 0a 20 2a 09 62 79 20 54 43 4c 20 77 68 65 ed. *.by TCL whe
16ef0 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 n this package i
16f00 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f s to be added to
16f10 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e an interpreter.
16f20 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
16f30 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 73 *.Initializes s
16f40 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 63 72 tructures and cr
16f50 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73 2e 0a eates commands..
16f60 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
16f70 74 73 3a 0a 20 2a 09 20 43 72 65 61 74 65 20 74 ts:. *. Create t
16f80 68 65 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 he commands. *.
16f90 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
16fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16fd0 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 20 54 43 ----. */..#if TC
16fe0 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MAJOR_VERSION
16ff0 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f > 8.#define MIN_
17000 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65 VERSION "9.0".#e
17010 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f lse.#define MIN_
17020 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65 VERSION "8.5".#e
17030 6e 64 69 66 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 ndif..DLLEXPORT
17040 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c int Tls_Init(Tcl
17050 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 _Interp *interp)
17060 20 7b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
17070 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64 "Called");..#ifd
17080 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 ef USE_TCL_STUBS
17090 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 . if (Tcl_Ini
170a0 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d tStubs(interp, M
170b0 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d IN_VERSION, 0) =
170c0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
170d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
170e0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 20 }.#else. if
170f0 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 45 (Tcl_PkgRequireE
17100 78 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c x(interp, "Tcl",
17110 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 2c MIN_VERSION, 0,
17120 20 4e 55 4c 4c 29 20 3d 3d 20 4e 55 4c 4c 29 20 NULL) == NULL)
17130 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
17140 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ROR;. }.#endi
17150 66 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 f.. if (TlsLi
17160 62 49 6e 69 74 28 29 20 21 3d 20 54 43 4c 5f 4f bInit() != TCL_O
17170 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 K) {..Tcl_Append
17180 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
17190 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 could not initia
171a0 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 lize SSL library
171b0 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
171c0 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
171d0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
171e0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
171f0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
17200 3a 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 :tls::ciphers",
17210 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 CiphersObjCmd, (
17220 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
17230 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
17240 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
17250 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
17260 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
17270 22 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 "::tls::connecti
17280 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 on", ConnectionI
17290 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 nfoObjCmd, (Clie
172a0 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
172b0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
172c0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
172d0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
172e0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
172f0 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 ls::handshake",
17300 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c HandshakeObjCmd,
17310 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
17320 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
17330 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
17340 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
17350 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
17360 2c 20 22 3a 3a 74 6c 73 3a 3a 69 6d 70 6f 72 74 , "::tls::import
17370 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c ", ImportObjCmd,
17380 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
17390 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
173a0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
173b0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
173c0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
173d0 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 69 6d 70 6f , "::tls::unimpo
173e0 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a rt", UnimportObj
173f0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
17400 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 ) NULL, (Tcl_Cmd
17410 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
17420 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
17430 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
17440 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e terp, "::tls::un
17450 73 74 61 63 6b 22 2c 20 55 6e 69 6d 70 6f 72 74 stack", Unimport
17460 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
17470 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f ata) NULL, (Tcl_
17480 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
17490 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
174a0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
174b0 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a (interp, "::tls:
174c0 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 :status", Status
174d0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
174e0 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f ata) NULL, (Tcl_
174f0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
17500 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
17510 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
17520 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a (interp, "::tls:
17530 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 :version", Versi
17540 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e onObjCmd, (Clien
17550 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 tData) NULL, (Tc
17560 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
17570 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
17580 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
17590 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c nd(interp, "::tl
175a0 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 s::misc", MiscOb
175b0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
175c0 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d a) NULL, (Tcl_Cm
175d0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
175e0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
175f0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
17600 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 70 nterp, "::tls::p
17610 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f rotocols", Proto
17620 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 colsObjCmd, (Cli
17630 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 entData) NULL, (
17640 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
17650 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 c *) NULL);..
17660 20 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e BuildInfoComman
17670 64 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 d(interp);..
17680 69 66 20 28 69 6e 74 65 72 70 20 26 26 20 54 63 if (interp && Tc
17690 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 l_Eval(interp, t
176a0 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 lsTclInitScript)
176b0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
176c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
176d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 . }.. retu
176e0 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 rn Tcl_PkgProvid
176f0 65 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 e(interp, PACKAG
17700 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f E_NAME, PACKAGE_
17710 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a VERSION);.}../*.
17720 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
17730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17760 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 09 54 6c 73 5f -----. *. *.Tls_
17770 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 SafeInit --. *.
17780 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b *.This is a pack
17790 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 age initializati
177a0 6f 6e 20 70 72 6f 63 65 64 75 72 65 20 66 6f 72 on procedure for
177b0 20 73 61 66 65 20 69 6e 74 65 72 70 73 2e 0a 20 safe interps..
177c0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
177d0 09 53 61 6d 65 20 61 73 20 6f 66 20 27 54 6c 73 .Same as of 'Tls
177e0 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 20 53 69 64 _Init'. *. * Sid
177f0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 61 e effects:. *.Sa
17800 6d 65 20 61 73 20 6f 66 20 27 54 6c 73 5f 49 6e me as of 'Tls_In
17810 69 74 27 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d it'. *. *-------
17820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
17860 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 .DLLEXPORT int T
17870 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f ls_SafeInit(Tcl_
17880 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 Interp *interp)
17890 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 {. dprintf("C
178a0 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 alled");. ret
178b0 75 72 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e 74 urn Tls_Init(int
178c0 65 72 70 29 3b 0a 7d 0a erp);.}.