0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61 (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69 some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68 ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32 pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72 ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79 poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53 right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29 *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61 2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 ka SSL) Channel
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68 st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65 based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64 * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61 dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64 .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74 ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 full fileevent
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 Also work done
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68 ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 e impetus to do
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 pts.h".#include
0360: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63 "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e include <stdlib.
0390: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 h>.#include <ope
03a0: 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a 23 69 6e 63 nssl/ssl.h>.#inc
03b0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72 lude <openssl/cr
03c0: 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 ypto.h>.#include
03d0: 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 73 <openssl/openss
03e0: 6c 63 6f 6e 66 2e 68 3e 0a 23 69 6e 63 6c 75 64 lconf.h>.#includ
03f0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 72 73 61 2e 68 e <openssl/rsa.h
0400: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e >.#include <open
0410: 73 73 6c 2f 73 61 66 65 73 74 61 63 6b 2e 68 3e ssl/safestack.h>
0420: 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 65 6e 53 53 4c ../* Min OpenSSL
0430: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 69 66 20 version */.#if
0440: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
0450: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 NUMBER < 0x10101
0460: 30 30 30 4c 0a 23 65 72 72 6f 72 20 22 4f 6e 6c 000L.#error "Onl
0470: 79 20 4f 70 65 6e 53 53 4c 20 76 31 2e 31 2e 31 y OpenSSL v1.1.1
0480: 20 6f 72 20 6c 61 74 65 72 20 69 73 20 73 75 70 or later is sup
0490: 70 6f 72 74 65 64 22 0a 23 65 6e 64 69 66 0a 0a ported".#endif..
04a0: 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20 64 ./*. * Forward d
04b0: 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a eclarations. */.
04c0: 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b 65 79 .#define F2N(key
04d0: 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b 65 79 , dsp) \..(((key
04e0: 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 63 68 ) == NULL) ? (ch
04f0: 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c 0a 09 ar *) NULL : \..
0500: 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 .Tcl_TranslateFi
0510: 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 28 leName(interp, (
0520: 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a 0a 73 key), (dsp)))..s
0530: 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 43 tatic SSL_CTX *C
0540: 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 TX_Init(State *s
0550: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 tatePtr, int isS
0560: 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f erver, int proto
0570: 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09 09 63 , char *key,...c
0580: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 20 75 har *certfile, u
0590: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 nsigned char *ke
05a0: 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e 65 64 y_asn1, unsigned
05b0: 20 63 68 61 72 20 2a 63 65 72 74 5f 61 73 6e 31 char *cert_asn1
05c0: 2c 0a 09 09 54 63 6c 5f 53 69 7a 65 20 6b 65 79 ,...Tcl_Size key
05d0: 5f 61 73 6e 31 5f 6c 65 6e 2c 20 54 63 6c 5f 53 _asn1_len, Tcl_S
05e0: 69 7a 65 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65 ize cert_asn1_le
05f0: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c n, char *CApath,
0600: 20 63 68 61 72 20 2a 43 41 73 74 6f 72 65 2c 0a char *CAstore,.
0610: 09 09 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 ..char *CAfile,
0620: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 char *ciphers, c
0630: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 har *ciphersuite
0640: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 s, int level, ch
0650: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a ar *DHparams);..
0660: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 #define TLS_PROT
0670: 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a 23 64 65 O_SSL2..0x01.#de
0680: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 fine TLS_PROTO_S
0690: 53 4c 33 09 09 30 78 30 32 0a 23 64 65 66 69 6e SL3..0x02.#defin
06a0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
06b0: 09 09 30 78 30 34 0a 23 64 65 66 69 6e 65 20 54 ..0x04.#define T
06c0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 LS_PROTO_TLS1_1.
06d0: 30 78 30 38 0a 23 64 65 66 69 6e 65 20 54 4c 53 0x08.#define TLS
06e0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 09 30 78 _PROTO_TLS1_2.0x
06f0: 31 30 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 10.#define TLS_P
0700: 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 78 32 30 ROTO_TLS1_3.0x20
0710: 0a 23 64 65 66 69 6e 65 20 45 4e 41 42 4c 45 44 .#define ENABLED
0720: 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09 28 28 28 (flag, mask).(((
0730: 66 6c 61 67 29 20 26 20 28 6d 61 73 6b 29 29 20 flag) & (mask))
0740: 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23 64 65 66 == (mask))..#def
0750: 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47 46 49 4c ine SSLKEYLOGFIL
0760: 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47 46 49 4c E.."SSLKEYLOGFIL
0770: 45 22 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a E"..../*********
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 ***********/./*
0790: 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 20 20 Callbacks
07a0: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./***********
07b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 *********/../*.
07c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0800: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20 ----. *. * Eval
0810: 43 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64 Callback Command
0820: 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63 --. *. *.Eval c
0830: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
0840: 61 6e 64 20 63 61 74 63 68 20 61 6e 79 20 65 72 and catch any er
0850: 72 6f 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c rors. *. * Resul
0860: 74 73 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61 ts:. *.0 = Comma
0870: 6e 64 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c nd returned fail
0880: 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 or eval returne
0890: 64 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31 d TCL_ERROR. *.1
08a0: 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 = Command retur
08b0: 6e 65 64 20 73 75 63 63 65 73 73 20 6f 72 20 65 ned success or e
08c0: 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c val returned TCL
08d0: 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 _OK. *. * Side e
08e0: 66 66 65 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75 ffects:. *.Evalu
08f0: 61 74 65 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f ates callback co
0900: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d mmand. *. *-----
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
0950: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 45 76 */.static int.Ev
0960: 61 6c 43 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49 alCallback(Tcl_I
0970: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 53 nterp *interp, S
0980: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 tate *statePtr,
0990: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29 Tcl_Obj *cmdPtr)
09a0: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c {. int code,
09b0: 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 ok = 0;.. dp
09c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
09d0: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 .. Tcl_Preser
09e0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
09f0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c interp);. Tcl
0a00: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
0a10: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
0a20: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
0a30: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 73 75 63 allback with suc
0a40: 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f 72 20 72 cess for ok or r
0a50: 65 74 75 72 6e 20 76 61 6c 75 65 20 31 2c 20 66 eturn value 1, f
0a60: 61 69 6c 20 66 6f 72 20 65 72 72 6f 72 20 6f 72 ail for error or
0a70: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 30 20 return value 0
0a80: 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 */. Tcl_Reset
0a90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
0aa0: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 code = Tcl_E
0ab0: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c valObjEx(interp,
0ac0: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 cmdPtr, TCL_EVA
0ad0: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 64 L_GLOBAL);. d
0ae0: 70 72 69 6e 74 66 28 22 45 76 61 6c 43 61 6c 6c printf("EvalCall
0af0: 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f 64 65 29 back: %d", code)
0b00: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d ;. if (code =
0b10: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 = TCL_OK) {../*
0b20: 43 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72 Check result for
0b30: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f return value */
0b40: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c ..Tcl_Obj *resul
0b50: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 t = Tcl_GetObjRe
0b60: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 sult(interp);..i
0b70: 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c f (result == NUL
0b80: 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 L || Tcl_GetIntF
0b90: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 romObj(interp, r
0ba0: 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54 esult, &ok) != T
0bb0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b CL_OK) {.. ok
0bc0: 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 69 6e 74 = 1;..}..dprint
0bd0: 66 28 22 52 65 73 75 6c 74 3a 20 25 64 22 2c 20 f("Result: %d",
0be0: 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ok);. } else
0bf0: 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20 72 65 {../* Error - re
0c00: 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 66 69 ject the certifi
0c10: 63 61 74 65 20 2a 2f 0a 09 64 70 72 69 6e 74 66 cate */..dprintf
0c20: 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ("Tcl_Background
0c30: 45 72 72 6f 72 22 29 3b 0a 23 69 66 20 28 54 43 Error");.#if (TC
0c40: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MAJOR_VERSION
0c50: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 == 8) && (TCL_MI
0c60: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 NOR_VERSION < 6)
0c70: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
0c80: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 Error(interp);.#
0c90: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 else..Tcl_Backgr
0ca0: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e oundException(in
0cb0: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e terp, code);.#en
0cc0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 dif. }.. T
0cd0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
0ce0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
0cf0: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 );. Tcl_Relea
0d00: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
0d10: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 interp);. ret
0d20: 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 urn ok;.}.../*.
0d30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d70: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 ----. *. * InfoC
0d80: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a allback --. *. *
0d90: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f .Monitors SSL co
0da0: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 nnection process
0db0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
0dc0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
0dd0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
0de0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
0df0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e40: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 ---. */.static v
0e50: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b oid.InfoCallback
0e60: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c (const SSL *ssl,
0e70: 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20 int where, int
0e80: 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65 ret) {. State
0e90: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
0ea0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 ate*)SSL_get_app
0eb0: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c _data((SSL *)ssl
0ec0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 );. Tcl_Inter
0ed0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
0ee0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
0ef0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
0f00: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 r;. const cha
0f10: 72 20 2a 6d 61 6a 6f 72 2c 20 2a 6d 69 6e 6f 72 r *major, *minor
0f20: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
0f30: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
0f40: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
0f50: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
0f60: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 j*)NULL) {..retu
0f70: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 rn;. }.. i
0f80: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
0f90: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 B_HANDSHAKE_STAR
0fa0: 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 T) {..major = "h
0fb0: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f andshake";..mino
0fc0: 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 r = "start";.
0fd0: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 } else if (wher
0fe0: 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 e & SSL_CB_HANDS
0ff0: 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 HAKE_DONE) {..ma
1000: 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 jor = "handshake
1010: 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e ";..minor = "don
1020: 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b e";. } else {
1030: 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 ..if (where & SS
1040: 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a L_CB_ALERT)..maj
1050: 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 or = "alert";..e
1060: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 lse if (where &
1070: 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 SSL_ST_CONNECT).
1080: 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 major = "connect
1090: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 ";..else if (whe
10a0: 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 re & SSL_ST_ACCE
10b0: 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 PT)..major = "ac
10c0: 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 cept";..else....
10d0: 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 .major = "unknow
10e0: 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 n";...if (where
10f0: 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 & SSL_CB_READ)..
1100: 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a minor = "read";.
1110: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 .else if (where
1120: 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 & SSL_CB_WRITE).
1130: 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 .minor = "write"
1140: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
1150: 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 e & SSL_CB_LOOP)
1160: 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 ..minor = "loop"
1170: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
1180: 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 e & SSL_CB_EXIT)
1190: 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 ..minor = "exit"
11a0: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f ;..else.....mino
11b0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 r = "unknown";.
11c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
11d0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
11e0: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 val with fn, cha
11f0: 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c n, major, minor,
1200: 20 6d 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79 message, and ty
1210: 70 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 pe args */. c
1220: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
1230: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
1240: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 r->callback);.
1250: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
1260: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1270: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
1280: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 ewStringObj("inf
1290: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 o", -1));. Tc
12a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
12b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
12c0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
12d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
12e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
12f0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
1300: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
1310: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1320: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1330: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
1340: 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 gObj(major, -1))
1350: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1360: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1370: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
1380: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1390: 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 minor, -1));..
13a0: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 if (where & SS
13b0: 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54 L_CB_ALERT) {..T
13c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
13d0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
13e0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
13f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
1400: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 L_alert_desc_str
1410: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d ing_long(ret), -
1420: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
1430: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1440: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
1450: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
1460: 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74 gObj(SSL_alert_t
1470: 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 ype_string_long(
1480: 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ret), -1));.
1490: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 } else {..Tcl_Li
14a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
14b0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
14c0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
14d0: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 tringObj(SSL_sta
14e0: 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 te_string_long(s
14f0: 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f sl), -1));..Tcl_
1500: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1510: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1520: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
1530: 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 ngObj("info", -1
1540: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ));. }.. /
1550: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
1560: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
1570: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
1580: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 cmdPtr);. Eva
1590: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
15a0: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
15b0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 tr);. Tcl_Dec
15c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
15d0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
1620: 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c *. * MessageCal
1630: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d lback --. *. *.M
1640: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74 onitors SSL prot
1650: 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a ocol messages. *
1660: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
1670: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
1680: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
1690: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
16a0: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d efined). *. *---
16b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 . */.#ifndef OPE
1700: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 NSSL_NO_SSL_TRAC
1710: 45 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65 E.static void.Me
1720: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e ssageCallback(in
1730: 74 20 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76 t write_p, int v
1740: 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74 ersion, int cont
1750: 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 ent_type, const
1760: 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f void *buf, size_
1770: 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c t len, SSL *ssl,
1780: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 void *arg) {.
1790: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
17a0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b r = (State*)arg;
17b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
17c0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
17d0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
17e0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
17f0: 0a 20 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20 . char *ver,
1800: 2a 74 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a *type;. BIO *
1810: 62 69 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75 bio;. char bu
1820: 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20 20 ffer[15000];.
1830: 20 62 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a buffer[0] = 0;.
1840: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
1850: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
1860: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
1870: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a ack == (Tcl_Obj*
1880: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
1890: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 ;. }.. swi
18a0: 74 63 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23 tch(version) {.#
18b0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
18c0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
18d0: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 100000L && !defi
18e0: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 ned(NO_SSL2) &&
18f0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
1900: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 _NO_SSL2). ca
1910: 73 65 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a se SSL2_VERSION:
1920: 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b ..ver = "SSLv2";
1930: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
1940: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
1950: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
1960: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
1970: 33 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 3). case SSL3
1980: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d _VERSION:..ver =
1990: 20 22 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b "SSLv3";..break
19a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 ;.#endif. cas
19b0: 65 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a e TLS1_VERSION:.
19c0: 09 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a .ver = "TLSv1";.
19d0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 .break;. case
19e0: 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a TLS1_1_VERSION:
19f0: 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31 ..ver = "TLSv1.1
1a00: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 ";..break;. c
1a10: 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49 ase TLS1_2_VERSI
1a20: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 ON:..ver = "TLSv
1a30: 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 1.2";..break;.
1a40: 20 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45 case TLS1_3_VE
1a50: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 RSION:..ver = "T
1a60: 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b LSv1.3";..break;
1a70: 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65 . case 0:..ve
1a80: 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 r = "none";..bre
1a90: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a ak;. default:
1aa0: 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e ..ver = "unknown
1ab0: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d ";..break;. }
1ac0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 63 6f .. switch (co
1ad0: 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20 ntent_type) {.
1ae0: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 case SSL3_RT_H
1af0: 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22 EADER:..type = "
1b00: 48 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b Header";..break;
1b10: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 . case SSL3_R
1b20: 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f T_INNER_CONTENT_
1b30: 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49 TYPE:..type = "I
1b40: 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70 nner Content Typ
1b50: 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 e";..break;.
1b60: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41 case SSL3_RT_CHA
1b70: 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a NGE_CIPHER_SPEC:
1b80: 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65 ..type = "Change
1b90: 20 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b Cipher";..break
1ba0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f ;. case SSL3_
1bb0: 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 RT_ALERT:..type
1bc0: 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61 = "Alert";..brea
1bd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 k;. case SSL3
1be0: 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 _RT_HANDSHAKE:..
1bf0: 74 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b type = "Handshak
1c00: 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 e";..break;.
1c10: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 case SSL3_RT_APP
1c20: 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 LICATION_DATA:..
1c30: 74 79 70 65 20 3d 20 22 41 70 70 20 44 61 74 61 type = "App Data
1c40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20 4f ";..break;.#if O
1c50: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
1c60: 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
1c70: 30 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54 4c 00L. case DTL
1c80: 53 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54 3a S1_RT_HEARTBEAT:
1c90: 0a 09 74 79 70 65 20 3d 20 22 48 65 61 72 74 62 ..type = "Heartb
1ca0: 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 eat";..break;.#e
1cb0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 ndif. default
1cc0: 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f :..type = "unkno
1cd0: 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 wn";. }..
1ce0: 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65 /* Needs compile
1cf0: 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e time option "en
1d00: 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e able-ssl-trace".
1d10: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f */. if ((bio
1d20: 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 = BIO_new(BIO_s
1d30: 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c _mem())) != NULL
1d40: 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c ) {..int n;..SSL
1d50: 5f 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20 _trace(write_p,
1d60: 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 version, content
1d70: 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c _type, buf, len,
1d80: 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69 ssl, (void *)bi
1d90: 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61 o);..n = BIO_rea
1da0: 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 d(bio, buffer, B
1db0: 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20 IO_pending(bio)
1dc0: 3c 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70 65 < 15000 ? BIO_pe
1dd0: 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34 39 nding(bio) : 149
1de0: 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 99);..n = (n<0)
1df0: 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65 72 ? 0 : n;..buffer
1e00: 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64 29 [n] = 0;..(void)
1e10: 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a BIO_flush(bio);.
1e20: 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a .BIO_free(bio);.
1e30: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
1e40: 66 28 22 4d 65 73 73 61 67 65 20 64 69 72 65 63 f("Message direc
1e50: 74 69 6f 6e 3d 25 64 2c 20 76 65 72 3d 25 73 2c tion=%d, ver=%s,
1e60: 20 74 79 70 65 3d 25 73 2c 20 6d 65 73 73 61 67 type=%s, messag
1e70: 65 3d 25 73 22 2c 20 77 72 69 74 65 5f 70 2c 20 e=%s", write_p,
1e80: 76 65 72 2c 20 74 79 70 65 2c 20 26 62 75 66 66 ver, type, &buff
1e90: 65 72 5b 30 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 er[0]);.. /*
1ea0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
1eb0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
1ec0: 63 68 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e 2c chan, direction,
1ed0: 20 76 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c 20 version, type,
1ee0: 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 73 and message args
1ef0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
1f00: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
1f10: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c j(statePtr->call
1f20: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c back);. Tcl_L
1f30: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1f40: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1f50: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
1f60: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20 gObj("message",
1f70: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
1f80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1f90: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1fa0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
1fb0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
1fc0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
1fd0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
1fe0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
1ff0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2000: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2010: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2020: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74 (write_p ? "Sent
2030: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20 " : "Received",
2040: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
2050: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2060: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2070: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2080: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20 Obj(ver, -1));.
2090: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
20a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
20b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
20c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70 NewStringObj(typ
20d0: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c e, -1));. Tcl
20e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
20f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
2100: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
2110: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d ingObj(buffer, -
2120: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 1));.. /* Eva
2130: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
2140: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
2150: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
2160: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
2170: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
2180: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
2190: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
21a0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a ount(cmdPtr);.}.
21b0: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d #endif.../*. *--
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2200: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 -. *. * VerifyCa
2210: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 llback --. *. *.
2220: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 Monitors SSL cer
2230: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 tificate validat
2240: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65 ion process. Use
2250: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 d to control the
2260: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65 . *.behavior whe
2270: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59 n the SSL_VERIFY
2280: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65 _PEER flag is se
2290: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 t. This is calle
22a0: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20 d. *.whenever a
22b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 certificate is i
22c0: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69 nspected or deci
22d0: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c ded invalid. Cal
22e0: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20 led for. *.each
22f0: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74 certificate in t
2300: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20 he cert chain..
2310: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 *. * Checks:. *.
2320: 54 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 The certificate
2330: 63 68 61 69 6e 20 69 73 20 63 68 65 63 6b 65 64 chain is checked
2340: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 starting with t
2350: 68 65 20 64 65 65 70 65 73 74 20 6e 65 73 74 69 he deepest nesti
2360: 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74 ng level. *. (t
2370: 68 65 20 72 6f 6f 74 20 43 41 20 63 65 72 74 69 he root CA certi
2380: 66 69 63 61 74 65 29 20 61 6e 64 20 77 6f 72 6b ficate) and work
2390: 65 64 20 75 70 77 61 72 64 20 74 6f 20 74 68 65 ed upward to the
23a0: 20 70 65 65 72 27 73 20 63 65 72 74 69 66 69 63 peer's certific
23b0: 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e ate.. *.All sign
23c0: 61 74 75 72 65 73 20 61 72 65 20 76 61 6c 69 64 atures are valid
23d0: 2c 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 69 , current time i
23e0: 73 20 77 69 74 68 69 6e 20 66 69 72 73 74 20 61 s within first a
23f0: 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 69 74 79 nd last validity
2400: 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20 time.. *.Check
2410: 74 68 61 74 20 74 68 65 20 63 65 72 74 69 66 69 that the certifi
2420: 63 61 74 65 20 69 73 20 69 73 73 75 65 64 20 62 cate is issued b
2430: 79 20 74 68 65 20 69 73 73 75 65 72 20 63 65 72 y the issuer cer
2440: 74 69 66 69 63 61 74 65 20 69 73 73 75 65 72 2e tificate issuer.
2450: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 72 65 . *.Check the re
2460: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 20 vocation status
2470: 66 6f 72 20 65 61 63 68 20 63 65 72 74 69 66 69 for each certifi
2480: 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 cate.. *.Check t
2490: 68 65 20 76 61 6c 69 64 69 74 79 20 6f 66 20 74 he validity of t
24a0: 68 65 20 67 69 76 65 6e 20 43 52 4c 20 61 6e 64 he given CRL and
24b0: 20 74 68 65 20 63 65 72 74 20 72 65 76 6f 63 61 the cert revoca
24c0: 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09 tion status.. *.
24d0: 43 68 65 63 6b 20 74 68 65 20 70 6f 6c 69 63 69 Check the polici
24e0: 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 65 es of all the ce
24f0: 72 74 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a rtificates. *. *
2500: 20 41 72 67 73 0a 20 2a 09 70 72 65 76 65 72 69 Args. *.preveri
2510: 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73 20 fy_ok indicates
2520: 77 68 65 74 68 65 72 20 74 68 65 20 63 65 72 74 whether the cert
2530: 69 66 69 63 61 74 65 20 76 65 72 69 66 69 63 61 ificate verifica
2540: 74 69 6f 6e 20 70 61 73 73 65 64 20 28 31 29 20 tion passed (1)
2550: 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a or not (0). *. *
2560: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 Results:. *.A c
2570: 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f allback bound to
2580: 20 74 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 the socket may
2590: 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 return one of:.
25a0: 2a 09 20 20 20 20 30 09 09 09 2d 20 74 68 65 20 *. 0...- the
25b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64 certificate is d
25c0: 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20 73 eemed invalid, s
25d0: 65 6e 64 20 76 65 72 69 66 69 63 61 74 69 6f 6e end verification
25e0: 0a 20 2a 09 09 09 09 20 20 66 61 69 6c 75 72 65 . *.... failure
25f0: 20 61 6c 65 72 74 20 74 6f 20 70 65 65 72 2c 20 alert to peer,
2600: 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 20 68 61 and terminate ha
2610: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 ndshake.. *.
2620: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 1...- the certif
2630: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 icate is deemed
2640: 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20 valid, continue
2650: 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a with handshake..
2660: 20 2a 09 20 20 20 20 65 6d 70 74 79 20 73 74 72 *. empty str
2670: 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20 ing.- no change
2680: 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 20 76 to certificate v
2690: 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 alidation. *. *
26a0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
26b0: 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f .The err field o
26c0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 f the currently
26d0: 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20 operative State
26e0: 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 is set. *. to a
26f0: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 string describi
2700: 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 ng the SSL negot
2710: 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 iation failure r
2720: 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d eason. *. *-----
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2770: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 */.static int.Ve
2780: 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74 rifyCallback(int
2790: 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f ok, X509_STORE_
27a0: 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 20 20 20 CTX *ctx) {.
27b0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
27c0: 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 . SSL *ssl.
27d0: 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 .= (SSL*)X509_ST
27e0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 ORE_CTX_get_ex_d
27f0: 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 ata(ctx, SSL_get
2800: 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 _ex_data_X509_ST
2810: 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a ORE_CTX_idx());.
2820: 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74 09 X509 *cert.
2830: 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 .= X509_STORE_CT
2840: 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 X_get_current_ce
2850: 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61 rt(ctx);. Sta
2860: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 te *statePtr.= (
2870: 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 State*)SSL_get_a
2880: 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 pp_data(ssl);.
2890: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
28a0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
28b0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 >interp;. int
28c0: 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 depth..= X509_S
28d0: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 TORE_CTX_get_err
28e0: 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 or_depth(ctx);.
28f0: 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 int err..= X5
2900: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
2910: 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20 _error(ctx);..
2920: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
2930: 64 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 d");. dprintf
2940: 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b ("VerifyCallback
2950: 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 : %d", ok);..
2960: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
2970: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a cmd == (Tcl_Obj*
2980: 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65 )NULL) {../* Use
2990: 20 6f 6b 20 76 61 6c 75 65 20 69 66 20 76 65 72 ok value if ver
29a0: 69 66 69 63 61 74 69 6f 6e 20 69 73 20 72 65 71 ification is req
29b0: 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 28 73 74 uired */..if (st
29c0: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 atePtr->vflags &
29d0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
29e0: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
29f0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ) {.. return
2a00: 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 ok;..} else {..
2a10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a return 1;..}.
2a20: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
2a30: 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 ert == NULL || s
2a40: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 sl == NULL) {..r
2a50: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a eturn 0;. }..
2a60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 dprintf("Ver
2a70: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 63 72 65 ifyCallback: cre
2a80: 61 74 65 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d ate callback com
2a90: 6d 61 6e 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 mand");.. /*
2aa0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
2ab0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
2ac0: 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 chan, depth, cer
2ad0: 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 t info list, sta
2ae0: 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 tus, and error a
2af0: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 rgs */. cmdPt
2b00: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
2b10: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
2b20: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
2b30: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2b40: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2b50: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2b60: 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 Obj("verify", -1
2b70: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2b80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2b90: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2ba0: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f ..Tcl_NewStringO
2bb0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
2bc0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
2bd0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
2be0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2bf0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2c00: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
2c10: 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b wIntObj(depth));
2c20: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2c30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2c40: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c terp, cmdPtr, Tl
2c50: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 s_NewX509Obj(int
2c60: 65 72 70 2c 20 63 65 72 74 2c 20 30 29 29 3b 0a erp, cert, 0));.
2c70: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2c80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2c90: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
2ca0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b _NewIntObj(ok));
2cb0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2cc0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2cd0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 terp, cmdPtr,..T
2ce0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2cf0: 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69 (char*)X509_veri
2d00: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 fy_cert_error_st
2d10: 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b ring(err), -1));
2d20: 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 .. /* Prevent
2d30: 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 I/O while callb
2d40: 61 63 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65 ack is in progre
2d50: 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 ss */. /* sta
2d60: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 tePtr->flags |=
2d70: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b TLS_TCL_CALLBACK
2d80: 3b 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 ; */.. dprint
2d90: 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 f("VerifyCallbac
2da0: 6b 3a 20 65 76 61 6c 20 63 61 6c 6c 62 61 63 6b k: eval callback
2db0: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c ");.. /* Eval
2dc0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
2dd0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
2de0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
2df0: 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c );. ok = Eval
2e00: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c Callback(interp,
2e10: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 statePtr, cmdPt
2e20: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 r);. Tcl_Decr
2e30: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
2e40: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
2e50: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 VerifyCallback:
2e60: 63 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74 20 3d command result =
2e70: 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 %d", ok);..
2e80: 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 /* statePtr->fla
2e90: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f gs &= ~(TLS_TCL_
2ea0: 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 CALLBACK); */.
2eb0: 20 20 72 65 74 75 72 6e 20 6f 6b 3b 09 2f 2a 20 return ok;./*
2ec0: 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61 76 By default, leav
2ed0: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75 e verification u
2ee0: 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c nchanged. */.}..
2ef0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2f40: 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a Tls_Error --. *.
2f50: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
2f60: 6b 20 77 69 74 68 20 65 72 72 6f 72 20 6d 65 73 k with error mes
2f70: 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sage.. *. * Side
2f80: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 effects:. *.The
2f90: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 err field of th
2fa0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 e currently oper
2fb0: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 ative State is s
2fc0: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 et. *. to a str
2fd0: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 ing describing t
2fe0: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 he SSL negotiati
2ff0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f on failure reaso
3000: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d n. *. *---------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 ----------. */.v
3050: 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 oid.Tls_Error(St
3060: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 ate *statePtr, c
3070: 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73 67 29 20 onst char *msg)
3080: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 {. Tcl_Interp
3090: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
30a0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
30b0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
30c0: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 , *listPtr;.
30d0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72 unsigned long er
30e0: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d r;. statePtr-
30f0: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 >err = msg;..
3100: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
3110: 20 77 69 74 68 20 6d 65 73 73 61 67 65 20 25 73 with message %s
3120: 22 2c 20 6d 73 67 29 3b 0a 0a 20 20 20 20 69 66 ", msg);.. if
3130: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
3140: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
3150: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
3160: 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 n;. }.. dp
3170: 72 69 6e 74 66 28 22 54 6c 73 5f 45 72 72 6f 72 rintf("Tls_Error
3180: 3a 20 63 72 65 61 74 65 20 63 61 6c 6c 62 61 63 : create callbac
3190: 6b 20 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 20 20 k command");..
31a0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
31b0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 and to eval with
31c0: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d fn, chan, and m
31d0: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 essage args */.
31e0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
31f0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
3200: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
3210: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3220: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3230: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3240: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
3250: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 "error", -1));.
3260: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3270: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3280: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
3290: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
32a0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
32b0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
32c0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
32d0: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 if (msg != NULL)
32e0: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
32f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3300: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
3310: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 _NewStringObj(ms
3320: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 g, -1));.. }
3330: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 else if ((msg =
3340: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63 Tcl_GetString(Tc
3350: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
3360: 6e 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c nterp))) != NULL
3370: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ) {..Tcl_ListObj
3380: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3390: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
33a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
33b0: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d sg, -1));.. }
33c0: 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72 else {..listPtr
33d0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
33e0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 j(0, NULL);..whi
33f0: 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67 le ((err = ERR_g
3400: 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30 et_error()) != 0
3410: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
3420: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3430: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 t(interp, listPt
3440: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
3450: 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65 Obj(ERR_reason_e
3460: 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 rror_string(err)
3470: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f , -1));..}..Tcl_
3480: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3490: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
34a0: 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 Ptr, listPtr);.
34b0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
34c0: 66 28 22 54 6c 73 5f 45 72 72 6f 72 3a 20 65 76 f("Tls_Error: ev
34d0: 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a al callback");..
34e0: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
34f0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
3500: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
3510: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
3520: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 EvalCallback(i
3530: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
3540: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 cmdPtr);. Tc
3550: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
3560: 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 mdPtr);.}.../*.
3570: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35b0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f ----. *. * KeyLo
35c0: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a gCallback --. *.
35d0: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 *.Write receive
35e0: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f d key data to lo
35f0: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 g file.. *. * Si
3600: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
3610: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d one. *. *-------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3660: 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c .void KeyLogCall
3670: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a back(const SSL *
3680: 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 ssl, const char
3690: 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 *line) {. cha
36a0: 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 r *str = getenv(
36b0: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a SSLKEYLOGFILE);.
36c0: 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 FILE *fd;..
36d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
36e0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
36f0: 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 tr) {..fd = fope
3700: 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 n(str, "a");..fp
3710: 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 rintf(fd, "%s\n"
3720: 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 ,line);..fclose(
3730: 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f fd);. }.}.../
3740: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 -------. *. * Pa
3790: 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 ssword Callback
37a0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
37b0: 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 when a password
37c0: 69 73 20 6e 65 65 64 65 64 20 66 6f 72 20 61 20 is needed for a
37d0: 70 72 69 76 61 74 65 20 6b 65 79 20 77 68 65 6e private key when
37e0: 20 6c 6f 61 64 69 6e 67 0a 20 2a 09 6f 72 20 73 loading. *.or s
37f0: 74 6f 72 69 6e 67 20 61 20 50 45 4d 20 63 65 72 toring a PEM cer
3800: 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e tificate with en
3810: 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 cryption. Evals
3820: 63 61 6c 6c 62 61 63 6b 0a 20 2a 09 73 63 72 69 callback. *.scri
3830: 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 pt and returns t
3840: 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 he result as the
3850: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 password string
3860: 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 in buf.. *. * R
3870: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
3880: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
3890: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
38a0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
38b0: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 d). *. * Returns
38c0: 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 :. *.Password si
38d0: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d ze in bytes or -
38e0: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 1 for an error..
38f0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
3940: 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 tic int.Password
3950: 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 Callback(char *b
3960: 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e uf, int size, in
3970: 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a t rwflag, void *
3980: 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 udata) {. Sta
3990: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 te *statePtr.= (
39a0: 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a State *) udata;.
39b0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
39c0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
39d0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
39e0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
39f0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 int code;.
3a00: 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a Tcl_Size len;.
3a10: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
3a20: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 lled");.. /*
3a30: 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 If no callback,
3a40: 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c use default call
3a50: 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 back */. if (
3a60: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
3a70: 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 rd == NULL) {..i
3a80: 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e f (Tcl_EvalEx(in
3a90: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 terp, "tls::pass
3aa0: 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 word", -1, TCL_E
3ab0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 VAL_GLOBAL) == T
3ac0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 CL_OK) {.. ch
3ad0: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 ar *ret = (char
3ae0: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 *) Tcl_GetString
3af0: 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f FromObj(Tcl_GetO
3b00: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 bjResult(interp)
3b10: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 , &len);.. if
3b20: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a (len > (Tcl_Siz
3b30: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 09 6c e) size-1) {...l
3b40: 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 en = (Tcl_Size)
3b50: 73 69 7a 65 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 size-1;.. }..
3b60: 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c strncpy(buf,
3b70: 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c ret, (size_t) l
3b80: 65 6e 29 3b 0a 09 20 20 20 20 62 75 66 5b 6c 65 en);.. buf[le
3b90: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 20 20 20 20 n] = '\0';..
3ba0: 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e return (int) len
3bb0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
3bc0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 return -1;..}.
3bd0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
3be0: 66 28 22 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 f("PasswordCallb
3bf0: 61 63 6b 3a 20 63 72 65 61 74 65 20 63 61 6c 6c ack: create call
3c00: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 22 29 3b 0a back command");.
3c10: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
3c20: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 ommand to eval w
3c30: 69 74 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c 20 ith fn, rwflag,
3c40: 61 6e 64 20 73 69 7a 65 20 61 72 67 73 20 2a 2f and size args */
3c50: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 . cmdPtr = Tc
3c60: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
3c70: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
3c80: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
3c90: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3ca0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3cb0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3cc0: 6a 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 j("password", -1
3cd0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
3ce0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3cf0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3d00: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 Tcl_NewIntObj(r
3d10: 77 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c wflag));. Tcl
3d20: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3d30: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3d40: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 dPtr, Tcl_NewInt
3d50: 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 Obj(size));..
3d60: 20 64 70 72 69 6e 74 66 28 22 50 61 73 73 77 6f dprintf("Passwo
3d70: 72 64 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61 6c rdCallback: eval
3d80: 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 callback");..
3d90: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
3da0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
3db0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 rp);. Tcl_Pre
3dc0: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 serve((ClientDat
3dd0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
3de0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
3df0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 ack command */.
3e00: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
3e10: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
3e20: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c code = Tcl_Eval
3e30: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d ObjEx(interp, cm
3e40: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 dPtr, TCL_EVAL_G
3e50: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 LOBAL);. if (
3e60: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 code != TCL_OK)
3e70: 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 {.#if (TCL_MAJOR
3e80: 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 _VERSION == 8) &
3e90: 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 & (TCL_MINOR_VER
3ea0: 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 SION < 6)..Tcl_B
3eb0: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 ackgroundError(i
3ec0: 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 nterp);.#else..T
3ed0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 cl_BackgroundExc
3ee0: 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 eption(interp, c
3ef0: 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 ode);.#endif.
3f00: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 }. Tcl_DecrR
3f10: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
3f20: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 .. Tcl_Releas
3f30: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
3f40: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f tatePtr);.. /
3f50: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c * If successful,
3f60: 20 70 61 73 73 20 62 61 63 6b 20 70 61 73 73 77 pass back passw
3f70: 6f 72 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74 ord string and t
3f80: 72 75 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c runcate if too l
3f90: 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 ong */. if (c
3fa0: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b ode == TCL_OK) {
3fb0: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 ..char *ret = (c
3fc0: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 har *) Tcl_GetSt
3fd0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f ringFromObj(Tcl_
3fe0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 GetObjResult(int
3ff0: 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 erp), &len);..if
4000: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a (len > (Tcl_Siz
4010: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20 e) size-1) {..
4020: 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a len = (Tcl_Siz
4030: 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 e) size-1;..}..s
4040: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c trncpy(buf, ret,
4050: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a (size_t) len);.
4060: 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 .buf[len] = '\0'
4070: 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 ;..Tcl_Release((
4080: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
4090: 72 70 29 3b 0a 09 72 65 74 75 72 6e 20 28 69 6e rp);..return (in
40a0: 74 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 t) len;. }.
40b0: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 Tcl_Release((C
40c0: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 lientData) inter
40d0: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d p);. return -
40e0: 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 1;.}.../*. *----
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4130: 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 *. * Session Ca
4140: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e llback for Clien
4150: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c ts --. *. *.Call
4160: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 73 65 ed when a new se
4170: 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 ssion is added t
4180: 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 6e 20 o the cache. In
4190: 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 TLS 1.3. *.this
41a0: 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 64 20 may be received
41b0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 multiple times a
41c0: 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 fter the handsha
41d0: 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 ke. For. *.earli
41e0: 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 er versions, thi
41f0: 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76 s will be receiv
4200: 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 61 ed during the ha
4210: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 ndshake.. *.This
4220: 20 69 73 20 74 68 65 20 70 72 65 66 65 72 72 65 is the preferre
4230: 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 d way to obtain
4240: 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 73 73 a resumable sess
4250: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ion.. *. * Resul
4260: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
4270: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
4280: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
4290: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
42a0: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 *. * Return code
42b0: 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 s:. *.0 = error
42c0: 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 77 69 where session wi
42d0: 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c ll be immediatel
42e0: 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 y removed from t
42f0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 he internal cach
4300: 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 65 73 e.. *.1 = succes
4310: 73 20 77 68 65 72 65 20 61 70 70 20 72 65 74 61 s where app reta
4320: 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 ins session in s
4330: 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e ession cache, an
4340: 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f d must call SSL_
4350: 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 SESSION_free() w
4360: 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d hen done.. *. *-
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43b0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
43c0: 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 t.SessionCallbac
43d0: 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f k(SSL *ssl, SSL_
43e0: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e SESSION *session
43f0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
4400: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
4410: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
4420: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a ta((SSL *)ssl);.
4430: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
4440: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
4450: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
4460: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
4470: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
4480: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
4490: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
44a0: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f ned char *sessio
44b0: 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 n_id;. size_t
44c0: 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 len2;. unsig
44d0: 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 ned int ulen;..
44e0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
44f0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
4500: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
4510: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e k == (Tcl_Obj*)N
4520: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
4530: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
4540: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
4550: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl == NULL) {.
4560: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4570: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
4580: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
4590: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
45a0: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e al with fn, chan
45b0: 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 73 65 , session id, se
45c0: 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61 6e ssion ticket, an
45d0: 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67 73 20 d lifetime args
45e0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
45f0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
4600: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
4610: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ack);. Tcl_Li
4620: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4630: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4640: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4650: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d Obj("session", -
4660: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
4670: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4680: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4690: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
46a0: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
46b0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
46c0: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
46d0: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f ;.. /* Sessio
46e0: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 n id */. sess
46f0: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 ion_id = SSL_SES
4700: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 SION_get_id(sess
4710: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 ion, &ulen);.
4720: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4730: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4740: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4750: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 wByteArrayObj(se
4760: 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 ssion_id, (Tcl_S
4770: 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 ize) ulen));..
4780: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 /* Session tic
4790: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 ket */. SSL_S
47a0: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b ESSION_get0_tick
47b0: 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 et(session, &tic
47c0: 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 ket, &len2);.
47d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
47e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
47f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4800: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 wByteArrayObj(ti
4810: 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 cket, (Tcl_Size)
4820: 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a len2));.. /*
4830: 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 Lifetime - numb
4840: 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f er of seconds */
4850: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4860: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4870: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 terp, cmdPtr,..T
4880: 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c cl_NewLongObj((l
4890: 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e ong) SSL_SESSION
48a0: 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 _get_ticket_life
48b0: 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f time_hint(sessio
48c0: 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 n)));.. /* Ev
48d0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
48e0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
48f0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
4900: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c tr);. EvalCal
4910: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
4920: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b atePtr, cmdPtr);
4930: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
4940: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a Count(cmdPtr);..
4950: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 30 20 /* Return 0
4960: 66 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 73 65 for now until se
4970: 73 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 69 ssion handling i
4980: 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 s complete */.
4990: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a return 0;.}...
49a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 --------. *. * A
49f0: 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 LPN Callback for
4a00: 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e Servers and NPN
4a10: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c Callback for Cl
4a20: 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 ients --. *. *.P
4a30: 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 erform protocol
4a40: 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 (http/1.1, h2, h
4a50: 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 3, etc.) selecti
4a60: 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e on for the. *.in
4a70: 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f coming connectio
4a80: 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 n. Called after
4a90: 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 Hello and server
4aa0: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 callbacks.. *.W
4ab0: 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65 here 'out' is se
4ac0: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
4ad0: 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20 and 'in' is the
4ae0: 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20 peer advertised
4af0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 list.. *. * Resu
4b00: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
4b10: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
4b20: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
4b30: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
4b40: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
4b50: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
4b60: 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 T_ERR_OK: ALPN p
4b70: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
4b80: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
4b90: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
4ba0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
4bb0: 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 ERT_FATAL: There
4bc0: 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 was no overlap
4bd0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 between the clie
4be0: 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 nt's. *. supp
4bf0: 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 lied list and th
4c00: 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 e server configu
4c10: 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e ration. The conn
4c20: 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 ection will be a
4c30: 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 borted.. *.SSL_T
4c40: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a LSEXT_ERR_NOACK:
4c50: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e ALPN protocol n
4c60: 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 ot selected, e.g
4c70: 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c ., because no AL
4c80: 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 PN. *. protoc
4c90: 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 ols are configur
4ca0: 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e ed for this conn
4cb0: 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e ection. The conn
4cc0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
4cd0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
4d20: 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 tatic int.ALPNCa
4d30: 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c llback(SSL *ssl,
4d40: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
4d50: 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 char **out, unsi
4d60: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 gned char *outle
4d70: 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e n,..const unsign
4d80: 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 ed char *in, uns
4d90: 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c igned int inlen,
4da0: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 void *arg) {.
4db0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
4dc0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b r = (State*)arg;
4dd0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
4de0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
4df0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
4e00: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
4e10: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 . int code, r
4e20: 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 es;.. dprintf
4e30: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
4e40: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
4e50: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 || arg == NULL)
4e60: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
4e70: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
4e80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
4e90: 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a elect protocol *
4ea0: 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65 /. if (SSL_se
4eb0: 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 lect_next_proto(
4ec0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
4ed0: 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 *) out, outlen,
4ee0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
4ef0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 , statePtr->prot
4f00: 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c os_len,..in, inl
4f10: 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e en) == OPENSSL_N
4f20: 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b PN_NEGOTIATED) {
4f30: 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 ../* Match found
4f40: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 */..res = SSL_T
4f50: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 LSEXT_ERR_OK;.
4f60: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f } else {../* O
4f70: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 PENSSL_NPN_NO_OV
4f80: 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c ERLAP = No overl
4f90: 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 ap, so use first
4fa0: 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e item from clien
4fb0: 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 t protocol list
4fc0: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c */..res = SSL_TL
4fd0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4fe0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
4ff0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d tatePtr->vcmd ==
5000: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 (Tcl_Obj*)NULL)
5010: 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a {..return res;.
5020: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
5030: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
5040: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 eval with fn, ch
5050: 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20 an, depth, cert
5060: 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 info list, statu
5070: 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67 s, and error arg
5080: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 s */. cmdPtr
5090: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
50a0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d bj(statePtr->vcm
50b0: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
50c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
50d0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
50e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
50f0: 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a j("alpn", -1));.
5100: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
5110: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
5120: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
5130: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
5140: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
5150: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
5160: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
5170: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5180: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5190: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
51a0: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73 wStringObj((cons
51b0: 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c 20 t char *) *out,
51c0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
51d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
51e0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
51f0: 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 r, Tcl_NewBoolea
5200: 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f nObj(res == SSL_
5210: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b TLSEXT_ERR_OK));
5220: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
5230: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
5240: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
5250: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
5260: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 if ((code =
5270: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
5280: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
5290: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 mdPtr)) > 1) {..
52a0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
52b0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
52c0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 } else if (code
52d0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 1) {..res = S
52e0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
52f0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
5300: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
5310: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
5320: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
5330: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
5340: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
5350: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d res;.}.../*. *-
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53a0: 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 --. *. * Adverti
53b0: 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c se Protocols Cal
53c0: 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 lback for Next P
53d0: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 rotocol Negotiat
53e0: 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 ion (NPN) in Ser
53f0: 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 verHello --. *.
5400: 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 *.called when a
5410: 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73 TLS server needs
5420: 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f a list of suppo
5430: 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 rted protocols f
5440: 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f or Next. *.Proto
5450: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e col Negotiation.
5460: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
5470: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
5480: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 de effects:. *.
5490: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
54a0: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
54b0: 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 R_OK: NPN protoc
54c0: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 ol selected. The
54d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
54e0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c inues.. *.SSL_TL
54f0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 SEXT_ERR_NOACK:
5500: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 NPN protocol not
5510: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 selected. The c
5520: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
5530: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ues.. *. *------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
5580: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e /.#ifdef USE_NPN
5590: 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 .static int.NPNC
55a0: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
55b0: 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e L *ssl, const un
55c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 signed char **ou
55d0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 t, unsigned int
55e0: 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 *outlen, void *a
55f0: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 rg) {. State
5600: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
5610: 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 te*)arg;.. dp
5620: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
5630: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d .. if (ssl ==
5640: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 NULL || arg ==
5650: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
5660: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
5670: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 OACK;. }..
5680: 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c /* Set protocol
5690: 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 s list */. if
56a0: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 (statePtr->prot
56b0: 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a os != NULL) {..*
56c0: 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e out = statePtr->
56d0: 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e protos;..*outlen
56e0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f = statePtr->pro
56f0: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 tos_len;. } e
5700: 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 lse {..*out = NU
5710: 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 LL;..*outlen = 0
5720: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c ;..return SSL_TL
5730: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
5740: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
5750: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5760: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f OK;.}.#endif.../
5770: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e -------. *. * SN
57c0: 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 I Callback for S
57d0: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 ervers --. *. *.
57e0: 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 Perform server-s
57f0: 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 ide SNI hostname
5800: 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 selection after
5810: 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65 receiving SNI e
5820: 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 xtension. *.in C
5830: 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c lient Hello. Cal
5840: 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 led after hello
5850: 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 callback but bef
5860: 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 ore ALPN callbac
5870: 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 k.. *. * Results
5880: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.None. *. *
5890: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
58a0: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 .Calls callback
58b0: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a (if defined). *.
58c0: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a * Return codes:
58d0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
58e0: 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e RR_OK: SNI hostn
58f0: 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e ame is accepted.
5900: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
5910: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
5920: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 L_TLSEXT_ERR_ALE
5930: 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f RT_FATAL: SNI ho
5940: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 stname is not ac
5950: 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e cepted. The conn
5960: 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 ection. *. is
5970: 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c aborted. Defaul
5980: 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 t for alert is S
5990: 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a SL_AD_UNRECOGNIZ
59a0: 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f ED_NAME.. *.SSL_
59b0: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 TLSEXT_ERR_ALERT
59c0: 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f _WARNING: SNI ho
59d0: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 stname is not ac
59e0: 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 cepted, warning
59f0: 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e alert. *. sen
5a00: 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 t (not supported
5a10: 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 in TLSv1.3). Th
5a20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
5a30: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 tinues.. *.SSL_T
5a40: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a LSEXT_ERR_NOACK:
5a50: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 SNI hostname is
5a60: 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e not accepted an
5a70: 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 d not acknowledg
5a80: 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 ed,. *. e.g.
5a90: 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 if SNI has not b
5aa0: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 een configured.
5ab0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
5ac0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d ontinues.. *. *-
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b10: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
5b20: 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f t.SNICallback(co
5b30: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e nst SSL *ssl, in
5b40: 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a t *alert, void *
5b50: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 arg) {. State
5b60: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
5b70: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 ate*)arg;. Tc
5b80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
5b90: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
5ba0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
5bb0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e *cmdPtr;. in
5bc0: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 t code, res;.
5bd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 const char *ser
5be0: 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a vername = NULL;.
5bf0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
5c00: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
5c10: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 (ssl == NULL ||
5c20: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 arg == NULL) {..
5c30: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
5c40: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
5c50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 }.. /* Only
5c60: 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e works for TLS 1.
5c70: 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 2 and earlier */
5c80: 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 . servername
5c90: 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 = SSL_get_server
5ca0: 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 name(ssl, TLSEXT
5cb0: 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e _NAMETYPE_host_n
5cc0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 ame);. if (!s
5cd0: 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 ervername || ser
5ce0: 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c vername[0] == '\
5cf0: 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 0') {..return SS
5d00: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
5d10: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 CK;. }.. i
5d20: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d f (statePtr->vcm
5d30: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e d == (Tcl_Obj*)N
5d40: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
5d50: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
5d60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
5d70: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
5d80: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
5d90: 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 chan, and server
5da0: 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 name args */.
5db0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
5dc0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
5dd0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
5de0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5df0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5e00: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
5e10: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 wStringObj("sni"
5e20: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
5e30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5e40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5e50: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
5e60: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
5e70: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
5e80: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
5e90: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
5ea0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
5eb0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
5ec0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
5ed0: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 bj(servername ,
5ee0: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 -1));.. /* Ev
5ef0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
5f00: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
5f10: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
5f20: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f tr);. if ((co
5f30: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 de = EvalCallbac
5f40: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
5f50: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 tr, cmdPtr)) > 1
5f60: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 ) {..res = SSL_T
5f70: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
5f80: 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 WARNING;..*alert
5f90: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f = SSL_AD_UNRECO
5fa0: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 GNIZED_NAME; /*
5fb0: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 Not supported by
5fc0: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 TLS 1.3 */.
5fd0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 } else if (code
5fe0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 1) {..res = S
5ff0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
6000: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
6010: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
6020: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
6030: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f ;..*alert = SSL_
6040: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f AD_UNRECOGNIZED_
6050: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 NAME; /* Not sup
6060: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e ported by TLS 1.
6070: 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 3 */. }. T
6080: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
6090: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 cmdPtr);. ret
60a0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a urn res;.}.../*.
60b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60f0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 -----. *. * Clie
6100: 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b ntHello Handshak
6110: 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 e Callback for S
6120: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 ervers --. *. *.
6130: 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74 Used by server t
6140: 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65 o examine the se
6150: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 rver name indica
6160: 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e tion (SNI) exten
6170: 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 sion. *.provided
6180: 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69 by the client i
6190: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63 n order to selec
61a0: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 t an appropriate
61b0: 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a certificate to.
61c0: 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 *.present, and
61d0: 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 make other confi
61e0: 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d guration adjustm
61f0: 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f ents relevant to
6200: 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09 that server. *.
6210: 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e name and its con
6220: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 figuration. This
6230: 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69 includes swappi
6240: 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63 ng out the assoc
6250: 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 iated. *.SSL_CTX
6260: 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 pointer, modify
6270: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 ing the server's
6280: 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74 list of permitt
6290: 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c ed TLS versions,
62a0: 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65 . *.changing the
62b0: 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72 server's cipher
62c0: 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 list in respons
62d0: 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 e to the client'
62e0: 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65 s cipher list, e
62f0: 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 tc.. *.Called be
6300: 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 fore SNI and ALP
6310: 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a N callbacks.. *.
6320: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
6330: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
6340: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
6350: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
6360: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
6370: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
6380: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 L_CLIENT_HELLO_R
6390: 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68 ETRY: suspend th
63a0: 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 e handshake, and
63b0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 the handshake f
63c0: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 unction will ret
63d0: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a urn immediately.
63e0: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 *.SSL_CLIENT_HE
63f0: 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 LLO_ERROR: failu
6400: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f re, terminate co
6410: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c nnection. Set al
6420: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 ert to error cod
6430: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 e.. *.SSL_CLIENT
6440: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 _HELLO_SUCCESS:
6450: 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d success. *. *---
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64a0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
64b0: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53 HelloCallback(SS
64c0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
64d0: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
64e0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
64f0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
6500: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
6510: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
6520: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
6530: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
6540: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
6550: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 , res;. const
6560: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
6570: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
6580: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 igned char *p;.
6590: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 size_t len, r
65a0: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 emaining;.. d
65b0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
65c0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
65d0: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 Ptr->vcmd == (Tc
65e0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
65f0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6600: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b T_HELLO_SUCCESS;
6610: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
6620: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 ssl == (const SS
6630: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 L *)NULL || arg
6640: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 == (void *)NULL)
6650: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 {..return SSL_C
6660: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6670: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6680: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 Get names */.
6690: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e if (!SSL_clien
66a0: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 t_hello_get0_ext
66b0: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 (ssl, TLSEXT_TYP
66c0: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 E_server_name, &
66d0: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c p, &remaining) |
66e0: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 | remaining <= 2
66f0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 ) {..*alert = SS
6700: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f L_R_SSLV3_ALERT_
6710: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 ILLEGAL_PARAMETE
6720: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 R;..return SSL_C
6730: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6740: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6750: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e Extract the len
6760: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c gth of the suppl
6770: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 ied list of name
6780: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 s. */. len =
6790: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 (*(p++) << 8);.
67a0: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 len += *(p++)
67b0: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 ;. if (len +
67c0: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 2 != remaining)
67d0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
67e0: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c R_SSLV3_ALERT_IL
67f0: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b LEGAL_PARAMETER;
6800: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
6810: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
6820: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 . }. remai
6830: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 ning = len;..
6840: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 /* The list in
6850: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 practice only ha
6860: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 s a single eleme
6870: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 nt, so we only c
6880: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 onsider the firs
6890: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 t one. */. if
68a0: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 (remaining == 0
68b0: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 || *p++ != TLSE
68c0: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 XT_NAMETYPE_host
68d0: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 _name) {..*alert
68e0: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
68f0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
6900: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c ROR;..return SSL
6910: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6920: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
6930: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 emaining--;..
6940: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 /* Now we can f
6950: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 inally pull out
6960: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 the byte array w
6970: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 ith the actual h
6980: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 ostname. */.
6990: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d if (remaining <=
69a0: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 2) {..*alert =
69b0: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
69c0: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 T_INTERNAL_ERROR
69d0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
69e0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
69f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 ;. }. len
6a00: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b = (*(p++) << 8);
6a10: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b . len += *(p+
6a20: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 +);. if (len
6a30: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 + 2 > remaining)
6a40: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
6a50: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
6a60: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 NTERNAL_ERROR;..
6a70: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6a80: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
6a90: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
6aa0: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 ng = len;. se
6ab0: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 rvername = (cons
6ac0: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 t char *)p;..
6ad0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
6ae0: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 nd to eval with
6af0: 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 fn, chan, and se
6b00: 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a rver name args *
6b10: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
6b20: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
6b30: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
6b40: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
6b50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
6b60: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
6b70: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
6b80: 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 hello", -1));.
6b90: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
6ba0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
6bb0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
6bc0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
6bd0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
6be0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
6bf0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lf), -1));. T
6c00: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6c10: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
6c20: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
6c30: 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e tringObj(servern
6c40: 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 ame, (Tcl_Size)
6c50: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 len));.. /* E
6c60: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d val callback com
6c70: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f mand */. Tcl_
6c80: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
6c90: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 Ptr);. if ((c
6ca0: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 ode = EvalCallba
6cb0: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ck(interp, state
6cc0: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 Ptr, cmdPtr)) >
6cd0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 1) {..res = SSL_
6ce0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 CLIENT_HELLO_RET
6cf0: 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 RY;..*alert = SS
6d00: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f L_R_TLSV1_ALERT_
6d10: 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a USER_CANCELLED;.
6d20: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
6d30: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 ode == 1) {..res
6d40: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 = SSL_CLIENT_HE
6d50: 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 LLO_SUCCESS;.
6d60: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
6d70: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6d80: 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 O_ERROR;..*alert
6d90: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
6da0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
6db0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 ROR;. }. T
6dc0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
6dd0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 cmdPtr);. ret
6de0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a urn res;.}.../**
6df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6e00: 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 **/./* Commands
6e10: 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a */./****
6e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6e30: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d /../*. *--------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
6e80: 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 * CiphersObjCmd
6e90: 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c -- list availabl
6ea0: 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 e ciphers. *. *.
6eb0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
6ec0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
6ed0: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 cess the "tls::c
6ee0: 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a iphers" command.
6ef0: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c *.to list avail
6f00: 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 able ciphers, ba
6f10: 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f sed upon protoco
6f20: 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 l selected.. *.
6f30: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
6f40: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
6f50: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 ult list.. *. *
6f60: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
6f70: 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 .constructs and
6f80: 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e destroys SSL con
6f90: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a text (CTX). *. *
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fe0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 ---. */.static c
6ff0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f onst char *proto
7000: 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c cols[] = {.."ssl
7010: 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 2", "ssl3", "tls
7020: 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 1", "tls1.1", "t
7030: 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 ls1.2", "tls1.3"
7040: 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 , NULL.};.enum p
7050: 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c rotocol {. TL
7060: 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 S_SSL2, TLS_SSL3
7070: 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f , TLS_TLS1, TLS_
7080: 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 TLS1_1, TLS_TLS1
7090: 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 _2, TLS_TLS1_3,
70a0: 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 TLS_NONE.};..sta
70b0: 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f tic int.CiphersO
70c0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
70d0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
70e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
70f0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
7100: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
7110: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ) {. Tcl_Obj
7120: 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a *objPtr = NULL;.
7130: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 SSL_CTX *ctx
7140: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c = NULL;. SSL
7150: 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *ssl = NULL;.
7160: 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 STACK_OF(SSL_C
7170: 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 IPHER) *sk;.
7180: 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d char buf[BUFSIZ]
7190: 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c ;. int index,
71a0: 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 verbose = 0, us
71b0: 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b e_supported = 0;
71c0: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d . const SSL_M
71d0: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 20 ETHOD *method;.
71e0: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 (void) client
71f0: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e Data;.. dprin
7200: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
7210: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 if ((objc < 2
7220: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 ) || (objc > 4))
7230: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
7240: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
7250: 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 objv, "protocol
7260: 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f ?verbose? ?suppo
7270: 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e rted?");..return
7280: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
7290: 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 }. if (Tcl_Ge
72a0: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e tIndexFromObj(in
72b0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 terp, objv[1], p
72c0: 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f rotocols, "proto
72d0: 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 col", 0, &index)
72e0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
72f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7300: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 . }. if ((
7310: 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c objc > 2) && Tcl
7320: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f _GetBooleanFromO
7330: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
7340: 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d 2], &verbose) !=
7350: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
7360: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7370: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a }. if ((obj
7380: 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65 c > 3) && Tcl_Ge
7390: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 tBooleanFromObj(
73a0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c interp, objv[3],
73b0: 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 &use_supported)
73c0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
73d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
73e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
73f0: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
7400: 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 switch ((enu
7410: 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 m protocol)index
7420: 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 ) {..case TLS_SS
7430: 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f L2:.#if OPENSSL_
7440: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e VERSION_NUMBER >
7450: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c = 0x10100000L ||
7460: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 defined(NO_SSL2
7470: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
7480: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 NSSL_NO_SSL2)..
7490: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
74a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
74b0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
74c0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
74d0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
74e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 *) NULL);.. r
74f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7500: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
7510: 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f od = SSLv2_metho
7520: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
7530: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c if..case TLS_SSL
7540: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 3:.#if defined(N
7550: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e O_SSL3) || defin
7560: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
7570: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f L3) || defined(O
7580: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d PENSSL_NO_SSL3_M
7590: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f ETHOD).. Tcl_
75a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
75b0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
75c0: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
75d0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
75e0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
75f0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
7600: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
7610: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 . method = SS
7620: 4c 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 Lv3_method(); br
7630: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 eak;.#endif..cas
7640: 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 e TLS_TLS1:.#if
7650: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
7660: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7670: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 SSL_NO_TLS1) ||
7680: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7690: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a NO_TLS1_METHOD).
76a0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
76b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
76c0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
76d0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
76e0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
76f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
7700: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
7710: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 R;.#else.. me
7720: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 thod = TLSv1_met
7730: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 hod(); break;.#e
7740: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
7750: 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e LS1_1:.#if defin
7760: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
7770: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
7780: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 _NO_TLS1_1) || d
7790: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
77a0: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 O_TLS1_1_METHOD)
77b0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
77c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
77d0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
77e0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
77f0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
7800: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
7810: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
7820: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
7830: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f ethod = TLSv1_1_
7840: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b method(); break;
7850: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c .#endif..case TL
7860: 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 S_TLS1_2:.#if de
7870: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
7880: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7890: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c SSL_NO_TLS1_2) |
78a0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
78b0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 L_NO_TLS1_2_METH
78c0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 OD).. Tcl_App
78d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
78e0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
78f0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
7900: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
7910: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
7920: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
7930: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
7940: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 method = TLSv1
7950: 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 _2_method(); bre
7960: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
7970: 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 TLS_TLS1_3:.#if
7980: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
7990: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _3) || defined(O
79a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
79b0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ).. Tcl_Appen
79c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
79d0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
79e0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
79f0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 t supported", (c
7a00: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
7a10: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
7a20: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
7a30: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 method = TLS_met
7a40: 68 6f 64 28 29 3b 0a 09 20 20 20 20 53 53 4c 5f hod();.. SSL_
7a50: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 CTX_set_min_prot
7a60: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 o_version(ctx, T
7a70: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a LS1_3_VERSION);.
7a80: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
7a90: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _max_proto_versi
7aa0: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 on(ctx, TLS1_3_V
7ab0: 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 ERSION);.. br
7ac0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 eak;.#endif..def
7ad0: 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65 74 68 6f ault:.. metho
7ae0: 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 d = TLS_method()
7af0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 ;.. break;.
7b00: 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 }.. ctx = S
7b10: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f SL_CTX_new(metho
7b20: 64 29 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20 d);. if (ctx
7b30: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f == NULL) {..Tcl_
7b40: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7b50: 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 erp, GET_ERR_REA
7b60: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
7b70: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
7b80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
7b90: 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e . ssl = SSL_n
7ba0: 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20 ew(ctx);. if
7bb0: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl == NULL) {.
7bc0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
7bd0: 74 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 t(interp, GET_ER
7be0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
7bf0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c r *) NULL);..SSL
7c00: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
7c10: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7c20: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
7c30: 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 Use list and or
7c40: 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20 der as would be
7c50: 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 sent in a Client
7c60: 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 Hello or all ava
7c70: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a ilable ciphers *
7c80: 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75 /. if (use_su
7c90: 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d pported) {..sk =
7ca0: 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 SSL_get1_suppor
7cb0: 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29 ted_ciphers(ssl)
7cc0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
7cd0: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 sk = SSL_get_cip
7ce0: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d hers(ssl);. }
7cf0: 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 .. if (sk !=
7d00: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 NULL) {..if (!ve
7d10: 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 63 6f rbose) {.. co
7d20: 6e 73 74 20 63 68 61 72 20 2a 63 70 3b 0a 09 20 nst char *cp;..
7d30: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
7d40: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
7d50: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 LL);.. for (i
7d60: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b nt i = 0; i < sk
7d70: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 _SSL_CIPHER_num(
7d80: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f sk); i++) {...co
7d90: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a nst SSL_CIPHER *
7da0: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 c = sk_SSL_CIPHE
7db0: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a R_value(sk, i);.
7dc0: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 ..if (c == NULL)
7dd0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a continue;..../*
7de0: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 cipher name or
7df0: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d (NONE) */...cp =
7e00: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
7e10: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 name(c);...if (c
7e20: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b p == NULL) break
7e30: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ;...Tcl_ListObjA
7e40: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
7e50: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
7e60: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 _NewStringObj((c
7e70: 68 61 72 20 2a 29 20 63 70 2c 20 2d 31 29 29 3b har *) cp, -1));
7e80: 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 .. }...} else
7e90: 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d {.. objPtr =
7ea0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
7eb0: 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f j("",0);.. fo
7ec0: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 r (int i = 0; i
7ed0: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f < sk_SSL_CIPHER_
7ee0: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a num(sk); i++) {.
7ef0: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 ..const SSL_CIPH
7f00: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 ER *c = sk_SSL_C
7f10: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 IPHER_value(sk,
7f20: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e i);...if (c == N
7f30: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a ULL) continue;..
7f40: 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73 ../* textual des
7f50: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 cription of the
7f60: 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 cipher */...if (
7f70: 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 SSL_CIPHER_descr
7f80: 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 iption(c, buf, s
7f90: 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e izeof(buf)) != N
7fa0: 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c ULL) {... Tcl
7fb0: 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a _AppendToObj(obj
7fc0: 50 74 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 Ptr, buf, (Tcl_S
7fd0: 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29 ize) strlen(buf)
7fe0: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
7ff0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f Tcl_AppendTo
8000: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b Obj(objPtr, "UNK
8010: 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d NOWN\n", 8);...}
8020: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 .. }..}..if (
8030: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b use_supported) {
8040: 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 .. sk_SSL_CIP
8050: 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d HER_free(sk);..}
8060: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 . }. SSL_f
8070: 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 ree(ssl);. SS
8080: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
8090: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
80a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
80b0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
80c0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
80d0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8110: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 -------. *. * Pr
8120: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d otocolsObjCmd --
8130: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 list available
8140: 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 protocols. *. *.
8150: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
8160: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
8170: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 cess the "tls::p
8180: 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e rotocols" comman
8190: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 d. *.to list ava
81a0: 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 ilable protocols
81b0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
81c0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
81d0: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a cl result list..
81e0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
81f0: 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 ts:. *.none. *.
8200: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8240: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
8250: 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a int.ProtocolsObj
8260: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
8270: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
8280: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
8290: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
82a0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
82b0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f {. Tcl_Obj *o
82c0: 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 bjPtr;. (void
82d0: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
82e0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
82f0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
8300: 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c bjc != 1) {..Tcl
8310: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
8320: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
8330: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
8340: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
8350: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
8360: 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 r();.. objPtr
8370: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
8380: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 j(0, NULL);..#if
8390: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
83a0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
83b0: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 0000L && !define
83c0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 d(NO_SSL2) && !d
83d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
83e0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f O_SSL2). Tcl_
83f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
8400: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
8410: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
8420: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
8430: 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b TLS_SSL2], -1));
8440: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
8450: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 ined(NO_SSL3) &&
8460: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
8470: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 L_NO_SSL3) && !d
8480: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
8490: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 O_SSL3_METHOD).
84a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
84b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
84c0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
84d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
84e0: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d tocols[TLS_SSL3]
84f0: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
8500: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
8510: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
8520: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
8530: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
8540: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 ENSSL_NO_TLS1_ME
8550: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 THOD). Tcl_Li
8560: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
8570: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
8580: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
8590: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
85a0: 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 S_TLS1], -1));.#
85b0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
85c0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
85d0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
85e0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 L_NO_TLS1_1) &&
85f0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
8600: 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f _NO_TLS1_1_METHO
8610: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f D). Tcl_ListO
8620: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
8630: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
8640: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
8650: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 (protocols[TLS_T
8660: 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 LS1_1], -1));.#e
8670: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
8680: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 d(NO_TLS1_2) &&
8690: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
86a0: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 _NO_TLS1_2) && !
86b0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
86c0: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 NO_TLS1_2_METHOD
86d0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
86e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
86f0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
8700: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
8710: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
8720: 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e S1_2], -1));.#en
8730: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
8740: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 (NO_TLS1_3) && !
8750: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8760: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 NO_TLS1_3). T
8770: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
8780: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
8790: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
87a0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
87b0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 ls[TLS_TLS1_3],
87c0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 -1));.#endif..
87d0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
87e0: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
87f0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
8800: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
8810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8850: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 ---. *. * Handsh
8860: 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a akeObjCmd --. *.
8870: 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 *.This command
8880: 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 is used to verif
8890: 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 y whether the ha
88a0: 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c ndshake is compl
88b0: 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 ete. *.or not..
88c0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
88d0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
88e0: 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 result. 1 means
88f0: 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 handshake comple
8900: 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 te, 0 means pend
8910: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ing.. *. * Side
8920: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
8930: 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 force SSL negoti
8940: 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c ation to take pl
8950: 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ace.. *. *------
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
89a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e /.static int Han
89b0: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 dshakeObjCmd(Cli
89c0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
89d0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
89e0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
89f0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
8a00: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
8a10: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
8a20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 /* The c
8a30: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 hannel to set a
8a40: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 mode on. */.
8a50: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
8a60: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e /* clien
8a70: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
8a80: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f socket */. co
8a90: 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 nst char *errStr
8aa0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 = NULL;. int
8ab0: 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e ret = 1;. in
8ac0: 74 20 65 72 72 20 3d 20 30 3b 0a 20 20 20 20 28 t err = 0;. (
8ad0: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
8ae0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
8af0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
8b00: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
8b10: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
8b20: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
8b30: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 v, "channel");..
8b40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
8b50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
8b60: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
8b70: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
8b80: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
8b90: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
8ba0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 (objv[1]), NULL)
8bb0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
8bc0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
8bd0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
8be0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
8bf0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
8c00: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
8c10: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
8c20: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
8c30: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
8c40: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
8c50: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
8c60: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
8c70: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
8c80: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
8c90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
8ca0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
8cb0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
8cc0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 ame(chan),..
8cd0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
8ce0: 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a hannel", (char *
8cf0: 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 ) NULL);..Tcl_Se
8d00: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
8d10: 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 p, "TLS", "HANDS
8d20: 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 HAKE", "CHANNEL"
8d30: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
8d40: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
8d50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
8d60: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 }. stateP
8d70: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 tr = (State *)Tc
8d80: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
8d90: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
8da0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
8db0: 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f lling Tls_WaitFo
8dc0: 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 rConnect");.
8dd0: 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f ret = Tls_WaitFo
8de0: 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 rConnect(statePt
8df0: 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 r, &err, 1);.
8e00: 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 dprintf("Tls_Wa
8e10: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 itForConnect ret
8e20: 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 urned: %i", ret)
8e30: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c ;.. if (ret <
8e40: 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 0 && ((statePtr
8e50: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 ->flags & TLS_TC
8e60: 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 L_ASYNC) && (err
8e70: 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a == EAGAIN))) {.
8e80: 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 .dprintf("Async
8e90: 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 set and err = EA
8ea0: 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 GAIN");..ret = 0
8eb0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
8ec0: 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e (ret < 0) {..lon
8ed0: 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 g result;..errSt
8ee0: 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 r = statePtr->er
8ef0: 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 r;..Tcl_ResetRes
8f00: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 ult(interp);..Tc
8f10: 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b l_SetErrno(err);
8f20: 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c ...if (!errStr |
8f30: 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 | (*errStr == 0)
8f40: 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 ) {.. errStr
8f50: 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 = Tcl_PosixError
8f60: 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 (interp);..}...T
8f70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8f80: 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 interp, "handsha
8f90: 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 ke failed: ", er
8fa0: 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e rStr, (char *) N
8fb0: 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75 ULL);..if ((resu
8fc0: 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 lt = SSL_get_ver
8fd0: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 ify_result(state
8fe0: 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 Ptr->ssl)) != X5
8ff0: 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 09_V_OK) {..
9000: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
9010: 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74 (interp, " due t
9020: 6f 20 5c 22 22 2c 20 58 35 30 39 5f 76 65 72 69 o \"", X509_veri
9030: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 fy_cert_error_st
9040: 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 22 5c ring(result), "\
9050: 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c "", (char *) NUL
9060: 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45 L);..}..Tcl_SetE
9070: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
9080: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 "TLS", "HANDSHA
9090: 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 KE", "FAILED", (
90a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
90b0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
90c0: 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 ng TCL_ERROR wit
90d0: 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c h handshake fail
90e0: 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 ed: %s", errStr)
90f0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
9100: 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ROR;. } else
9110: 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 {..if (err != 0)
9120: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
9130: 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 "Got an error wi
9140: 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 th a completed h
9150: 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 andshake: err =
9160: 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 %i", err);..}..r
9170: 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 et = 1;. }..
9180: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
9190: 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 rning TCL_OK wit
91a0: 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 h data \"%i\"",
91b0: 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ret);. Tcl_Se
91c0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
91d0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a p, Tcl_NewIntObj
91e0: 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75 (ret));. retu
91f0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a rn TCL_OK;.}../*
9200: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
9210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9240: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 ------. *. * Imp
9250: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a ortObjCmd --. *.
9260: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
9270: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
9280: 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c process the "ssl
9290: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 " command. *. *.
92a0: 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 The ssl command
92b0: 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20 pushes SSL over
92c0: 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 a (newly connect
92d0: 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 ed) tcp socket.
92e0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
92f0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
9300: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
9310: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d de effects:. *.M
9320: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 ay modify the be
9330: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 havior of an IO
9340: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d channel.. *. *--
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9390: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
93a0: 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c .ImportObjCmd(Cl
93b0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
93c0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
93d0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
93e0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
93f0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
9400: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
9410: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 ;../* The channe
9420: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
9430: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 on. */. State
9440: 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 *statePtr;../*
9450: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 client state for
9460: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 ssl socket */.
9470: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 SSL_CTX *ctx.
9480: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c .= NULL;. Tcl
9490: 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 09 3d 20 _Obj *script..=
94a0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
94b0: 6a 20 2a 70 61 73 73 77 6f 72 64 09 09 3d 20 4e j *password..= N
94c0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
94d0: 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a *vcmd..= NULL;.
94e0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
94f0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
9500: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 slation, upperCh
9510: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 annelBlocking, u
9520: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
9530: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ing, upperChanne
9540: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e lEOFChar;. in
9550: 74 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 t idx;. Tcl_S
9560: 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 ize len;. int
9570: 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f 54 flags...= TLS_T
9580: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 CL_INIT;. int
9590: 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09 2f server...= 0;./
95a0: 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 * is connection
95b0: 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 incoming or outg
95c0: 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 oing? */. cha
95d0: 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55 r *keyfile..= NU
95e0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 LL;. char *ce
95f0: 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a rtfile..= NULL;.
9600: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
9610: 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a r *key..= NULL;.
9620: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79 Tcl_Size key
9630: 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75 _len..= 0;. u
9640: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 nsigned char *ce
9650: 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 rt..= NULL;.
9660: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 Tcl_Size cert_le
9670: 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 n..= 0;. char
9680: 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55 4c *ciphers..= NUL
9690: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 L;. char *cip
96a0: 68 65 72 73 75 69 74 65 73 09 09 3d 20 4e 55 4c hersuites..= NUL
96b0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 L;. char *CAf
96c0: 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ile..= NULL;.
96d0: 20 63 68 61 72 20 2a 43 41 70 61 74 68 09 09 3d char *CApath..=
96e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
96f0: 2a 43 41 73 74 6f 72 65 09 09 3d 20 4e 55 4c 4c *CAstore..= NULL
9700: 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 ;. char *DHpa
9710: 72 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 rams..= NULL;.
9720: 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 char *model...
9730: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
9740: 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 *servername..=
9750: 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d NULL;./* hostnam
9760: 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d e for Server Nam
9770: 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a e Indication */.
9780: 20 20 20 20 63 68 61 72 20 2a 73 65 73 73 69 6f char *sessio
9790: 6e 5f 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 n_id..= NULL;.
97a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 Tcl_Obj *alpn.
97b0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 .= NULL;. int
97c0: 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 ssl2 = 0, ssl3
97d0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 = 0;. int tls
97e0: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 1 = 1, tls1_1 =
97f0: 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 1, tls1_2 = 1, t
9800: 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 ls1_3 = 1;. i
9810: 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 nt proto = 0, le
9820: 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e vel = -1;. in
9830: 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 t verify = 0, re
9840: 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 quire = 0, reque
9850: 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e st = 1, post_han
9860: 64 73 68 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 dshake = 0;.
9870: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 (void) clientDat
9880: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 a;.. dprintf(
9890: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 "Called");..#if
98a0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
98b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
98c0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 SSL_NO_TLS1).
98d0: 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 tls1 = 0;.#endi
98e0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
98f0: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
9900: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
9910: 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f LS1_1). tls1_
9920: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 1 = 0;.#endif.#i
9930: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
9940: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
9950: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
9960: 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 2). tls1_2 =
9970: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
9980: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
9990: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
99a0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
99b0: 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 tls1_3 = 0;.#
99c0: 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f endif.. if (o
99d0: 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f bjc < 2) {..Tcl_
99e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
99f0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
9a00: 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f hannel ?options?
9a10: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
9a20: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
9a30: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
9a40: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d r();.. chan =
9a50: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
9a60: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
9a70: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 tring(objv[1]),
9a80: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
9a90: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
9aa0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
9ab0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9ac0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
9ad0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
9ae0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
9af0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
9b00: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
9b10: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
9b20: 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d .. for (idx =
9b30: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 2; idx < objc;
9b40: 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a idx++) {..char *
9b50: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 opt = Tcl_GetStr
9b60: 69 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a ing(objv[idx]);.
9b70: 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 ..if (opt[0] !=
9b80: 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b '-').. break;
9b90: 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e ...OPTOBJ("-alpn
9ba0: 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 ", alpn);..OPTST
9bb0: 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 70 61 R("-cadir", CApa
9bc0: 74 68 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 th);..OPTSTR("-c
9bd0: 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b afile", CAfile);
9be0: 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 73 74 6f ..OPTSTR("-casto
9bf0: 72 65 22 2c 20 43 41 73 74 6f 72 65 29 3b 0a 09 re", CAstore);..
9c00: 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c OPTBYTE("-cert",
9c10: 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 cert, cert_len)
9c20: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 ;..OPTSTR("-cert
9c30: 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 file", certfile)
9c40: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 ;..OPTSTR("-ciph
9c50: 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 er", ciphers);..
9c60: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 OPTSTR("-ciphers
9c70: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 ", ciphers);..OP
9c80: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 TSTR("-ciphersui
9c90: 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 tes", ciphersuit
9ca0: 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 es);..OPTOBJ("-c
9cb0: 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 ommand", script)
9cc0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 ;..OPTSTR("-dhpa
9cd0: 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 rams", DHparams)
9ce0: 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 ;..OPTBYTE("-key
9cf0: 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 ", key, key_len)
9d00: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 ;..OPTSTR("-keyf
9d10: 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a ile", keyfile);.
9d20: 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 .OPTSTR("-model"
9d30: 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 , model);..OPTOB
9d40: 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 J("-password", p
9d50: 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f assword);..OPTBO
9d60: 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 OL("-post_handsh
9d70: 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 ake", post_hands
9d80: 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 hake);..OPTBOOL(
9d90: 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 "-request", requ
9da0: 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 est);..OPTBOOL("
9db0: 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 -require", requi
9dc0: 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 re);..OPTINT("-s
9dd0: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 ecurity_level",
9de0: 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c level);..OPTBOOL
9df0: 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 ("-server", serv
9e00: 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 er);..OPTSTR("-s
9e10: 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 ervername", serv
9e20: 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 ername);..OPTSTR
9e30: 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 ("-session_id",
9e40: 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 session_id);..OP
9e50: 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 TBOOL("-ssl2", s
9e60: 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 sl2);..OPTBOOL("
9e70: 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 -ssl3", ssl3);..
9e80: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c OPTBOOL("-tls1",
9e90: 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c tls1);..OPTBOOL
9ea0: 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 ("-tls1.1", tls1
9eb0: 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d _1);..OPTBOOL("-
9ec0: 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 tls1.2", tls1_2)
9ed0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
9ee0: 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 1.3", tls1_3);..
9ef0: 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 OPTOBJ("-validat
9f00: 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 ecommand", vcmd)
9f10: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 ;..OPTOBJ("-vcmd
9f20: 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 ", vcmd);...OPTB
9f30: 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 AD("option", "-a
9f40: 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 lpn, -cadir, -ca
9f50: 66 69 6c 65 2c 20 2d 63 61 73 74 6f 72 65 2c 20 file, -castore,
9f60: 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 -cert, -certfile
9f70: 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 , -cipher, -ciph
9f80: 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 ersuites, -comma
9f90: 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d nd, -dhparams, -
9fa0: 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d key, -keyfile, -
9fb0: 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 model, -password
9fc0: 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b , -post_handshak
9fd0: 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 e, -request, -re
9fe0: 71 75 69 72 65 2c 20 2d 73 65 63 75 72 69 74 79 quire, -security
9ff0: 5f 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c _level, -server,
a000: 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 -servername, -s
a010: 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 ession_id, -ssl2
a020: 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 , -ssl3, -tls1,
a030: 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 -tls1.1, -tls1.2
a040: 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 , -tls1.3, or -v
a050: 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 alidatecommand")
a060: 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;...return TCL_E
a070: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
a080: 69 66 20 28 72 65 71 75 65 73 74 29 09 09 76 65 if (request)..ve
a090: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 rify |= SSL_VERI
a0a0: 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c FY_CLIENT_ONCE |
a0b0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 SSL_VERIFY_PEER
a0c0: 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 ;. if (reques
a0d0: 74 20 26 26 20 72 65 71 75 69 72 65 29 09 76 65 t && require).ve
a0e0: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 rify |= SSL_VERI
a0f0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
a100: 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 ER_CERT;. if
a110: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 (request && post
a120: 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69 _handshake).veri
a130: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 fy |= SSL_VERIFY
a140: 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b _POST_HANDSHAKE;
a150: 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20 . if (verify
a160: 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20 3d 20 == 0)..verify =
a170: 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b SSL_VERIFY_NONE;
a180: 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 .. proto |= (
a190: 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f ssl2 ? TLS_PROTO
a1a0: 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 _SSL2 : 0);.
a1b0: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f proto |= (ssl3 ?
a1c0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 TLS_PROTO_SSL3
a1d0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
a1e0: 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 |= (tls1 ? TLS_P
a1f0: 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a ROTO_TLS1 : 0);.
a200: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
a210: 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f s1_1 ? TLS_PROTO
a220: 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 _TLS1_1 : 0);.
a230: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
a240: 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _2 ? TLS_PROTO_T
a250: 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 LS1_2 : 0);.
a260: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 proto |= (tls1_3
a270: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
a280: 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 1_3 : 0);.. /
a290: 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 * reset to NULL
a2a0: 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 if blank string
a2b0: 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 provided */.
a2c0: 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 if (cert && !*ce
a2d0: 72 74 29 09 09 20 20 20 20 20 20 20 20 63 65 72 rt).. cer
a2e0: 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c t. = NULL
a2f0: 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 ;. if (key &&
a300: 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 !*key)..
a310: 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e key. = N
a320: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 ULL;. if (cer
a330: 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 tfile && !*certf
a340: 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 65 72 ile) cer
a350: 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 tfile.= NULL;.
a360: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 if (keyfile &&
a370: 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 !*keyfile)..key
a380: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e file. = N
a390: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 ULL;. if (cip
a3a0: 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 hers && !*cipher
a3b0: 73 29 09 20 20 20 20 20 20 20 20 63 69 70 68 65 s). ciphe
a3c0: 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c rs. = NUL
a3d0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 L;. if (ciphe
a3e0: 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 rsuites && !*cip
a3f0: 68 65 72 73 75 69 74 65 73 29 20 63 69 70 68 65 hersuites) ciphe
a400: 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c rsuites = NUL
a410: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c L;. if (CAfil
a420: 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 e && !*CAfile).
a430: 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 CAfile.
a440: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
a450: 20 20 69 66 20 28 43 41 70 61 74 68 20 26 26 20 if (CApath &&
a460: 21 2a 43 41 70 61 74 68 29 09 20 20 20 20 20 20 !*CApath).
a470: 20 20 43 41 70 61 74 68 09 20 20 20 20 20 20 20 CApath.
a480: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
a490: 28 43 41 73 74 6f 72 65 20 26 26 20 21 2a 43 41 (CAstore && !*CA
a4a0: 73 74 6f 72 65 29 09 20 20 20 20 20 20 20 20 43 store). C
a4b0: 41 73 74 6f 72 65 09 20 20 20 20 20 20 20 20 3d Astore. =
a4c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 NULL;. if (D
a4d0: 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 Hparams && !*DHp
a4e0: 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 arams). D
a4f0: 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d Hparams =
a500: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e NULL;.. /* n
a510: 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a ew SSL state */.
a520: 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 statePtr..=
a530: 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f (State *) ckallo
a540: 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a c((unsigned) siz
a550: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 eof(State));.
a560: 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 memset(statePtr
a570: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 , 0, sizeof(Stat
a580: 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 e));.. stateP
a590: 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 tr->flags.= flag
a5a0: 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d s;. statePtr-
a5b0: 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 >interp.= interp
a5c0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
a5d0: 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b vflags.= verify;
a5e0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 . statePtr->e
a5f0: 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a rr.= "";.. /*
a600: 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 allocate script
a610: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 */. if (scri
a620: 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 pt) {..(void) Tc
a630: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
a640: 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 bj(script, &len)
a650: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 ;..if (len) {..
a660: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c statePtr->cal
a670: 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a lback = script;.
a680: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
a690: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
a6a0: 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 callback);..}.
a6b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f }.. /* allo
a6c0: 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f cate password */
a6d0: 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 . if (passwor
a6e0: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c d) {..(void) Tcl
a6f0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
a700: 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e j(password, &len
a710: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
a720: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 statePtr->pa
a730: 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 ssword = passwor
a740: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 d;.. Tcl_Incr
a750: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
a760: 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d r->password);..}
a770: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 . }.. /* a
a780: 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 llocate validate
a790: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
a7a0: 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f if (vcmd) {..(vo
a7b0: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e id) Tcl_GetStrin
a7c0: 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 gFromObj(vcmd, &
a7d0: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 len);..if (len)
a7e0: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d {.. statePtr-
a7f0: 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 >vcmd = vcmd;..
a800: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
a810: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 unt(statePtr->vc
a820: 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 md);..}. }..
a830: 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 if (model !=
a840: 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 NULL) {..int mod
a850: 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 e;../* Get the "
a860: 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a model" context *
a870: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 /..chan = Tcl_Ge
a880: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
a890: 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a model, &mode);.
a8a0: 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 .if (chan == (Tc
a8b0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
a8c0: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
a8d0: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 ((tls_free_type
a8e0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
a8f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
a900: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a ROR;..}.../*.. *
a910: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
a920: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
a930: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a most channel.. *
a940: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 /..chan = Tcl_Ge
a950: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
a960: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 );..if (Tcl_GetC
a970: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
a980: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
a990: 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 ype()) {.. Tc
a9a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
a9b0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
a9c0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
a9d0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
a9e0: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
a9f0: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 TLS channel", (c
aa00: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
aa10: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
aa20: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
aa30: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 ", "IMPORT", "CH
aa40: 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 ANNEL", "INVALID
aa50: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
aa60: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 );.. Tls_Free
aa70: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 ((tls_free_type
aa80: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
aa90: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
aaa0: 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 ROR;..}..ctx = (
aab0: 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 (State *)Tcl_Get
aac0: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
aad0: 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b ata(chan))->ctx;
aae0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 . } else {..i
aaf0: 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e f ((ctx = CTX_In
ab00: 69 74 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 it(statePtr, ser
ab10: 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 ver, proto, keyf
ab20: 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b ile, certfile, k
ab30: 65 79 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 ey, cert, key_le
ab40: 6e 2c 0a 09 20 20 20 20 63 65 72 74 5f 6c 65 6e n,.. cert_len
ab50: 2c 20 43 41 70 61 74 68 2c 20 43 41 73 74 6f 72 , CApath, CAstor
ab60: 65 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 e, CAfile, ciphe
ab70: 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 rs, ciphersuites
ab80: 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d , level, DHparam
ab90: 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 s)) == NULL) {..
aba0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c Tls_Free((tl
abb0: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 s_free_type *) s
abc0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
abd0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
abe0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 ..}. }.. s
abf0: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 tatePtr->ctx = c
ac00: 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 tx;.. /*.
ac10: 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 * We need to ma
ac20: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 ke sure that the
ac30: 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 channel works i
ac40: 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 n binary (for th
ac50: 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 e. * encrypt
ac60: 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 ion not to get g
ac70: 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 oofed up)..
ac80: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 */. Tcl_DStri
ac90: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
aca0: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 nnelTranslation)
acb0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
acc0: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e gInit(&upperChan
acd0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 nelBlocking);.
ace0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
acf0: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 t(&upperChannelE
ad00: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c OFChar);. Tcl
ad10: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 _DStringInit(&up
ad20: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
ad30: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ng);. Tcl_Get
ad40: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
ad50: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f terp, chan, "-eo
ad60: 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 fchar", &upperCh
ad70: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 annelEOFChar);.
ad80: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
ad90: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
ada0: 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 chan, "-encoding
adb0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
adc0: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 Encoding);. T
add0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
ade0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
adf0: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
ae00: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 , &upperChannelT
ae10: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 ranslation);.
ae20: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
ae30: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
ae40: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c an, "-blocking",
ae50: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c &upperChannelBl
ae60: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c ocking);. Tcl
ae70: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
ae80: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
ae90: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 "-translation",
aea0: 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 "binary");. T
aeb0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
aec0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
aed0: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 , "-blocking", "
aee0: 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 true");. dpri
aef0: 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 ntf("Consuming T
af00: 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 cl channel %s",
af10: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
af20: 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 me(chan));. s
af30: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 tatePtr->self =
af40: 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c Tcl_StackChannel
af50: 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 (interp, Tls_Cha
af60: 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 nnelType(), (Cli
af70: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
af80: 72 2c 0a 09 28 54 43 4c 5f 52 45 41 44 41 42 4c r,..(TCL_READABL
af90: 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 E | TCL_WRITABLE
afa0: 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 ), chan);. dp
afb0: 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 63 rintf("Created c
afc0: 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 hannel named %s"
afd0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
afe0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
aff0: 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 73 elf));. if (s
b000: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d tatePtr->self ==
b010: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
b020: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e ULL) {../*.. * N
b030: 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 o use of Tcl_Eve
b040: 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61 ntuallyFree beca
b050: 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 use no possible
b060: 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 Tcl_Preserve...
b070: 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 74 6c */..Tls_Free((tl
b080: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 s_free_type *) s
b090: 74 61 74 65 50 74 72 29 3b 0a 09 54 63 6c 5f 44 tatePtr);..Tcl_D
b0a0: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 StringFree(&uppe
b0b0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
b0c0: 69 6f 6e 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 ion);..Tcl_DStri
b0d0: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 ngFree(&upperCha
b0e0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 09 nnelEncoding);..
b0f0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
b100: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
b110: 43 68 61 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72 Char);..Tcl_DStr
b120: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 ingFree(&upperCh
b130: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a annelBlocking);.
b140: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
b150: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 R;. }.. Tc
b160: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
b170: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 on(interp, state
b180: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 Ptr->self, "-tra
b190: 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 nslation", Tcl_D
b1a0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
b1b0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
b1c0: 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f tion));. Tcl_
b1d0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
b1e0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
b1f0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 r->self, "-encod
b200: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e ing", 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 45 6e 63 6f 64 69 6e 67 29 29 3b 0a nnelEncoding));.
b230: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
b240: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
b250: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c statePtr->self,
b260: 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c "-eofchar", Tcl
b270: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
b280: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
b290: 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ar));. Tcl_Se
b2a0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
b2b0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
b2c0: 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e >self, "-blockin
b2d0: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 g", Tcl_DStringV
b2e0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
b2f0: 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 elBlocking));.
b300: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
b310: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 e(&upperChannelT
b320: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 ranslation);.
b330: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
b340: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e (&upperChannelEn
b350: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c coding);. Tcl
b360: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 _DStringFree(&up
b370: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 perChannelEOFCha
b380: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 r);. Tcl_DStr
b390: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 ingFree(&upperCh
b3a0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a annelBlocking);.
b3b0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 . /*. * S
b3c0: 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f SL Initializatio
b3d0: 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 n. */. st
b3e0: 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 atePtr->ssl = SS
b3f0: 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e L_new(statePtr->
b400: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 ctx);. if (!s
b410: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a tatePtr->ssl) {.
b420: 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 ./* SSL library
b430: 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 error */..Tcl_Ap
b440: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
b450: 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e p, "couldn't con
b460: 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 struct ssl sessi
b470: 6f 6e 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 on: ", GET_ERR_R
b480: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
b490: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 ) NULL);.. Tc
b4a0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
b4b0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
b4c0: 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 MPORT", "INIT",
b4d0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
b4e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 *) NULL);..Tls_F
b4f0: 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 ree((tls_free_ty
b500: 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b pe *) statePtr);
b510: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
b520: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
b530: 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 * Set host serve
b540: 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 r name */. if
b550: 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a (servername) {.
b560: 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 ./* Sets the ser
b570: 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 ver name indicat
b580: 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 ion (SNI) in Cli
b590: 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 entHello extensi
b5a0: 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 on */../* Per RF
b5b0: 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 C 6066, hostname
b5c0: 20 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f is a ASCII enco
b5d0: 64 65 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 ded string, thou
b5e0: 67 68 20 52 46 43 20 34 33 36 36 20 73 61 79 73 gh RFC 4366 says
b5f0: 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 UTF-8. */..if (
b600: 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f !SSL_set_tlsext_
b610: 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 host_name(stateP
b620: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e tr->ssl, servern
b630: 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29 ame) && require)
b640: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
b650: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
b660: 20 22 53 65 74 20 53 4e 49 20 65 78 74 65 6e 73 "Set SNI extens
b670: 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 ion failed: ", G
b680: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
b690: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b6a0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
b6b0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
b6c0: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
b6d0: 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c "SNI", "FAILED",
b6e0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
b6f0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
b700: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 tls_free_type *)
b710: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
b720: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
b730: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 R;..}.../* Set h
b740: 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 ostname for peer
b750: 20 63 65 72 74 69 66 69 63 61 74 65 20 68 6f 73 certificate hos
b760: 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74 69 tname verificati
b770: 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 on in clients...
b780: 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c Don't use SSL
b790: 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 _set1_host since
b7a0: 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 it has limitati
b7b0: 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 ons. */..if (!SS
b7c0: 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 L_add1_host(stat
b7d0: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 ePtr->ssl, serve
b7e0: 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 rname)) {.. T
b7f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
b800: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 44 4e 53 interp, "Set DNS
b810: 20 68 6f 73 74 6e 61 6d 65 20 66 61 69 6c 65 64 hostname failed
b820: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
b830: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
b840: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
b850: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
b860: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
b870: 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 ORT", "HOSTNAME"
b880: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
b890: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
b8a0: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 Tls_Free((tls_f
b8b0: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 ree_type *) stat
b8c0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
b8d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
b8e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 . }.. /* R
b8f0: 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 esume session id
b900: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 */. if (sess
b910: 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e ion_id && strlen
b920: 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 (session_id) <=
b930: 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f SSL_MAX_SID_CTX_
b940: 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 LENGTH) {../* SS
b950: 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 L_set_session()
b960: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 */..if (!SSL_SES
b970: 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e SION_set1_id_con
b980: 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 text(SSL_get_ses
b990: 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 sion(statePtr->s
b9a0: 73 6c 29 2c 0a 09 09 28 63 6f 6e 73 74 20 75 6e sl),...(const un
b9b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 signed char *) s
b9c0: 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 ession_id, (unsi
b9d0: 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e gned int) strlen
b9e0: 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b (session_id))) {
b9f0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
ba00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
ba10: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66 Resume session f
ba20: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 ailed: ", GET_ER
ba30: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
ba40: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
ba50: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 Tcl_SetErrorCod
ba60: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
ba70: 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 "IMPORT", "SESS
ba80: 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 ION", "FAILED",
ba90: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
baa0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 . Tls_Free((t
bab0: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 ls_free_type *)
bac0: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
bad0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
bae0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
baf0: 2f 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 /* Enable Applic
bb00: 61 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 ation-Layer Prot
bb10: 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e ocol Negotiation
bb20: 2e 20 45 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 . Examples are:
bb30: 68 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f http/1.0,..http/
bb40: 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 1.1, h2, h3, ftp
bb50: 2c 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d , imap, pop3, xm
bb60: 70 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d pp-client, xmpp-
bb70: 73 65 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 server, mqtt, ir
bb80: 63 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 c, etc. */. i
bb90: 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 f (alpn) {../* C
bba0: 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 onvert a TCL lis
bbb0: 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f t into a protoco
bbc0: 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 l-list in wire-f
bbd0: 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e ormat */..unsign
bbe0: 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c ed char *protos,
bbf0: 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 *p;..unsigned i
bc00: 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 nt protos_len =
bc10: 30 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 63 6e 74 0;..Tcl_Size cnt
bc20: 2c 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 , i;..int j;..Tc
bc30: 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 l_Obj **list;...
bc40: 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 if (Tcl_ListObjG
bc50: 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 etElements(inter
bc60: 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 p, alpn, &cnt, &
bc70: 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 list) != TCL_OK)
bc80: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
bc90: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 ((tls_free_type
bca0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
bcb0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
bcc0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 ROR;..}.../* Det
bcd0: 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 ermine the memor
bce0: 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 y required for t
bcf0: 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 he protocol-list
bd00: 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b */..for (i = 0;
bd10: 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b i < cnt; i++) {
bd20: 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 .. Tcl_GetStr
bd30: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b ingFromObj(list[
bd40: 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 i], &len);..
bd50: 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b if (len > 255) {
bd60: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
bd70: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 ult(interp, "ALP
bd80: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 N protocol names
bd90: 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 too long", (cha
bda0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 r *) NULL);...Tc
bdb0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
bdc0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
bdd0: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 MPORT", "ALPN",
bde0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
bdf0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f *) NULL);...Tls_
be00: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 Free((tls_free_t
be10: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 ype *) statePtr)
be20: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;...return TCL_E
be30: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 RROR;.. }..
be40: 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 protos_len +=
be50: 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 1 + (int) len;..
be60: 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 }.../* Build the
be70: 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 complete protoc
be80: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 ol-list */..prot
be90: 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f os = ckalloc(pro
bea0: 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 tos_len);../* pr
beb0: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e otocol-lists con
bec0: 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 sist of 8-bit le
bed0: 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62 ngth-prefixed, b
bee0: 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 yte strings */..
bef0: 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70 20 3d 20 for (j = 0, p =
bf00: 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b protos; j < cnt;
bf10: 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 j++) {.. cha
bf20: 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 r *str = Tcl_Get
bf30: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 StringFromObj(li
bf40: 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 st[j], &len);..
bf50: 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e 73 69 67 *p++ = (unsig
bf60: 6e 65 64 20 63 68 61 72 29 20 6c 65 6e 3b 0a 09 ned char) len;..
bf70: 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 memcpy(p, st
bf80: 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 r, (size_t) len)
bf90: 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b ;.. p += len;
bfa0: 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 ..}.../* SSL_set
bfb0: 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b _alpn_protos mak
bfc0: 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 es a copy of the
bfd0: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a protocol-list *
bfe0: 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 /../* Note: This
bff0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 76 65 72 73 function revers
c000: 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 es the return va
c010: 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a lue convention *
c020: 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 /..if (SSL_set_a
c030: 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 lpn_protos(state
c040: 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 Ptr->ssl, protos
c050: 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b , protos_len)) {
c060: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
c070: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
c080: 53 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f Set ALPN protoco
c090: 6c 73 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 ls failed: ", GE
c0a0: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 T_ERR_REASON(),
c0b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
c0c0: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f . Tcl_SetErro
c0d0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
c0e0: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 LS", "IMPORT", "
c0f0: 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c ALPN", "FAILED",
c100: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
c110: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
c120: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 tls_free_type *)
c130: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
c140: 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b ckfree(protos);
c150: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
c160: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
c170: 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 Store protocols
c180: 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 list */..statePt
c190: 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 r->protos = prot
c1a0: 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 os;..statePtr->p
c1b0: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 rotos_len = prot
c1c0: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c os_len;. } el
c1d0: 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e se {..statePtr->
c1e0: 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 protos = NULL;..
c1f0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
c200: 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a _len = 0;. }.
c210: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 . /*. * S
c220: 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 SL Callbacks.
c230: 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 */. SSL_set
c240: 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 _app_data(stateP
c250: 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a tr->ssl, (void *
c260: 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 )statePtr);./* p
c270: 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 oint back to us
c280: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 */. SSL_set_v
c290: 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e erify(statePtr->
c2a0: 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 ssl, verify, Ver
c2b0: 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 ifyCallback);.
c2c0: 20 20 2f 2a 53 53 4c 5f 73 65 74 5f 76 65 72 69 /*SSL_set_veri
c2d0: 66 79 5f 64 65 70 74 68 28 53 53 4c 5f 73 65 74 fy_depth(SSL_set
c2e0: 5f 76 65 72 69 66 79 5f 64 65 70 74 68 2c 20 30 _verify_depth, 0
c2f0: 29 3b 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 );*/. SSL_set
c300: 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 _info_callback(s
c310: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e tatePtr->ssl, In
c320: 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 foCallback);..
c330: 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f /* Callback fo
c340: 72 20 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74 r observing prot
c350: 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f ocol messages */
c360: 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c .#ifndef OPENSSL
c370: 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20 _NO_SSL_TRACE.
c380: 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54 /* void SSL_CT
c390: 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 X_set_msg_callba
c3a0: 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d ck_arg(statePtr-
c3b0: 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 >ctx, (void *)st
c3c0: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69 atePtr);. voi
c3d0: 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 d SSL_CTX_set_ms
c3e0: 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 g_callback(state
c3f0: 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67 Ptr->ctx, Messag
c400: 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 eCallback); */.
c410: 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 SSL_set_msg_c
c420: 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 allback_arg(stat
c430: 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 ePtr->ssl, (void
c440: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 *)statePtr);.
c450: 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 SSL_set_msg_ca
c460: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d llback(statePtr-
c470: 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c >ssl, MessageCal
c480: 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a lback);.#endif..
c490: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 /* Create Tc
c4a0: 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 l_Channel BIO Ha
c4b0: 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 ndler */. sta
c4c0: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 tePtr->p_bio.= B
c4d0: 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 IO_new_tcl(state
c4e0: 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 Ptr, BIO_NOCLOSE
c4f0: 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d );. statePtr-
c500: 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 >bio.= BIO_new(B
c510: 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 IO_f_ssl());..
c520: 20 20 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a if (server) {.
c530: 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 ./* Server callb
c540: 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 acks */..SSL_CTX
c550: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 _set_tlsext_serv
c560: 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65 ername_arg(state
c570: 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 Ptr->ctx, (void
c580: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53 *)statePtr);..SS
c590: 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 L_CTX_set_tlsext
c5a0: 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c _servername_call
c5b0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 back(statePtr->c
c5c0: 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 tx, SNICallback)
c5d0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 ;..SSL_CTX_set_c
c5e0: 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 lient_hello_cb(s
c5f0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 tatePtr->ctx, He
c600: 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f lloCallback, (vo
c610: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
c620: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 .if (statePtr->p
c630: 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b rotos != NULL) {
c640: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
c650: 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 t_alpn_select_cb
c660: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c670: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 ALPNCallback, (v
c680: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
c690: 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a .#ifdef USE_NPN.
c6a0: 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20 . if (tls1_2
c6b0: 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d == 0 && tls1_3 =
c6c0: 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 = 0) {...SSL_CTX
c6d0: 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 _set_next_protos
c6e0: 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62 28 73 _advertised_cb(s
c6f0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50 tatePtr->ctx, NP
c700: 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 NCallback, (void
c710: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *)statePtr);..
c720: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a }.#endif..}..
c730: 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65 ./* Enable serve
c740: 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72 r to send cert r
c750: 65 71 75 65 73 74 20 61 66 74 65 72 20 68 61 6e equest after han
c760: 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 dshake (TLS 1.3
c770: 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 only) */../* A w
c780: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d rite operation m
c790: 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66 ust take place f
c7a0: 6f 72 20 74 68 65 20 43 65 72 74 69 66 69 63 61 or the Certifica
c7b0: 74 65 20 52 65 71 75 65 73 74 20 74 6f 20 62 65 te Request to be
c7c0: 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65 .. sent to the
c7d0: 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61 client, this ca
c7e0: 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53 n be done with S
c7f0: 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 SL_do_handshake(
c800: 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 ). */..if (reque
c810: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 st && post_hands
c820: 68 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 29 20 hake && tls1_3)
c830: 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66 {.. SSL_verif
c840: 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61 y_client_post_ha
c850: 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50 74 72 ndshake(statePtr
c860: 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 ->ssl);..}.../*
c870: 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 63 75 set automatic cu
c880: 72 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a 2f rve selection */
c890: 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f 61 ..SSL_set_ecdh_a
c8a0: 75 74 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 uto(statePtr->ss
c8b0: 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 l, 1);.../* Set
c8c0: 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 server mode */..
c8d0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
c8e0: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 |= TLS_TCL_SERVE
c8f0: 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 R;..SSL_set_acce
c900: 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 pt_state(statePt
c910: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 r->ssl);. } e
c920: 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 lse {../* Client
c930: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 callbacks */.#i
c940: 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 fdef USE_NPN..if
c950: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 (statePtr->prot
c960: 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c os != NULL && tl
c970: 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 s1_2 == 0 && tls
c980: 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 1_3 == 0) {..
c990: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 SSL_CTX_set_nex
c9a0: 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 t_proto_select_c
c9b0: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c b(statePtr->ctx,
c9c0: 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 ALPNCallback, (
c9d0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
c9e0: 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a ;..}.#endif.../*
c9f0: 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 Session caching
ca00: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 */..SSL_CTX_set
ca10: 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d _session_cache_m
ca20: 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ode(statePtr->ct
ca30: 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 x, SSL_SESS_CACH
ca40: 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 E_CLIENT | SSL_S
ca50: 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 ESS_CACHE_NO_INT
ca60: 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 ERNAL_STORE);..S
ca70: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f SL_CTX_sess_set_
ca80: 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d new_cb(statePtr-
ca90: 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c >ctx, SessionCal
caa0: 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 lback);.../* Ena
cab0: 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61 ble post handsha
cac0: 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f ke Authenticatio
cad0: 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 n extension. TLS
cae0: 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 1.3 only, not h
caf0: 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 ttp/2. */..if (r
cb00: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 equest && post_h
cb10: 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 andshake) {..
cb20: 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 SSL_set_post_ha
cb30: 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61 ndshake_auth(sta
cb40: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a tePtr->ssl, 1);.
cb50: 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 .}.../* Set clie
cb60: 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f nt mode */..SSL_
cb70: 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 set_connect_stat
cb80: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
cb90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f ;. }. SSL_
cba0: 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 set_bio(statePtr
cbb0: 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d ->ssl, statePtr-
cbc0: 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 >p_bio, statePtr
cbd0: 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 ->p_bio);. BI
cbe0: 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 O_set_ssl(stateP
cbf0: 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 tr->bio, statePt
cc00: 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c r->ssl, BIO_NOCL
cc10: 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 OSE);.. /*.
cc20: 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 * End of SSL
cc30: 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 Init. */.
cc40: 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e dprintf("Return
cc50: 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 ing %s", Tcl_Get
cc60: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
cc70: 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 ePtr->self));.
cc80: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 Tcl_SetResult(
cc90: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 interp, (char *)
cca0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
ccb0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
ccc0: 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c lf), TCL_VOLATIL
ccd0: 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 E);.. return
cce0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 TCL_OK;.}.../*.
ccf0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd30: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 ----. *. * Unimp
cd40: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a ortObjCmd --. *.
cd50: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
cd60: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
cd70: 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f remove the topmo
cd80: 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 st channel filte
cd90: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 r.. *. * Results
cda0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
cdb0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
cdc0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
cdd0: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 *.May modify th
cde0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e e behavior of an
cdf0: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a IO channel.. *.
ce00: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
ce10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce40: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
ce50: 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a int.UnimportObj
ce60: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
ce70: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
ce80: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
ce90: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
cea0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
ceb0: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
cec0: 6c 20 63 68 61 6e 2c 20 63 68 69 6c 64 3b 09 2f l chan, child;./
ced0: 2a 20 54 68 65 20 73 74 61 63 6b 65 64 20 61 6e * The stacked an
cee0: 64 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 d underlying cha
cef0: 6e 6e 65 6c 73 20 2a 2f 0a 20 20 20 20 54 63 6c nnels */. Tcl
cf00: 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 _DString upperCh
cf10: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
cf20: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c , upperChannelBl
cf30: 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 ocking, upperCha
cf40: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 nnelEncoding, up
cf50: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 perChannelEOFCha
cf60: 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d r;. int res =
cf70: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 28 76 6f TCL_OK;. (vo
cf80: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a id) clientData;.
cf90: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
cfa0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
cfb0: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
cfc0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
cfd0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
cfe0: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
cff0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
d000: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 61 }.. /* Va
d010: 6c 69 64 61 74 65 20 63 68 61 6e 6e 65 6c 20 6e lidate channel n
d020: 61 6d 65 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 ame */. chan
d030: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
d040: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 (interp, Tcl_Get
d050: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c String(objv[1]),
d060: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
d070: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
d080: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
d090: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
d0a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
d0b0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
d0c0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
d0d0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
d0e0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
d0f0: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
d100: 3b 0a 20 20 20 20 63 68 69 6c 64 20 3d 20 54 63 ;. child = Tc
d110: 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e l_GetStackedChan
d120: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 nel(chan);..
d130: 2f 2a 20 56 65 72 69 66 79 20 69 73 20 61 20 73 /* Verify is a s
d140: 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 2a tacked channel *
d150: 2f 0a 20 20 20 20 69 66 20 28 63 68 69 6c 64 20 /. if (child
d160: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f == NULL) {..Tcl_
d170: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d180: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
d190: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
d1a0: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
d1b0: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 73 74 ..."\": not a st
d1c0: 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 22 2c 20 acked channel",
d1d0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
d1e0: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f . Tcl_SetErro
d1f0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
d200: 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c LS", "UNIMPORT",
d210: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
d220: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
d230: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
d240: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
d250: 0a 20 20 20 20 2f 2a 20 46 6c 75 73 68 20 61 6e . /* Flush an
d260: 79 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 2a y pending data *
d270: 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 46 6c /. if (Tcl_Fl
d280: 75 73 68 28 63 68 61 6e 29 20 21 3d 20 54 43 4c ush(chan) != TCL
d290: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
d2a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
d2b0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d2c0: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
d2d0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
d2e0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
d2f0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
d300: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 lBlocking);.
d310: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
d320: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
d330: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 Char);. Tcl_D
d340: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
d350: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
d360: 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 );.. /* Get c
d370: 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 20 2d 20 urrent config -
d380: 45 4f 4c 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2c EOL translation,
d390: 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 20 62 75 encoding and bu
d3a0: 66 66 65 72 69 6e 67 20 6f 70 74 69 6f 6e 73 20 ffering options
d3b0: 61 72 65 20 73 68 61 72 65 64 20 62 65 74 77 65 are shared betwe
d3c0: 65 6e 20 61 6c 6c 20 63 68 61 6e 6e 65 6c 73 20 en all channels
d3d0: 69 6e 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a in the stack */.
d3e0: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e Tcl_GetChann
d3f0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
d400: 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e chan, "-blockin
d410: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 g", &upperChanne
d420: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 lBlocking);.
d430: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
d440: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
d450: 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 n, "-encoding",
d460: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 &upperChannelEnc
d470: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f oding);. Tcl_
d480: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
d490: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
d4a0: 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 -eofchar", &uppe
d4b0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
d4c0: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 ;. Tcl_GetCha
d4d0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
d4e0: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 p, chan, "-trans
d4f0: 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 lation", &upperC
d500: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
d510: 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 73 74 n);.. /* Unst
d520: 61 63 6b 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 ack the channel
d530: 61 6e 64 20 72 65 73 74 6f 72 65 20 75 6e 64 65 and restore unde
d540: 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 20 63 rlying channel c
d550: 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20 69 66 20 onfig */. if
d560: 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e (Tcl_UnstackChan
d570: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e nel(interp, chan
d580: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) == TCL_OK) {..
d590: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
d5a0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 69 tion(interp, chi
d5b0: 6c 64 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c ld, "-encoding",
d5c0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 Tcl_DStringValu
d5d0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 e(&upperChannelE
d5e0: 6e 63 6f 64 69 6e 67 29 29 3b 0a 09 54 63 6c 5f ncoding));..Tcl_
d5f0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
d600: 28 69 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c 20 (interp, child,
d610: 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f "-eofchar", Tcl_
d620: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
d630: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 perChannelEOFCha
d640: 72 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43 68 61 r));..Tcl_SetCha
d650: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
d660: 70 2c 20 63 68 69 6c 64 2c 20 22 2d 74 72 61 6e p, child, "-tran
d670: 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 slation", Tcl_DS
d680: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 tringValue(&uppe
d690: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
d6a0: 69 6f 6e 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43 ion));..Tcl_SetC
d6b0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
d6c0: 65 72 70 2c 20 63 68 69 6c 64 2c 20 22 2d 62 6c erp, child, "-bl
d6d0: 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 ocking", Tcl_DSt
d6e0: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
d6f0: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 ChannelBlocking)
d700: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
d710: 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52 .res = TCL_ERROR
d720: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
d730: 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 Clean-up */.
d740: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
d750: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
d760: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 nslation);. T
d770: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
d780: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
d790: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 ding);. Tcl_D
d7a0: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 StringFree(&uppe
d7b0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
d7c0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
d7d0: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e gFree(&upperChan
d7e0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 nelBlocking);.
d7f0: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a return res;.}.
d800: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
d810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
d850: 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e CTX_Init -- con
d860: 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 struct a SSL_CTX
d870: 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 instance. *. *
d880: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 Results:. *.A va
d890: 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 lid SSL_CTX inst
d8a0: 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a ance or NULL.. *
d8b0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
d8c0: 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 :. *.constructs
d8d0: 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 SSL context (CTX
d8e0: 29 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
d930: 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a tatic SSL_CTX *.
d940: 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a CTX_Init(State *
d950: 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 statePtr, int is
d960: 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 Server, int prot
d970: 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 o, char *keyfile
d980: 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 , char *certfile
d990: 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ,. unsigned c
d9a0: 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e har *key, unsign
d9b0: 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20 54 ed char *cert, T
d9c0: 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 2c cl_Size key_len,
d9d0: 20 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c Tcl_Size cert_l
d9e0: 65 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 en, char *CApath
d9f0: 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 73 74 ,. char *CAst
da00: 6f 72 65 2c 20 63 68 61 72 20 2a 43 41 66 69 6c ore, char *CAfil
da10: 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 e, char *ciphers
da20: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 , char *ciphersu
da30: 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c ites, int level,
da40: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 char *DHparams)
da50: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 {. Tcl_Inter
da60: 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 p *interp = stat
da70: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
da80: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d SSL_CTX *ctx =
da90: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 NULL;. Tcl_D
daa0: 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 69 String ds;. i
dab0: 6e 74 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72 nt off = 0, abor
dac0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c t = 0;. int l
dad0: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b oad_private_key;
dae0: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d . const SSL_M
daf0: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a ETHOD *method;..
db00: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
db10: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
db20: 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 !proto) {..Tcl_A
db30: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
db40: 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 rp, "no valid pr
db50: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 otocol selected"
db60: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
db70: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
db80: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 }.. /* cr
db90: 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 eate SSL context
dba0: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f */.#if OPENSSL_
dbb0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e VERSION_NUMBER >
dbc0: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c = 0x10100000L ||
dbd0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 defined(NO_SSL2
dbe0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
dbf0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 NSSL_NO_SSL2).
dc00: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
dc10: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 oto, TLS_PROTO_S
dc20: 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 SL2)) {..Tcl_App
dc30: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
dc40: 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c , "SSL2 protocol
dc50: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
dc60: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
dc70: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
dc80: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
dc90: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
dca0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
dcb0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 SSL_NO_SSL3).
dcc0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
dcd0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 to, TLS_PROTO_SS
dce0: 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 L3)) {..Tcl_Appe
dcf0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
dd00: 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 "SSL3 protocol
dd10: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
dd20: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
dd30: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
dd40: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 }.#endif.#if d
dd50: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
dd60: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
dd70: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 SL_NO_TLS1).
dd80: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
dd90: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
dda0: 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 1)) {..Tcl_Appen
ddb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
ddc0: 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f "TLS 1.0 protoco
ddd0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
dde0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
ddf0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
de00: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
de10: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
de20: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
de30: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
de40: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
de50: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
de60: 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 TO_TLS1_1)) {..T
de70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
de80: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 interp, "TLS 1.1
de90: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
dea0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
deb0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
dec0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
ded0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
dee0: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 (NO_TLS1_2) || d
def0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
df00: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 O_TLS1_2). if
df10: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
df20: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
df30: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 2)) {..Tcl_Appen
df40: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
df50: 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f "TLS 1.2 protoco
df60: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
df70: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
df80: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
df90: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
dfa0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
dfb0: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _3) || defined(O
dfc0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
dfd0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
dfe0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
dff0: 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 TO_TLS1_3)) {..T
e000: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e010: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 interp, "TLS 1.3
e020: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
e030: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
e040: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
e050: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
e060: 6e 64 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f ndif. if (pro
e070: 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 to == 0) {../* U
e080: 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f se full range */
e090: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 ..SSL_CTX_set_mi
e0a0: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 n_proto_version(
e0b0: 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 ctx, 0);..SSL_CT
e0c0: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f X_set_max_proto_
e0d0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b version(ctx, 0);
e0e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 . }.. swit
e0f0: 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 ch (proto) {.#if
e100: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
e110: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
e120: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 0000L && !define
e130: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 d(NO_SSL2) && !d
e140: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e150: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 O_SSL2). case
e160: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a TLS_PROTO_SSL2:
e170: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
e180: 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 ver ? SSLv2_serv
e190: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 er_method() : SS
e1a0: 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f Lv2_client_metho
e1b0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
e1c0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
e1d0: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 (NO_SSL3) && !de
e1e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e1f0: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e _SSL3) && !defin
e200: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
e210: 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 L3_METHOD). c
e220: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 ase TLS_PROTO_SS
e230: 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 L3:..method = is
e240: 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 Server ? SSLv3_s
e250: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
e260: 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 SSLv3_client_me
e270: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
e280: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
e290: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 ned(NO_TLS1) &&
e2a0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e2b0: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 _NO_TLS1) && !de
e2c0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e2d0: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 _TLS1_METHOD).
e2e0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
e2f0: 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d _TLS1:..method =
e300: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
e310: 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 1_server_method(
e320: 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 ) : TLSv1_client
e330: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
e340: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
e350: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
e360: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
e370: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
e380: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
e390: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d NSSL_NO_TLS1_1_M
e3a0: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 ETHOD). case
e3b0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 TLS_PROTO_TLS1_1
e3c0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 :..method = isSe
e3d0: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 rver ? TLSv1_1_s
e3e0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
e3f0: 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f TLSv1_1_client_
e400: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
e410: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
e420: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
e430: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
e440: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 NSSL_NO_TLS1_2)
e450: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e460: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 SSL_NO_TLS1_2_ME
e470: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 THOD). case T
e480: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a LS_PROTO_TLS1_2:
e490: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
e4a0: 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 ver ? TLSv1_2_se
e4b0: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 rver_method() :
e4c0: 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d TLSv1_2_client_m
e4d0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
e4e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
e4f0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
e500: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e510: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
e520: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
e530: 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 O_TLS1_3:../* Us
e540: 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 e the generic me
e550: 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 thod and constra
e560: 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 int range after
e570: 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 context is creat
e580: 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 ed */..method =
e590: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 isServer ? TLS_s
e5a0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
e5b0: 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 TLS_client_meth
e5c0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
e5d0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 ndif. default
e5e0: 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 :../* Negotiate
e5f0: 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c highest availabl
e600: 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f e SSL/TLS versio
e610: 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 n */..method = i
e620: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 sServer ? TLS_se
e630: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 rver_method() :
e640: 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f TLS_client_metho
e650: 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c d();.#if OPENSSL
e660: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
e670: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 < 0x10100000L &&
e680: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
e690: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
e6a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
e6b0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
e6c0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
e6d0: 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 O_SSL2) ? 0 :
e6e0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 SSL_OP_NO_SSLv2)
e6f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
e700: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
e710: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
e720: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 SL_NO_SSL3)..off
e730: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f |= (ENABLED(pro
e740: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 to, TLS_PROTO_SS
e750: 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f L3) ? 0 : SSL_
e760: 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 OP_NO_SSLv3);.#e
e770: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
e780: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 d(NO_TLS1) && !d
e790: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e7a0: 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 O_TLS1)..off |=
e7b0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
e7c0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 TLS_PROTO_TLS1)
e7d0: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ? 0 : SSL_OP_N
e7e0: 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 O_TLSv1);.#endif
e7f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
e800: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 _TLS1_1) && !def
e810: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
e820: 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 TLS1_1)..off |=
e830: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
e840: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 TLS_PROTO_TLS1_1
e850: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ) ? 0 : SSL_OP_N
e860: 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 O_TLSv1_1);.#end
e870: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
e880: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
e890: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e8a0: 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c O_TLS1_2)..off |
e8b0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
e8c0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
e8d0: 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 _2) ? 0 : SSL_OP
e8e0: 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 _NO_TLSv1_2);.#e
e8f0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
e900: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 d(NO_TLS1_3) &&
e910: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e920: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 _NO_TLS1_3)..off
e930: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f |= (ENABLED(pro
e940: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
e950: 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f S1_3) ? 0 : SSL_
e960: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a OP_NO_TLSv1_3);.
e970: 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 #endif..break;.
e980: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
e990: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
e9a0: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ctx = SSL_CTX_
e9b0: 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 new(method);.
e9c0: 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 if (!ctx) {..re
e9d0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
e9e0: 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 .. if (getenv
e9f0: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 (SSLKEYLOGFILE))
ea00: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
ea10: 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 keylog_callback(
ea20: 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 ctx, KeyLogCallb
ea30: 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 ack);. }..#if
ea40: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
ea50: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
ea60: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
ea70: 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 _3). if (prot
ea80: 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 o == TLS_PROTO_T
ea90: 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 LS1_3) {..SSL_CT
eaa0: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f X_set_min_proto_
eab0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 version(ctx, TLS
eac0: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 1_3_VERSION);..S
ead0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 SL_CTX_set_max_p
eae0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
eaf0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
eb00: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a );. }.#endif.
eb10: 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 . /* Force ci
eb20: 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f pher selection o
eb30: 72 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a rder by server *
eb40: 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72 /. if (!isSer
eb50: 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f ver) {..SSL_CTX_
eb60: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c set_options(ctx,
eb70: 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 SSL_OP_CIPHER_S
eb80: 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 ERVER_PREFERENCE
eb90: 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 );. }..#if OP
eba0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
ebb0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
ebc0: 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 0L. OpenSSL_a
ebd0: 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d dd_all_algorithm
ebe0: 73 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 70 s(); /* Load cip
ebf0: 68 65 72 73 20 61 6e 64 20 64 69 67 65 73 74 73 hers and digests
ec00: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 */.#endif..
ec10: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f SSL_CTX_set_app_
ec20: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a data(ctx, (void*
ec30: 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d )interp);./* rem
ec40: 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 ember the interp
ec50: 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c reter */. SSL
ec60: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
ec70: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c (ctx, SSL_OP_ALL
ec80: 29 3b 09 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c );./* Enable all
ec90: 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f SSL bug workaro
eca0: 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f unds */. SSL_
ecb0: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
ecc0: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 ctx, SSL_OP_NO_C
ecd0: 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 OMPRESSION);./*
ece0: 44 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 Disable compress
ecf0: 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 ion even if supp
ed00: 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c orted */. SSL
ed10: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
ed20: 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 (ctx, off);../*
ed30: 44 69 73 61 62 6c 65 20 73 70 65 63 69 66 69 65 Disable specifie
ed40: 64 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 d protocol versi
ed50: 6f 6e 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 ons */.. /* A
ed60: 6c 6c 6f 77 20 77 72 69 74 65 73 20 74 6f 20 72 llow writes to r
ed70: 65 70 6f 72 74 20 73 75 63 63 65 73 73 20 77 68 eport success wh
ed80: 65 6e 20 6c 65 73 73 20 74 68 61 6e 20 61 6c 6c en less than all
ed90: 20 72 65 63 6f 72 64 73 20 68 61 76 65 20 62 65 records have be
eda0: 65 6e 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 en written */.
edb0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f SSL_CTX_set_mo
edc0: 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 de(ctx, SSL_MODE
edd0: 5f 45 4e 41 42 4c 45 5f 50 41 52 54 49 41 4c 5f _ENABLE_PARTIAL_
ede0: 57 52 49 54 45 29 3b 0a 0a 20 20 20 20 2f 2a 20 WRITE);.. /*
edf0: 44 69 73 61 62 6c 65 20 61 74 74 65 6d 70 74 73 Disable attempts
ee00: 20 74 6f 20 74 72 79 20 74 6f 20 70 72 6f 63 65 to try to proce
ee10: 73 73 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f ss the next reco
ee20: 72 64 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 rd instead of re
ee30: 74 75 72 6e 69 6e 67 20 61 66 74 65 72 20 61 0a turning after a.
ee40: 20 20 20 20 20 20 20 6e 6f 6e 2d 61 70 70 20 72 non-app r
ee50: 65 63 6f 72 64 2e 20 41 76 6f 69 64 73 20 68 61 ecord. Avoids ha
ee60: 6e 67 73 20 69 6e 20 62 6c 6f 63 6b 69 6e 67 20 ngs in blocking
ee70: 6d 6f 64 65 2c 20 77 68 65 6e 20 75 73 69 6e 67 mode, when using
ee80: 20 53 53 4c 5f 72 65 61 64 28 29 20 61 6e 64 20 SSL_read() and
ee90: 61 0a 20 20 20 20 20 20 20 6e 6f 6e 2d 61 70 70 a. non-app
eea0: 6c 69 63 61 74 69 6f 6e 20 72 65 63 6f 72 64 20 lication record
eeb0: 77 61 73 20 73 65 6e 74 20 61 6e 64 20 6e 6f 20 was sent and no
eec0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 61 74 61 application data
eed0: 20 77 61 73 20 73 65 6e 74 2e 20 2a 2f 0a 20 20 was sent. */.
eee0: 20 20 53 53 4c 5f 43 54 58 5f 63 6c 65 61 72 5f SSL_CTX_clear_
eef0: 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f mode(ctx, SSL_MO
ef00: 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 0a DE_AUTO_RETRY);.
ef10: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 . SSL_CTX_ses
ef20: 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 s_set_cache_size
ef30: 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 (ctx, 128);..
ef40: 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66 /* Set user def
ef50: 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69 ined ciphers, ci
ef60: 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64 pher suites, and
ef70: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 security level
ef80: 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 */. if ((ciph
ef90: 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 ers != NULL) &&
efa0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 !SSL_CTX_set_cip
efb0: 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 her_list(ctx, ci
efc0: 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 phers)) {..Tcl_A
efd0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
efe0: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73 rp, "Set ciphers
eff0: 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 failed: No vali
f000: 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 d ciphers", (cha
f010: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c r *) NULL);..SSL
f020: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
f030: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
f040: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 }. if ((cip
f050: 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c hersuites != NUL
f060: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 L) && !SSL_CTX_s
f070: 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 et_ciphersuites(
f080: 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 ctx, ciphersuite
f090: 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e s)) {..Tcl_Appen
f0a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
f0b0: 22 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74 "Set cipher suit
f0c0: 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 es failed: No va
f0d0: 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 lid ciphers", (c
f0e0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 har *) NULL);..S
f0f0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
f100: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
f110: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
f120: 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c t security level
f130: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 */. if (leve
f140: 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 l > -1 && level
f150: 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 < 6) {../* SSL_s
f160: 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 et_security_leve
f170: 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 l */..SSL_CTX_se
f180: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c t_security_level
f190: 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 (ctx, level);.
f1a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 }.. /* set
f1b0: 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a some callbacks *
f1c0: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 /. SSL_CTX_se
f1d0: 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 t_default_passwd
f1e0: 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 _cb(ctx, Passwor
f1f0: 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 dCallback);.
f200: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 SSL_CTX_set_defa
f210: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 ult_passwd_cb_us
f220: 65 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 erdata(ctx, (voi
f230: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a d *)statePtr);..
f240: 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 /* read a Di
f250: 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 ffie-Hellman par
f260: 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 ameters file, or
f270: 20 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 use the built-i
f280: 6e 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 54 63 6c n one */. Tcl
f290: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 _DStringInit(&ds
f2a0: 29 3b 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 );.#ifdef OPENSS
f2b0: 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 L_NO_DH. if (
f2c0: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c DHparams != NULL
f2d0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
f2e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 esult(interp, "D
f2f0: 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 H parameter supp
f300: 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c ort not availabl
f310: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c e", (char *) NUL
f320: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
f330: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
f340: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 NULL;. }.#els
f350: 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b e. {..DH* dh;
f360: 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 ..if (DHparams !
f370: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 = NULL) {.. B
f380: 49 4f 20 2a 62 69 6f 3b 0a 0a 09 20 20 20 20 62 IO *bio;... b
f390: 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c io = BIO_new_fil
f3a0: 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 e(F2N(DHparams,
f3b0: 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 &ds), "r");..
f3c0: 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 if (!bio) {...T
f3d0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
f3e0: 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e ds);...Tcl_Appen
f3f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
f400: 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 "Could not find
f410: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 DH parameters fi
f420: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 le", (char *) NU
f430: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
f440: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 ree(ctx);...retu
f450: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a rn NULL;.. }.
f460: 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 .. dh = PEM_r
f470: 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 ead_bio_DHparams
f480: 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c (bio, NULL, NULL
f490: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 , NULL);.. BI
f4a0: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 O_free(bio);..
f4b0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
f4c0: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 e(&ds);.. if
f4d0: 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 (!dh) {...Tcl_Ap
f4e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f4f0: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 p, "Could not re
f500: 61 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 ad DH parameters
f510: 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 from file", (ch
f520: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
f530: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
f540: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
f550: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 53 53 4c .. }.. SSL
f560: 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 _CTX_set_tmp_dh(
f570: 63 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 20 44 ctx, dh);.. D
f580: 48 5f 66 72 65 65 28 64 68 29 3b 0a 0a 09 7d 20 H_free(dh);...}
f590: 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20 55 else {.. /* U
f5a0: 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48 se well known DH
f5b0: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 parameters that
f5c0: 20 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20 73 have built-in s
f5d0: 75 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53 53 upport in OpenSS
f5e0: 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21 53 L */.. if (!S
f5f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61 75 SL_CTX_set_dh_au
f600: 74 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09 09 to(ctx, 1)) {...
f610: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
f620: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 (interp, "Could
f630: 6e 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20 44 not enable set D
f640: 48 20 61 75 74 6f 3a 20 22 2c 20 47 45 54 5f 45 H auto: ", GET_E
f650: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
f660: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
f670: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
f680: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
f690: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d .. }..}. }
f6a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
f6b0: 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 set our certific
f6c0: 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f ate */. load_
f6d0: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b private_key = 0;
f6e0: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c . if (certfil
f6f0: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f e != NULL) {..lo
f700: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d ad_private_key =
f710: 20 31 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 1;...if (SSL_CT
f720: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 X_use_certificat
f730: 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 e_file(ctx, F2N(
f740: 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 certfile, &ds),
f750: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d SSL_FILETYPE_PEM
f760: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 ) <= 0) {.. T
f770: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
f780: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 ds);.. Tcl_Ap
f790: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f7a0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 p, "unable to se
f7b0: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 t certificate fi
f7c0: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 le ", certfile,
f7d0: 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f ": ",...GET_ERR_
f7e0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
f7f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
f800: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
f810: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
f820: 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 LL;..}..Tcl_DStr
f830: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 20 ingFree(&ds);..
f840: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 } else if (ce
f850: 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c rt != NULL) {..l
f860: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 oad_private_key
f870: 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 = 1;..if (SSL_CT
f880: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 X_use_certificat
f890: 65 5f 41 53 4e 31 28 63 74 78 2c 20 28 69 6e 74 e_ASN1(ctx, (int
f8a0: 29 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 ) cert_len, cert
f8b0: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 ) <= 0) {.. T
f8c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
f8d0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
f8e0: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 to set certifica
f8f0: 74 65 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 te: ",...GET_ERR
f900: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 _REASON(), (char
f910: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
f920: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
f930: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
f940: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c ULL;..}. } el
f950: 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d se {..certfile =
f960: 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 (char*)X509_get
f970: 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 _default_cert_fi
f980: 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f le();...if (SSL_
f990: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
f9a0: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 ate_file(ctx, ce
f9b0: 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 rtfile, SSL_FILE
f9c0: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 TYPE_PEM) <= 0)
f9d0: 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c {.#if 0.. Tcl
f9e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
f9f0: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
fa00: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 use default cer
fa10: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c tificate file ",
fa20: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c certfile, ": ",
fa30: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f ...GET_ERR_REASO
fa40: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
fa50: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
fa60: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
fa70: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 return NULL;.#
fa80: 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a endif..}. }..
fa90: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 /* set our p
faa0: 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 rivate key */.
fab0: 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 if (load_priva
fac0: 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b te_key) {..if (k
fad0: 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 eyfile == NULL &
fae0: 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b & key == NULL) {
faf0: 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 .. keyfile =
fb00: 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 certfile;..}...i
fb10: 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 f (keyfile != NU
fb20: 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 LL) {.. /* ge
fb30: 74 20 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 t the private ke
fb40: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 y associated wit
fb50: 68 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61 h this certifica
fb60: 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b te */.. if (k
fb70: 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 eyfile == NULL)
fb80: 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 {...keyfile = ce
fb90: 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a rtfile;.. }..
fba0: 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 . if (SSL_CTX
fbb0: 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f _use_PrivateKey_
fbc0: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 file(ctx, F2N(ke
fbd0: 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c yfile, &ds), SSL
fbe0: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c _FILETYPE_PEM) <
fbf0: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 = 0) {...Tcl_DSt
fc00: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
fc10: 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 ./* flush the pa
fc20: 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d ssphrase which m
fc30: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 ight be left in
fc40: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 the result */...
fc50: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
fc60: 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f terp, NULL, TCL_
fc70: 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 STATIC);...Tcl_A
fc80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
fc90: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
fca0: 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 et public key fi
fcb0: 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 le ", keyfile, "
fcc0: 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52 ",... GET_ER
fcd0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
fce0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
fcf0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
fd00: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
fd10: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f . }.. Tcl_
fd20: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
fd30: 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b ;...} else if (k
fd40: 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 ey != NULL) {..
fd50: 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 if (SSL_CTX_u
fd60: 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 se_PrivateKey_AS
fd70: 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c N1(EVP_PKEY_RSA,
fd80: 20 63 74 78 2c 20 6b 65 79 2c 20 28 69 6e 74 29 ctx, key, (int)
fd90: 20 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 key_len) <= 0)
fda0: 7b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 {.../* flush the
fdb0: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 passphrase whic
fdc0: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 h might be left
fdd0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f in the result */
fde0: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
fdf0: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 (interp, NULL, T
fe00: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 CL_STATIC);...Tc
fe10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
fe20: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
fe30: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 o set public key
fe40: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
fe50: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
fe60: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
fe70: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
fe80: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
fe90: 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 }..}../* Now we
fea0: 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 know that a key
feb0: 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 and cert have be
fec0: 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 en set against..
fed0: 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 * the SSL conte
fee0: 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f xt */..if (!SSL_
fef0: 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 CTX_check_privat
ff00: 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 e_key(ctx)) {..
ff10: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
ff20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 ult(interp, "pri
ff30: 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f vate key does no
ff40: 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 t match the cert
ff50: 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b ificate public k
ff60: 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 ey",.... (ch
ff70: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
ff80: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
ff90: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
ffa0: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a NULL;..}. }.
ffb0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 . /* Set to u
ffc0: 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c se the default l
ffd0: 6f 63 61 74 69 6f 6e 20 61 6e 64 20 66 69 6c 65 ocation and file
ffe0: 20 66 6f 72 20 43 65 72 74 69 66 69 63 61 74 65 for Certificate
fff0: 20 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 20 Authority (CA)
10000 63 65 72 74 69 66 69 63 61 74 65 73 2e 0a 20 20 certificates..
10010 20 20 20 2a 20 54 68 65 20 64 65 66 61 75 6c 74 * The default
10020 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65 73 CA certificates
10030 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 63 61 directory is ca
10040 6c 6c 65 64 20 63 65 72 74 73 20 69 6e 20 74 68 lled certs in th
10050 65 20 64 65 66 61 75 6c 74 20 4f 70 65 6e 53 53 e default OpenSS
10060 4c 0a 20 20 20 20 20 2a 20 64 69 72 65 63 74 6f L. * directo
10070 72 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 ry. It contains
10080 74 68 65 20 43 41 20 63 65 72 74 69 66 69 63 61 the CA certifica
10090 74 65 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d 61 tes in PEM forma
100a0 74 2c 20 77 69 74 68 20 6f 6e 65 20 63 65 72 74 t, with one cert
100b0 69 66 69 63 61 74 65 20 70 65 72 0a 20 20 20 20 ificate per.
100c0 20 2a 20 66 69 6c 65 2e 20 54 68 65 20 76 65 72 * file. The ver
100d0 69 66 79 20 70 61 74 68 20 61 6e 64 20 73 74 6f ify path and sto
100e0 72 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 re can be overri
100f0 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f dden by the SSL_
10100 43 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72 CERT_DIR env var
10110 2e 20 54 68 65 0a 20 20 20 20 20 2a 20 64 65 66 . The. * def
10120 61 75 6c 74 20 43 41 20 63 65 72 74 69 66 69 63 ault CA certific
10130 61 74 65 73 20 66 69 6c 65 20 69 73 20 63 61 6c ates file is cal
10140 6c 65 64 20 63 65 72 74 2e 70 65 6d 20 69 6e 20 led cert.pem in
10150 74 68 65 20 64 65 66 61 75 6c 74 20 4f 70 65 6e the default Open
10160 53 53 4c 20 64 69 72 65 63 74 6f 72 79 2e 0a 20 SSL directory..
10170 20 20 20 20 2a 20 54 68 65 20 76 65 72 69 66 79 * The verify
10180 20 66 69 6c 65 20 63 61 6e 20 62 65 20 6f 76 65 file can be ove
10190 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 rridden by the S
101a0 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e 76 SL_CERT_FILE env
101b0 20 76 61 72 2e 20 2a 2f 0a 20 20 20 20 69 66 20 var. */. if
101c0 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 (!SSL_CTX_set_de
101d0 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 fault_verify_pat
101e0 68 73 28 63 74 78 29 29 20 7b 0a 09 61 62 6f 72 hs(ctx)) {..abor
101f0 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 t++;. }..
10200 2f 2a 20 4f 76 65 72 72 69 64 65 73 20 66 6f 72 /* Overrides for
10210 20 74 68 65 20 43 41 20 76 65 72 69 66 79 20 70 the CA verify p
10220 61 74 68 20 61 6e 64 20 66 69 6c 65 20 2a 2f 0a ath and file */.
10230 20 20 20 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 {.#if OPENSS
10240 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
10250 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
10260 69 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55 if (CApath != NU
10270 4c 4c 20 7c 7c 20 43 41 66 69 6c 65 20 21 3d 20 LL || CAfile !=
10280 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c NULL) {.. Tcl
10290 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 09 20 _DString ds1;..
102a0 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
102b0 69 74 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 it(&ds1);...
102c0 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 if (!SSL_CTX_loa
102d0 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f d_verify_locatio
102e0 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 ns(ctx, F2N(CAfi
102f0 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 le, &ds), F2N(CA
10300 70 61 74 68 2c 20 26 64 73 31 29 29 29 20 7b 0a path, &ds1))) {.
10310 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
10320 6c 74 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 lt(interp, GET_E
10330 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
10340 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
10350 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
10360 3b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 ;...Tcl_DStringF
10370 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f ree(&ds);...Tcl_
10380 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 DStringFree(&ds1
10390 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
103a0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 ;.. }.. Tc
103b0 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
103c0 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 s);.. Tcl_DSt
103d0 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a ringFree(&ds1);.
103e0 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 .. /* Set lis
103f0 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 t of CAs to send
10400 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 to client when
10410 72 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 requesting a cli
10420 65 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 ent certificate
10430 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 73 */.. /* https
10440 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e ://sourceforge.n
10450 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 et/p/tls/bugs/57
10460 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 58 / */.. /* XXX
10470 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 :TODO: Let the u
10480 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 ser supply value
10490 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f s here instead o
104a0 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 f something that
104b0 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 exists on the f
104c0 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 20 ilesystem */..
104d0 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f STACK_OF(X509_
104e0 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 NAME) *certNames
104f0 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 = SSL_load_clie
10500 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 nt_CA_file(F2N(C
10510 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 Afile, &ds));..
10520 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 if (certNames
10530 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 != NULL) {...SS
10540 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 L_CTX_set_client
10550 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 _CA_list(ctx, ce
10560 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d rtNames);.. }
10570 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
10580 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a gFree(&ds);..}..
10590 23 65 6c 73 65 0a 09 2f 2a 20 53 65 74 20 64 69 #else../* Set di
105a0 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 rectory containi
105b0 6e 67 20 43 41 20 63 65 72 74 69 66 69 63 61 74 ng CA certificat
105c0 65 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d 61 74 es in PEM format
105d0 2e 20 2a 2f 0a 09 69 66 20 28 43 41 70 61 74 68 . */..if (CApath
105e0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
105f0 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f if (!SSL_CTX_lo
10600 61 64 5f 76 65 72 69 66 79 5f 64 69 72 28 63 74 ad_verify_dir(ct
10610 78 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 x, F2N(CApath, &
10620 64 73 29 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 ds))) {...Tcl_Ap
10630 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
10640 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f p, GET_ERR_REASO
10650 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
10660 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
10670 72 65 65 28 63 74 78 29 3b 0a 09 09 54 63 6c 5f ree(ctx);...Tcl_
10680 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
10690 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
106a0 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c .. }.. Tcl
106b0 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
106c0 29 3b 0a 09 7d 0a 09 0a 09 2f 2a 20 53 65 74 20 );..}..../* Set
106d0 55 52 49 20 66 6f 72 20 74 6f 20 61 20 73 74 6f URI for to a sto
106e0 72 65 2c 20 77 68 69 63 68 20 6d 61 79 20 62 65 re, which may be
106f0 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e 74 61 69 a single contai
10700 6e 65 72 20 6f 72 20 61 20 63 61 74 61 6c 6f 67 ner or a catalog
10710 20 6f 66 20 63 6f 6e 74 61 69 6e 65 72 73 2e 20 of containers.
10720 2a 2f 0a 09 69 66 20 28 43 41 73 74 6f 72 65 20 */..if (CAstore
10730 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
10740 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 if (!SSL_CTX_loa
10750 64 5f 76 65 72 69 66 79 5f 73 74 6f 72 65 28 63 d_verify_store(c
10760 74 78 2c 20 46 32 4e 28 43 41 73 74 6f 72 65 2c tx, F2N(CAstore,
10770 20 26 64 73 29 29 29 20 7b 0a 09 09 54 63 6c 5f &ds))) {...Tcl_
10780 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
10790 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 erp, GET_ERR_REA
107a0 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
107b0 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
107c0 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 54 63 _free(ctx);...Tc
107d0 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
107e0 73 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c s);...return NUL
107f0 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 L;.. }.. T
10800 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
10810 64 73 29 3b 0a 09 7d 0a 09 0a 09 2f 2a 20 53 65 ds);..}..../* Se
10820 74 20 66 69 6c 65 20 6f 66 20 43 41 20 63 65 72 t file of CA cer
10830 74 69 66 69 63 61 74 65 73 20 69 6e 20 50 45 4d tificates in PEM
10840 20 66 6f 72 6d 61 74 2e 20 20 2a 2f 0a 09 69 66 format. */..if
10850 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c (CAfile != NULL
10860 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 ) {.. if (!SS
10870 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 L_CTX_load_verif
10880 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 y_file(ctx, F2N(
10890 43 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20 7b CAfile, &ds))) {
108a0 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
108b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 45 54 5f ult(interp, GET_
108c0 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
108d0 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
108e0 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
108f0 29 3b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 );...Tcl_DString
10900 46 72 65 65 28 26 64 73 29 3b 0a 09 09 72 65 74 Free(&ds);...ret
10910 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d urn NULL;.. }
10920 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
10930 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 gFree(&ds);...
10940 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 /* Set list of
10950 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 CAs to send to
10960 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 client when requ
10970 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 esting a client
10980 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
10990 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 STACK_OF(X50
109a0 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 9_NAME) *certNam
109b0 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c es = SSL_load_cl
109c0 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e ient_CA_file(F2N
109d0 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a (CAfile, &ds));.
109e0 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d . if (certNam
109f0 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 es != NULL) {...
10a00 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 SSL_CTX_set_clie
10a10 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 nt_CA_list(ctx,
10a20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 certNames);..
10a30 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 }.. Tcl_DStr
10a40 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d ingFree(&ds);..}
10a50 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 .#endif. }..
10a60 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d return ctx;.}
10a70 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
10a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
10ac0 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d * StatusObjCmd -
10ad0 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 - return certifi
10ae0 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 cate for connect
10af0 65 64 20 70 65 65 72 20 69 6e 66 6f 2e 0a 20 2a ed peer info.. *
10b00 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
10b10 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
10b20 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
10b30 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
10b40 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
10b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
10b90 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74 .static int.Stat
10ba0 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 usObjCmd(ClientD
10bb0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
10bc0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
10bd0 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
10be0 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
10bf0 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 65 v[]) {. State
10c00 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 *statePtr;.
10c10 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 X509 *peer;.
10c20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
10c30 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
10c40 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 chan;. char
10c50 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 *channelName, *c
10c60 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 iphers;. int
10c70 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 mode;. const
10c80 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 unsigned char *p
10c90 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e roto;. unsign
10ca0 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 ed int len;.
10cb0 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20 int nid, res;.
10cc0 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 (void) clientD
10cd0 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ata;.. dprint
10ce0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
10cf0 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c if (objc < 2 |
10d00 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f | objc > 3 || (o
10d10 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 73 74 72 bjc == 3 && !str
10d20 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e cmp(Tcl_GetStrin
10d30 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f g(objv[1]), "-lo
10d40 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 cal"))) {..Tcl_W
10d50 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
10d60 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d rp, 1, objv, "?-
10d70 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 local? channel")
10d80 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
10d90 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
10da0 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 /* Get channel I
10db0 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c d */. channel
10dc0 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 Name = Tcl_GetSt
10dd0 72 69 6e 67 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 ring(objv[(objc
10de0 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d 29 3b == 2 ? 1 : 2)]);
10df0 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
10e00 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
10e10 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 p, channelName,
10e20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 &mode);. if (
10e30 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
10e40 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
10e50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
10e60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
10e70 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
10e80 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
10e90 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
10ea0 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
10eb0 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
10ec0 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 ;. if (Tcl_Ge
10ed0 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
10ee0 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
10ef0 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f lType()) {..Tcl_
10f00 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
10f10 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
10f20 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
10f30 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
10f40 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c ..."\": not a TL
10f50 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 S channel", (cha
10f60 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c r *) NULL);..Tcl
10f70 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
10f80 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 terp, "TLS", "ST
10f90 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 ATUS", "CHANNEL"
10fa0 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
10fb0 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
10fc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
10fd0 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 }. stateP
10fe0 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 tr = (State *) T
10ff0 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
11000 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b tanceData(chan);
11010 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 .. /* Get cer
11020 74 69 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 tificate for pee
11030 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 r or self */.
11040 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 if (objc == 2)
11050 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 {..peer = SSL_ge
11060 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 t_peer_certifica
11070 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
11080 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
11090 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f .peer = SSL_get_
110a0 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 certificate(stat
110b0 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
110c0 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30 }. /* Get X50
110d0 39 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 9 certificate in
110e0 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 fo */. if (pe
110f0 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 er) {..objPtr =
11100 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 Tls_NewX509Obj(i
11110 6e 74 65 72 70 2c 20 70 65 65 72 2c 20 31 29 3b nterp, peer, 1);
11120 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 ..if (objc == 2)
11130 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72 65 {.. X509_fre
11140 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70 65 e(peer);.. pe
11150 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 er = NULL;..}.
11160 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 } else {..objP
11170 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 tr = Tcl_NewList
11180 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 Obj(0, NULL);.
11190 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 }.. /* Peer
111a0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 name */. LAP
111b0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
111c0 20 6f 62 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 objPtr, "peerna
111d0 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 me", SSL_get0_pe
111e0 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d ername(statePtr-
111f0 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 >ssl), -1);.
11200 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
11210 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 rp, objPtr, "sbi
11220 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 ts", SSL_get_cip
11230 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 74 her_bits(statePt
11240 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a r->ssl, NULL));.
11250 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 . ciphers = (
11260 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 char*)SSL_get_ci
11270 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 pher(statePtr->s
11280 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 sl);. LAPPEND
11290 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
112a0 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 63 Ptr, "cipher", c
112b0 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 iphers, -1);..
112c0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 /* Verify the
112d0 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 X509 certificate
112e0 20 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 68 presented by th
112f0 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 e peer */. LA
11300 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11310 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 , objPtr, "verif
11320 79 52 65 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f yResult",..X509_
11330 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f verify_cert_erro
11340 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 r_string(SSL_get
11350 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 _verify_result(s
11360 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 tatePtr->ssl)),
11370 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 -1);.. /* Ver
11380 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 ify mode */.
11390 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 mode = SSL_get_v
113a0 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 erify_mode(state
113b0 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 Ptr->ssl);. i
113c0 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 f (mode && SSL_V
113d0 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c ERIFY_NONE) {..L
113e0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
113f0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 p, objPtr, "veri
11400 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c fyMode", "none",
11410 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 -1);. } else
11420 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 {..Tcl_Obj *lis
11430 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 tObjPtr = Tcl_Ne
11440 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
11450 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 );..if (mode &&
11460 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 29 SSL_VERIFY_PEER)
11470 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
11480 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
11490 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a (interp, listObj
114a0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
114b0 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 ngObj("peer", -1
114c0 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 ));..}..if (mode
114d0 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 && SSL_VERIFY_F
114e0 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 AIL_IF_NO_PEER_C
114f0 45 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f ERT) {.. Tcl_
11500 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
11510 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
11520 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
11530 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 StringObj("fail
11540 69 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74 22 if no peer cert"
11550 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
11560 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
11570 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 FY_CLIENT_ONCE)
11580 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
11590 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
115a0 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 interp, listObjP
115b0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
115c0 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 gObj("client onc
115d0 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 e", -1));..}..if
115e0 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 (mode && SSL_VE
115f0 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 RIFY_POST_HANDSH
11600 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f AKE) {.. Tcl_
11610 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
11620 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
11630 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
11640 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 StringObj("post
11650 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 handshake", -1))
11660 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 ;..}..LAPPEND_OB
11670 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 J(interp, objPtr
11680 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 , "verifyMode",
11690 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 listObjPtr).
116a0 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 }.. /* Verify
116b0 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 mode depth */.
116c0 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 LAPPEND_INT(i
116d0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
116e0 76 65 72 69 66 79 44 65 70 74 68 22 2c 20 53 53 verifyDepth", SS
116f0 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70 L_get_verify_dep
11700 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c th(statePtr->ssl
11710 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f ));.. /* Repo
11720 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 rt the selected
11730 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 protocol as a re
11740 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f sult of the nego
11750 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 tiation */. S
11760 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c SL_get0_alpn_sel
11770 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e ected(statePtr->
11780 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 ssl, &proto, &le
11790 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f n);. LAPPEND_
117a0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
117b0 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 tr, "alpn", (cha
117c0 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f r *)proto, (Tcl_
117d0 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 Size) len);.
117e0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
117f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f rp, objPtr, "pro
11800 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f tocol", SSL_get_
11810 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72 version(statePtr
11820 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 ->ssl), -1);..
11830 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e /* Valid for n
11840 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72 65 on-RSA signature
11850 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a and TLS 1.3 */.
11860 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 if (objc ==
11870 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 2) {..res = SSL_
11880 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 get_peer_signatu
11890 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d re_nid(statePtr-
118a0 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 >ssl, &nid);.
118b0 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
118c0 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 SSL_get_signatu
118d0 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d re_nid(statePtr-
118e0 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 >ssl, &nid);.
118f0 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 }. if (!res)
11900 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 {nid = 0;}.
11910 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11920 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 rp, objPtr, "sig
11930 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 natureHashAlgori
11940 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e thm", OBJ_nid2ln
11950 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 (nid), -1);..
11960 20 2f 2a 20 41 64 64 65 64 20 69 6e 20 4f 70 65 /* Added in Ope
11970 6e 53 53 4c 20 31 2e 31 2e 31 61 20 2a 2f 0a 23 nSSL 1.1.1a */.#
11980 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
11990 4f 4e 5f 4e 55 4d 42 45 52 20 3e 20 30 78 31 30 ON_NUMBER > 0x10
119a0 31 30 31 30 30 30 4c 0a 20 20 20 20 69 66 20 28 101000L. if (
119b0 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 objc == 2) {..re
119c0 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 s = SSL_get_peer
119d0 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f _signature_type_
119e0 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
119f0 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 l, &nid);. }
11a00 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 else {..res = SS
11a10 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f L_get_signature_
11a20 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 type_nid(statePt
11a30 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 r->ssl, &nid);.
11a40 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 }. if (!re
11a50 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 s) {nid = 0;}.
11a60 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
11a70 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
11a80 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c 20 4f ignatureType", O
11a90 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 BJ_nid2ln(nid),
11aa0 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 -1);.#endif..
11ab0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
11ac0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
11ad0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
11ae0 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
11af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b10 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 --. *. * Connect
11b40 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d ionInfoObjCmd --
11b50 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 return connecti
11b60 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 on info from Ope
11b70 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 nSSL.. *. * Resu
11b80 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f lts:. *.A list o
11b90 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 f connection inf
11ba0 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d o. *. *--------
11bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
11bf0 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e .static int Conn
11c00 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 ectionInfoObjCmd
11c10 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
11c20 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
11c30 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
11c40 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
11c50 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
11c60 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
11c70 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
11c80 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
11c90 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 de on */. Sta
11ca0 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f te *statePtr;../
11cb0 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
11cc0 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
11cd0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
11ce0 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a jPtr, *listPtr;.
11cf0 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 const SSL *s
11d00 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 sl;. const SS
11d10 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 L_CIPHER *cipher
11d20 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f ;. const SSL_
11d30 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e SESSION *session
11d40 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f ;. const EVP_
11d50 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 MD *md;. (voi
11d60 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a d) clientData;..
11d70 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
11d80 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
11d90 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 objc != 2) {..Tc
11da0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
11db0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
11dc0 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 "channel");..ret
11dd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
11de0 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d }.. chan =
11df0 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
11e00 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
11e10 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 tring(objv[1]),
11e20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
11e30 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
11e40 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
11e50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
11e60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
11e70 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
11e80 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
11e90 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
11ea0 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
11eb0 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
11ec0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
11ed0 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
11ee0 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
11ef0 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 Type()) {..Tcl_A
11f00 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
11f10 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
11f20 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
11f30 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
11f40 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 . "\": not a
11f50 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 TLS channel", (c
11f60 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 har *) NULL);..T
11f70 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
11f80 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
11f90 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 CONNECTION", "CH
11fa0 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 ANNEL", "INVALID
11fb0 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
11fc0 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
11fd0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
11fe0 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 objPtr = Tcl_Ne
11ff0 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
12000 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 );.. /* Conne
12010 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 ction info */.
12020 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 statePtr = (St
12030 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 ate *)Tcl_GetCha
12040 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
12050 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 (chan);. ssl
12060 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b = statePtr->ssl;
12070 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 . if (ssl !=
12080 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 NULL) {..const u
12090 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 nsigned char *pr
120a0 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 oto;..unsigned i
120b0 6e 74 20 75 6c 65 6e 3b 0a 0a 09 2f 2a 20 49 6e nt ulen;.../* In
120c0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6e itialization fin
120d0 69 73 68 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e ished */..LAPPEN
120e0 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
120f0 62 6a 50 74 72 2c 20 22 69 6e 69 74 5f 66 69 6e bjPtr, "init_fin
12100 69 73 68 65 64 22 2c 20 53 53 4c 5f 69 73 5f 69 ished", SSL_is_i
12110 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 73 6c nit_finished(ssl
12120 29 29 3b 0a 09 0a 09 2f 2a 20 63 6f 6e 6e 65 63 ));..../* connec
12130 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c tion state */..L
12140 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
12150 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 p, objPtr, "stat
12160 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 e", SSL_state_st
12170 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 ring_long(ssl),
12180 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e -1);.../* Get SN
12190 49 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76 I requested serv
121a0 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 er name */..LAPP
121b0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
121c0 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 6e objPtr, "servern
121d0 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 ame", SSL_get_se
121e0 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c rvername(ssl, TL
121f0 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f SEXT_NAMETYPE_ho
12200 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a st_name), -1);..
12210 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 ./* Report the s
12220 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
12230 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 as a result of
12240 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 the negotiation
12250 2a 2f 0a 09 53 53 4c 5f 67 65 74 30 5f 61 6c 70 */..SSL_get0_alp
12260 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 n_selected(state
12270 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f Ptr->ssl, &proto
12280 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 , &ulen);..LAPPE
12290 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
122a0 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 bjPtr, "alpn", (
122b0 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 char *)proto, (T
122c0 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a cl_Size) ulen);.
122d0 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f ../* Get protoco
122e0 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 l */..LAPPEND_ST
122f0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
12300 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 , "protocol", SS
12310 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 L_get_version(ss
12320 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 l), -1);.../* Re
12330 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f negotiation allo
12340 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f wed */..LAPPEND_
12350 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
12360 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 Ptr, "renegotiat
12370 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 ion_allowed", SS
12380 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e L_get_secure_ren
12390 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f egotiation_suppo
123a0 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c 29 29 rt((SSL *) ssl))
123b0 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 ;.../* Get secur
123c0 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 ity level */..LA
123d0 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
123e0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72 , objPtr, "secur
123f0 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f ity_level", SSL_
12400 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 get_security_lev
12410 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 el(ssl));.../* S
12420 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 ession info */..
12430 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
12440 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
12450 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 ssion_reused", S
12460 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 SL_session_reuse
12470 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 d(ssl));.../* Is
12480 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a server info */.
12490 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
124a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 terp, objPtr, "i
124b0 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 s_server", SSL_i
124c0 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a s_server(ssl));.
124d0 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a ../* Is DTLS */.
124e0 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
124f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 terp, objPtr, "i
12500 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f s_dtls", SSL_is_
12510 64 74 6c 73 28 73 73 6c 29 29 3b 0a 0a 23 69 66 dtls(ssl));..#if
12520 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
12530 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33 30 32 _NUMBER >= 0x302
12540 30 30 30 30 30 4c 0a 09 2f 2a 20 49 73 20 51 55 00000L../* Is QU
12550 49 43 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 IC */..LAPPEND_B
12560 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
12570 74 72 2c 20 22 69 73 5f 71 75 69 63 22 2c 20 53 tr, "is_quic", S
12580 53 4c 5f 69 73 5f 71 75 69 63 28 73 73 6c 29 29 SL_is_quic(ssl))
12590 3b 0a 0a 09 2f 2a 20 49 73 20 54 4c 53 20 2a 2f ;.../* Is TLS */
125a0 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
125b0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
125c0 69 73 5f 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f is_tls", SSL_is_
125d0 74 6c 73 28 73 73 6c 29 29 3b 0a 23 65 6e 64 69 tls(ssl));.#endi
125e0 66 0a 0a 09 2f 2a 20 44 41 4e 45 20 54 4c 53 20 f.../* DANE TLS
125f0 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 2a authentication *
12600 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
12610 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12620 22 64 61 6e 65 5f 61 75 74 68 22 2c 20 53 53 4c "dane_auth", SSL
12630 5f 67 65 74 30 5f 64 61 6e 65 28 28 53 53 4c 20 _get0_dane((SSL
12640 2a 29 73 73 6c 29 20 21 3d 20 4e 55 4c 4c 29 3b *)ssl) != NULL);
12650 0a 0a 09 2f 2a 20 57 61 69 74 69 6e 67 20 66 6f .../* Waiting fo
12660 72 20 61 73 79 6e 63 20 2a 2f 0a 09 4c 41 50 50 r async */..LAPP
12670 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
12680 20 6f 62 6a 50 74 72 2c 20 22 77 61 69 74 69 6e objPtr, "waitin
12690 67 5f 66 6f 72 5f 61 73 79 6e 63 22 2c 20 53 53 g_for_async", SS
126a0 4c 5f 77 61 69 74 69 6e 67 5f 66 6f 72 5f 61 73 L_waiting_for_as
126b0 79 6e 63 28 28 53 53 4c 20 2a 29 73 73 6c 29 29 ync((SSL *)ssl))
126c0 3b 0a 0a 09 2f 2a 20 54 69 6d 65 2d 6f 75 74 20 ;.../* Time-out
126d0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 */..LAPPEND_LONG
126e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
126f0 20 22 74 69 6d 65 2d 6f 75 74 22 2c 20 53 53 4c "time-out", SSL
12700 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 74 69 6d _get_default_tim
12710 65 6f 75 74 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a eout(ssl));.../*
12720 20 49 73 20 43 65 72 74 69 66 69 63 61 74 65 20 Is Certificate
12730 54 72 61 6e 73 70 61 72 65 6e 63 79 20 76 61 6c Transparency val
12740 69 64 61 74 69 6f 6e 20 65 6e 61 62 6c 65 64 20 idation enabled
12750 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
12760 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12770 20 22 63 74 5f 65 6e 61 62 6c 65 64 22 2c 20 53 "ct_enabled", S
12780 53 4c 5f 63 74 5f 69 73 5f 65 6e 61 62 6c 65 64 SL_ct_is_enabled
12790 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 (ssl));. }..
127a0 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 /* Cipher inf
127b0 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 o */. cipher
127c0 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e = SSL_get_curren
127d0 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 t_cipher(ssl);.
127e0 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d if (cipher !=
127f0 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 NULL) {..char b
12800 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d uf[BUFSIZ] = {0}
12810 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 ;..int bits, alg
12820 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 _bits;.../* Ciph
12830 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 er name */..LAPP
12840 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
12850 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 objPtr, "cipher"
12860 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 , SSL_CIPHER_get
12870 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d _name(cipher), -
12880 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 1);.../* RFC nam
12890 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 e of cipher */..
128a0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
128b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 rp, objPtr, "sta
128c0 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c ndard_name", SSL
128d0 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 _CIPHER_standard
128e0 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d _name(cipher), -
128f0 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 1);.../* OpenSSL
12900 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 name of cipher
12910 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
12920 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12930 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 "openssl_name",
12940 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e OPENSSL_cipher_n
12950 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 ame(SSL_CIPHER_s
12960 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 tandard_name(cip
12970 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a her)), -1);.../*
12980 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72 65 number of secre
12990 74 20 62 69 74 73 20 75 73 65 64 20 66 6f 72 20 t bits used for
129a0 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 cipher */..bits
129b0 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 = SSL_CIPHER_get
129c0 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 61 _bits(cipher, &a
129d0 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 lg_bits);..LAPPE
129e0 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
129f0 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f 62 bjPtr, "secret_b
12a00 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 its", bits);..LA
12a10 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
12a20 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 , objPtr, "algor
12a30 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f ithm_bits", alg_
12a40 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 bits);../* alg_b
12a50 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65 its is actual ke
12a60 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 49 y secret bits. I
12a70 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 73 f use bits and s
12a80 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d ecret (algorithm
12a90 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09 ) bits differ,..
12aa0 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 the rest of t
12ab0 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65 he bits are fixe
12ac0 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 d, i.e. for limi
12ad0 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65 ted export ciphe
12ae0 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a rs (bits < 56) *
12af0 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 /.../* Indicates
12b00 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 which SSL/TLS p
12b10 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 rotocol version
12b20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 74 68 first defined th
12b30 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 e cipher */..LAP
12b40 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
12b50 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 objPtr, "min_ve
12b60 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 rsion", SSL_CIPH
12b70 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 ER_get_version(c
12b80 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f ipher), -1);.../
12b90 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a * Cipher NID */.
12ba0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
12bb0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 erp, objPtr, "ci
12bc0 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72 20 pherNID", (char
12bd0 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c *)OBJ_nid2ln(SSL
12be0 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70 68 _CIPHER_get_ciph
12bf0 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c er_nid(cipher)),
12c00 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 -1);..LAPPEND_S
12c10 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12c20 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c 20 r, "digestNID",
12c30 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 (char *)OBJ_nid2
12c40 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ln(SSL_CIPHER_ge
12c50 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69 70 t_digest_nid(cip
12c60 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 her)), -1);..LAP
12c70 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
12c80 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 objPtr, "keyExc
12c90 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 72 hangeNID", (char
12ca0 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 *)OBJ_nid2ln(SS
12cb0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f L_CIPHER_get_kx_
12cc0 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
12cd0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
12ce0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12cf0 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e "authenticationN
12d00 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a ID", (char *)OBJ
12d10 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 _nid2ln(SSL_CIPH
12d20 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 ER_get_auth_nid(
12d30 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a cipher)), -1);..
12d40 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74 68 ./* message auth
12d50 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 entication code
12d60 2d 20 43 69 70 68 65 72 20 69 73 20 41 45 41 44 - Cipher is AEAD
12d70 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 (e.g. GCM or Ch
12d80 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 aCha20/Poly1305)
12d90 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 or not */../* A
12da0 75 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e 63 uthenticated Enc
12db0 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73 73 ryption with ass
12dc0 6f 63 69 61 74 65 64 20 64 61 74 61 20 28 41 45 ociated data (AE
12dd0 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 AD) check */..LA
12de0 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
12df0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 p, objPtr, "ciph
12e00 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 4c er_is_aead", SSL
12e10 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64 28 _CIPHER_is_aead(
12e20 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 cipher));.../* D
12e30 69 67 65 73 74 20 75 73 65 64 20 64 75 72 69 6e igest used durin
12e40 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 g the SSL/TLS ha
12e50 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73 69 ndshake when usi
12e60 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e 20 2a ng the cipher. *
12e70 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 /..md = SSL_CIPH
12e80 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 ER_get_handshake
12e90 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 29 3b _digest(cipher);
12ea0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
12eb0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 terp, objPtr, "h
12ec0 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 22 andshake_digest"
12ed0 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 , (char *)EVP_MD
12ee0 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a _name(md), -1);.
12ef0 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c ../* Get OpenSSL
12f00 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f -specific ID, no
12f10 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 t IANA ID */..LA
12f20 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
12f30 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 , objPtr, "ciphe
12f40 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c r_id", (int) SSL
12f50 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63 _CIPHER_get_id(c
12f60 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 ipher));.../* Tw
12f70 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64 20 69 o-byte ID used i
12f80 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 n the TLS protoc
12f90 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 ol of the given
12fa0 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 cipher */..LAPPE
12fb0 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
12fc0 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c bjPtr, "protocol
12fd0 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f _id", (int) SSL_
12fe0 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f CIPHER_get_proto
12ff0 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29 3b col_id(cipher));
13000 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 .../* Textual de
13010 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 scription of the
13020 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 cipher */..if (
13030 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 SSL_CIPHER_descr
13040 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 iption(cipher, b
13050 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 uf, sizeof(buf))
13060 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
13070 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
13080 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 erp, objPtr, "de
13090 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c scription", buf,
130a0 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a -1);..}. }..
130b0 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 /* Session i
130c0 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 nfo */. sessi
130d0 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 on = SSL_get_ses
130e0 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 sion(ssl);. i
130f0 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 f (session != NU
13100 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 LL) {..const uns
13110 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b igned char *tick
13120 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 et;..size_t len2
13130 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 ;..unsigned int
13140 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 ulen;..const uns
13150 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 igned char *sess
13160 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a ion_id, *proto;.
13170 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 .unsigned char b
13180 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 uffer[SSL_MAX_MA
13190 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d STER_KEY_LENGTH]
131a0 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 ;.../* Report th
131b0 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
131c0 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
131d0 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f of the ALPN nego
131e0 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f tiation */..SSL_
131f0 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 SESSION_get0_alp
13200 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 69 n_selected(sessi
13210 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e on, &proto, &len
13220 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 2);..LAPPEND_STR
13230 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
13240 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a "alpn", (char *
13250 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 ) proto, (Tcl_Si
13260 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 ze) len2);.../*
13270 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 Report the selec
13280 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 ted protocol as
13290 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 a result of the
132a0 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 NPN negotiation
132b0 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 */.#ifdef USE_NP
132c0 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 N..SSL_get0_next
132d0 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 _proto_negotiate
132e0 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 d(ssl, &proto, &
132f0 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f ulen);..LAPPEND_
13300 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
13310 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 tr, "npn", (char
13320 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f *) proto, (Tcl_
13330 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e Size) ulen);.#en
13340 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 dif.../* Resumab
13350 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c le session */..L
13360 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
13370 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 rp, objPtr, "res
13380 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 umable", SSL_SES
13390 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c SION_is_resumabl
133a0 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f e(session));.../
133b0 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20 * Session start
133c0 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69 time (seconds si
133d0 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c nce epoch) */..L
133e0 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 APPEND_LONG(inte
133f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 rp, objPtr, "sta
13400 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 rt_time", SSL_SE
13410 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 SSION_get_time(s
13420 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 ession));.../* T
13430 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 imeout value - S
13440 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f SL_CTX_get_timeo
13450 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 ut (in seconds)
13460 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 */..LAPPEND_LONG
13470 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
13480 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f "timeout", SSL_
13490 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 SESSION_get_time
134a0 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a out(session));..
134b0 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2d ./* Session id -
134c0 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 6c TLSv1.2 and bel
134d0 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 ow only */..sess
134e0 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 ion_id = SSL_SES
134f0 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 SION_get_id(sess
13500 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 ion, &ulen);..LA
13510 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 PPEND_BARRAY(int
13520 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
13530 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 ssion_id", sessi
13540 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 on_id, (Tcl_Size
13550 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 ) ulen);.../* Se
13560 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f ssion context */
13570 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 ..session_id = S
13580 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
13590 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 69 id_context(sessi
135a0 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 on, &ulen);..LAP
135b0 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 PEND_BARRAY(inte
135c0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 rp, objPtr, "ses
135d0 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 sion_context", s
135e0 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f ession_id, (Tcl_
135f0 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f Size) ulen);.../
13600 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 * Session ticket
13610 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a - client only *
13620 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 /..SSL_SESSION_g
13630 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 et0_ticket(sessi
13640 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 on, &ticket, &le
13650 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 n2);..LAPPEND_BA
13660 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a RRAY(interp, obj
13670 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 Ptr, "session_ti
13680 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 cket", ticket, (
13690 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b Tcl_Size) len2);
136a0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 .../* Session ti
136b0 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69 cket lifetime hi
136c0 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 nt (in seconds)
136d0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 */..LAPPEND_LONG
136e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
136f0 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 4c "lifetime", SSL
13700 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 _SESSION_get_tic
13710 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e ket_lifetime_hin
13720 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f t(session));.../
13730 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74 * Ticket app dat
13740 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c a */.#if OPENSSL
13750 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
13760 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 53 < 0x30000000L..S
13770 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
13780 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 28 ticket_appdata((
13790 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73 SSL_SESSION *) s
137a0 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c ession, &ticket,
137b0 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e &len2);..LAPPEN
137c0 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c D_BARRAY(interp,
137d0 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 objPtr, "ticket
137e0 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b _app_data", tick
137f0 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c et, (Tcl_Size) l
13800 65 6e 32 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f en2);.#endif.../
13810 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79 * Get master key
13820 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f */..len2 = SSL_
13830 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 SESSION_get_mast
13840 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 er_key(session,
13850 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f buffer, SSL_MAX_
13860 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 MASTER_KEY_LENGT
13870 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 H);..LAPPEND_BAR
13880 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 RAY(interp, objP
13890 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 tr, "master_key"
138a0 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c 5f 53 , buffer, (Tcl_S
138b0 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a ize) len2);.../*
138c0 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 Compression id
138d0 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 */..unsigned int
138e0 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f id = SSL_SESSIO
138f0 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 N_get_compress_i
13900 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 d(session);..LAP
13910 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
13920 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 objPtr, "compre
13930 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d ssion_id", id ==
13940 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 1 ? "zlib" : "n
13950 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d one", -1);. }
13960 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 .. /* Compres
13970 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 sion info */.
13980 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c if (ssl != NULL
13990 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f ) {.#ifdef HAVE_
139a0 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a SSL_COMPRESSION.
139b0 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 .const COMP_METH
139c0 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b OD *comp, *expn;
139d0 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 ..comp = SSL_get
139e0 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 _current_compres
139f0 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e sion(ssl);..expn
13a00 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 = SSL_get_curre
13a10 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c nt_expansion(ssl
13a20 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 );...LAPPEND_STR
13a30 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
13a40 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 "compression",
13a50 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f comp ? SSL_COMP_
13a60 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a get_name(comp) :
13a70 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c "none", -1);..L
13a80 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
13a90 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 p, objPtr, "expa
13aa0 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 nsion", expn ? S
13ab0 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 SL_COMP_get_name
13ac0 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c (expn) : "none",
13ad0 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 -1);.#else..LAP
13ae0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
13af0 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 objPtr, "compre
13b00 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 ssion", "none",
13b10 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 -1);..LAPPEND_ST
13b20 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
13b30 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 , "expansion", "
13b40 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 none", -1);.#end
13b50 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a if. }.. /*
13b60 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a Server info */.
13b70 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 {..long mode
13b80 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 = SSL_CTX_get_s
13b90 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 ession_cache_mod
13ba0 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 e(statePtr->ctx)
13bb0 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 ;..char *msg;...
13bc0 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 if (mode & SSL_S
13bd0 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b ESS_CACHE_OFF) {
13be0 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 .. msg = "off
13bf0 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d ";..} else if (m
13c00 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 ode & SSL_SESS_C
13c10 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 ACHE_CLIENT) {..
13c20 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e msg = "clien
13c30 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 t";..} else if (
13c40 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
13c50 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a CACHE_SERVER) {.
13c60 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 76 . msg = "serv
13c70 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 er";..} else if
13c80 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 (mode & SSL_SESS
13c90 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 _CACHE_BOTH) {..
13ca0 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 msg = "both"
13cb0 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
13cc0 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 msg = "unknown"
13cd0 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 ;..}..LAPPEND_ST
13ce0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
13cf0 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 , "session_cache
13d00 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 _mode", msg, -1)
13d10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
13d20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f CA List */. /
13d30 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 65 * IF not a serve
13d40 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 r, same as SSL_g
13d50 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 et0_peer_CA_list
13d60 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 6d 65 . If server same
13d70 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f as SSL_CTX_get_
13d80 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a client_CA_list *
13d90 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d 20 /. listPtr =
13da0 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
13db0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 , NULL);. STA
13dc0 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 CK_OF(X509_NAME)
13dd0 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 *ca_list;. i
13de0 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 f ((ca_list = SS
13df0 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f L_get_client_CA_
13e00 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 list(ssl)) != NU
13e10 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 66 LL) {..char buff
13e20 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 er[BUFSIZ];..for
13e30 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c (int i = 0; i <
13e40 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 sk_X509_NAME_nu
13e50 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 m(ca_list); i++)
13e60 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d {.. X509_NAM
13e70 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 E *name = sk_X50
13e80 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 9_NAME_value(ca_
13e90 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 list, i);.. i
13ea0 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 f (name) {...X50
13eb0 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 9_NAME_oneline(n
13ec0 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46 ame, buffer, BUF
13ed0 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 SIZ);...Tcl_List
13ee0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
13ef0 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 (interp, listPtr
13f00 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
13f10 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b bj(buffer, -1));
13f20 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d .. }..}. }
13f30 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a . LAPPEND_OBJ
13f40 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
13f50 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 "caList", listP
13f60 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 tr);. LAPPEND
13f70 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
13f80 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e Ptr, "caListCoun
13f90 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 t", sk_X509_NAME
13fa0 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a _num(ca_list));.
13fb0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
13fc0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
13fd0 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
13fe0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
13ff0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
14000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14030 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 ------. *. * Ver
14040 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 sionObjCmd -- re
14050 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 turn version str
14060 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c ing from OpenSSL
14070 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
14080 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
14090 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
140a0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
140b0 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
140c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
140d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
140e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
140f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14100 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
14110 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c VersionObjCmd(Cl
14120 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
14130 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
14140 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
14150 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
14160 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
14170 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
14180 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 . (void) clie
14190 6e 74 44 61 74 61 3b 0a 20 20 20 20 28 76 6f 69 ntData;. (voi
141a0 64 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28 76 6f d) objc;. (vo
141b0 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20 20 64 id) objv;.. d
141c0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
141d0 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 ;.. objPtr =
141e0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
141f0 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e (OPENSSL_VERSION
14200 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 _TEXT, -1);.
14210 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
14220 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
14230 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
14240 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
14250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a --. *. * MiscObj
142a0 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d Cmd -- misc comm
142b0 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ands. *. * Resul
142c0 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
142d0 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
142e0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
142f0 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
14300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14340 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
14350 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c nt.MiscObjCmd(Cl
14360 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
14370 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
14380 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
14390 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
143a0 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
143b0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
143c0 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d r *commands [] =
143d0 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 { "req", "strre
143e0 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 q", NULL };.
143f0 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 enum command { C
14400 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 _REQ, C_STRREQ,
14410 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 C_DUMMY };. T
14420 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 cl_Size cmd;.
14430 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 20 int isStr;.
14440 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 char buffer[1638
14450 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 4];. (void) c
14460 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 lientData;..
14470 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
14480 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
14490 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f < 2) {..Tcl_Wro
144a0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
144b0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 , 1, objv, "subc
144c0 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b ommand ?args?");
144d0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
144e0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
144f0 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 (Tcl_GetIndexFr
14500 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
14510 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c jv[1], commands,
14520 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 "command", 0, &
14530 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 cmd) != TCL_OK)
14540 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
14550 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
14560 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
14570 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20 );.. isStr =
14580 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 (cmd == C_STRREQ
14590 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 );. switch ((
145a0 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d enum command) cm
145b0 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 d) {..case C_REQ
145c0 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51 :..case C_STRREQ
145d0 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 : {.. EVP_PKE
145e0 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 Y *pkey=NULL;..
145f0 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 X509 *cert=NU
14600 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 LL;.. X509_NA
14610 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 ME *name=NULL;..
14620 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 Tcl_Obj **li
14630 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 stv;.. Tcl_Si
14640 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 20 20 69 ze listc;.. i
14650 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 nt i;... BIO
14660 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 *out=NULL;...
14670 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b char *k_C="",*k
14680 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a _ST="",*k_L="",*
14690 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c k_O="",*k_OU="",
146a0 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 *k_CN="",*k_Emai
146b0 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 l="";.. char
146c0 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c *keyout,*pemout,
146d0 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b *str;.. int k
146e0 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c eysize,serial=0,
146f0 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f days=365;..#if O
14700 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
14710 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
14720 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 00L.. BIGNUM
14730 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 *bne = NULL;..
14740 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c RSA *rsa = NUL
14750 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56 L;.#else.. EV
14760 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 P_PKEY_CTX *ctx
14770 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a = NULL;.#endif..
14780 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 . if ((objc<5
14790 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b ) || (objc>6)) {
147a0 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 ...Tcl_WrongNumA
147b0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f rgs(interp, 2, o
147c0 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 bjv, "keysize ke
147d0 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f yfile certfile ?
147e0 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 info?");...retur
147f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
14800 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 }... if (Tc
14810 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 l_GetIntFromObj(
14820 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c interp, objv[2],
14830 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 &keysize) != TC
14840 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e L_OK) {...return
14850 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 TCL_ERROR;..
14860 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 }.. keyout=T
14870 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
14880 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f v[3]);.. pemo
14890 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 ut=Tcl_GetString
148a0 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 (objv[4]);..
148b0 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54 if (isStr) {...T
148c0 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
148d0 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 ,keyout,"",0);..
148e0 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 .Tcl_SetVar(inte
148f0 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b rp,pemout,"",0);
14900 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 .. }... if
14910 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 (objc>=6) {...i
14920 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 f (Tcl_ListObjGe
14930 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 tElements(interp
14940 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 , objv[5], &list
14950 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 43 c, &listv) != TC
14960 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 L_OK) {... re
14970 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
14980 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 ..}....if ((list
14990 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 c%2) != 0) {...
149a0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
149b0 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 (interp,"Informa
149c0 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 tion list must h
149d0 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 ave even number
149e0 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 of arguments",NU
149f0 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 LL);... retur
14a00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
14a10 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c ...for (i=0; i<l
14a20 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 istc; i+=2) {...
14a30 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 str=Tcl_GetS
14a40 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b tring(listv[i]);
14a50 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63 6d ... if (strcm
14a60 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 p(str,"days")==0
14a70 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 ) {....if (Tcl_G
14a80 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 etIntFromObj(int
14a90 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 erp,listv[i+1],&
14aa0 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 days)!=TCL_OK)..
14ab0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
14ac0 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 _ERROR;... }
14ad0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
14ae0 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 str,"serial")==0
14af0 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 ) {....if (Tcl_G
14b00 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 etIntFromObj(int
14b10 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 erp,listv[i+1],&
14b20 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 serial)!=TCL_OK)
14b30 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 .... return T
14b40 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 CL_ERROR;...
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 43 22 29 3d 3d 30 29 20 7b p(str,"C")==0) {
14b70 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 ....k_C=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 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f ST")==0) {....k_
14bc0 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 ST=Tcl_GetString
14bd0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
14be0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
14bf0 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d trcmp(str,"L")==
14c00 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 0) {....k_L=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 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 tr,"O")==0) {...
14c50 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 .k_O=Tcl_GetStri
14c60 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
14c70 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
14c80 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 (strcmp(str,"OU"
14c90 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d )==0) {....k_OU=
14ca0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
14cb0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
14cc0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
14cd0 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 mp(str,"CN")==0)
14ce0 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 {....k_CN=Tcl_G
14cf0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
14d00 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
14d10 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
14d20 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b r,"Email")==0) {
14d30 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f ....k_Email=Tcl_
14d40 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
14d50 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
14d60 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 lse {....Tcl_Set
14d70 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 Result(interp,"U
14d80 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 nknown parameter
14d90 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 ",NULL);....retu
14da0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
14db0 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d }...}.. }
14dc0 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
14dd0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
14de0 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 x30000000L..
14df0 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a bne = BN_new();.
14e00 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e . rsa = RSA_n
14e10 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 ew();.. pkey
14e20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 = EVP_PKEY_new()
14e30 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d ;.. if (bne =
14e40 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d = NULL || rsa ==
14e50 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d NULL || pkey ==
14e60 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 NULL || !BN_set
14e70 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 _word(bne,RSA_F4
14e80 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 ) ||...!RSA_gene
14e90 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c rate_key_ex(rsa,
14ea0 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e keysize, bne, N
14eb0 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 ULL) || !EVP_PKE
14ec0 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 Y_assign_RSA(pke
14ed0 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50 y, rsa)) {...EVP
14ee0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
14ef0 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 ;.../* RSA_free(
14f00 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 45 rsa); freed by E
14f10 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a VP_PKEY_free */.
14f20 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a ..BN_free(bne);.
14f30 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20 #else.. pkey
14f40 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 = EVP_RSA_gen((u
14f50 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 nsigned int) key
14f60 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20 size);.. ctx
14f70 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e = EVP_PKEY_CTX_n
14f80 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 ew(pkey,NULL);..
14f90 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 if (pkey ==
14fa0 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e NULL || ctx == N
14fb0 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 ULL || !EVP_PKEY
14fc0 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 _keygen_init(ctx
14fd0 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 ) ||...!EVP_PKEY
14fe0 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 _CTX_set_rsa_key
14ff0 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 gen_bits(ctx, ke
15000 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 ysize) || !EVP_P
15010 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 KEY_keygen(ctx,
15020 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f &pkey)) {...EVP_
15030 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
15040 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f ...EVP_PKEY_CTX_
15050 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 free(ctx);.#endi
15060 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c f...Tcl_SetResul
15070 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
15080 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 generating priva
15090 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 te key",NULL);..
150a0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
150b0 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b R;.. } else {
150c0 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a ...if (isStr) {.
150d0 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 .. out=BIO_ne
150e0 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a w(BIO_s_mem());.
150f0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
15100 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f bio_PrivateKey(o
15110 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c ut,pkey,NULL,NUL
15120 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a L,0,NULL,NULL);.
15130 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 .. i=BIO_read
15140 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 (out,buffer,size
15150 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 of(buffer)-1);..
15160 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 . i=(i<0) ? 0
15170 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 : i;... buff
15180 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 er[i]='\0';...
15190 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 Tcl_SetVar(int
151a0 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 erp,keyout,buffe
151b0 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f r,0);... BIO_
151c0 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 flush(out);...
151d0 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b BIO_free(out);
151e0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 ...} else {...
151f0 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
15200 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 O_s_file());...
15210 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c BIO_write_fil
15220 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 ename(out,keyout
15230 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 );... PEM_wri
15240 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 te_bio_PrivateKe
15250 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c y(out,pkey,NULL,
15260 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c NULL,0,NULL,NULL
15270 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f );... /* PEM_
15280 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 write_bio_RSAPri
15290 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 vateKey(out, rsa
152a0 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c , NULL, NULL, 0,
152b0 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f NULL, NULL); */
152c0 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f ... BIO_free_
152d0 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a all(out);.. .}..
152e0 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 39 ..if ((cert=X509
152f0 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b _new())==NULL) {
15300 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 ... Tcl_SetRe
15310 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 sult(interp,"Err
15320 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65 or generating ce
15330 72 74 69 66 69 63 61 74 65 20 72 65 71 75 65 73 rtificate reques
15340 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 t",NULL);...
15350 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
15360 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c ey);.#if OPENSSL
15370 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
15380 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 < 0x30000000L...
15390 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 BN_free(bne)
153a0 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72 ;.#endif... r
153b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
153c0 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 ...}....X509_set
153d0 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 _version(cert,2)
153e0 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 ;...ASN1_INTEGER
153f0 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 _set(X509_get_se
15400 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 rialNumber(cert)
15410 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 ,serial);...X509
15420 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 _gmtime_adj(X509
15430 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 _getm_notBefore(
15440 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 cert),0);...X509
15450 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 _gmtime_adj(X509
15460 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 _getm_notAfter(c
15470 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 ert),(long)60*60
15480 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 *24*days);...X50
15490 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 9_set_pubkey(cer
154a0 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 t,pkey);....name
154b0 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 =X509_get_subjec
154c0 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 t_name(cert);...
154d0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
154e0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
154f0 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 ,"C", MBSTRING_A
15500 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
15510 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c ned char *) k_C,
15520 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
15530 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
15540 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
15550 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 ST", MBSTRING_AS
15560 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
15570 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c ed char *) k_ST,
15580 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
15590 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
155a0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
155b0 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 L", MBSTRING_ASC
155c0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
155d0 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d d char *) k_L, -
155e0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
155f0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
15600 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 _by_txt(name,"O"
15610 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
15620 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
15630 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c char *) k_O, -1,
15640 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
15650 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
15660 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c y_txt(name,"OU",
15670 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
15680 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
15690 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c har *) k_OU, -1,
156a0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
156b0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
156c0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c y_txt(name,"CN",
156d0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
156e0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
156f0 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c har *) k_CN, -1,
15700 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
15710 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
15720 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 y_txt(name,"Emai
15730 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 l", MBSTRING_ASC
15740 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
15750 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 d char *) k_Emai
15760 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a l, -1, -1, 0);..
15770 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 ..X509_set_subje
15780 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d ct_name(cert,nam
15790 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 e);....if (!X509
157a0 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c _sign(cert,pkey,
157b0 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b EVP_sha256())) {
157c0 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 ... X509_free
157d0 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 (cert);... EV
157e0 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 P_PKEY_free(pkey
157f0 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 );.#if OPENSSL_V
15800 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
15810 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 0x30000000L...
15820 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a BN_free(bne);.
15830 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c #endif... Tcl
15840 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
15850 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 p,"Error signing
15860 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 certificate",NU
15870 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 LL);... retur
15880 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
15890 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b ....if (isStr) {
158a0 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e ... out=BIO_n
158b0 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b ew(BIO_s_mem());
158c0 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 ... PEM_write
158d0 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 _bio_X509(out,ce
158e0 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f rt);... i=BIO
158f0 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 _read(out,buffer
15900 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d ,sizeof(buffer)-
15910 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 1);... i=(i<0
15920 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 ) ? 0 : i;...
15930 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b buffer[i]='\0';
15940 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 ... Tcl_SetVa
15950 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c r(interp,pemout,
15960 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 buffer,0);...
15970 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b BIO_flush(out);
15980 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 ... BIO_free(
15990 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b out);...} else {
159a0 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e ... out=BIO_n
159b0 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 ew(BIO_s_file())
159c0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 ;... BIO_writ
159d0 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 e_filename(out,p
159e0 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 emout);... PE
159f0 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 M_write_bio_X509
15a00 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 (out,cert);...
15a10 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f BIO_free_all(o
15a20 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 ut);...}....X509
15a30 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 _free(cert);...E
15a40 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 VP_PKEY_free(pke
15a50 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f y);.#if OPENSSL_
15a60 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
15a70 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 0x30000000L...B
15a80 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e N_free(bne);.#en
15a90 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 dif.. }..}..b
15aa0 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c reak;. defaul
15ab0 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d t:..break;. }
15ac0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
15ad0 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a OK;.}.../*******
15ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f *************/./
15af0 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 20 * Init
15b00 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a */./*********
15b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a ***********/../*
15b20 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
15b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b60 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
15b70 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 _Free --. *. *.T
15b80 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c his procedure cl
15b90 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 eans up when a S
15ba0 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 SL socket based
15bb0 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c channel. *.is cl
15bc0 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 osed and its ref
15bd0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c erence count fal
15be0 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a ls below 1. *. *
15bf0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e Results:. *.non
15c00 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
15c10 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 ects:. *.Frees a
15c20 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a ll the state. *.
15c30 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
15c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c70 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 -----. */.void.T
15c80 6c 73 5f 46 72 65 65 28 74 6c 73 5f 66 72 65 65 ls_Free(tls_free
15c90 5f 74 79 70 65 20 2a 62 6c 6f 63 6b 50 74 72 29 _type *blockPtr)
15ca0 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
15cb0 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
15cc0 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 *)blockPtr;..
15cd0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
15ce0 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 ");.. Tls_Cle
15cf0 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 an(statePtr);.
15d00 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 ckfree(blockPt
15d10 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d r);.}.../*. *---
15d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d60 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e . *. * Tls_Clean
15d70 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 --. *. *.This p
15d80 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 rocedure cleans
15d90 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f up when a SSL so
15da0 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e cket based chann
15db0 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 el. *.is closed
15dc0 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 and its referenc
15dd0 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 e count falls be
15de0 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f low 1. This sho
15df0 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 uld. *.be called
15e00 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 synchronously b
15e10 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c y the CloseProc,
15e20 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 not in the. *.E
15e30 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 ventuallyFree ca
15e40 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 llback.. *. * Re
15e50 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 sults:. *.none.
15e60 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
15e70 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 s:. *.Frees all
15e80 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d the state. *. *-
15e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ed0 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f --. */.void Tls_
15ee0 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 Clean(State *sta
15ef0 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 tePtr) {. dpr
15f00 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
15f10 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
15f20 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 65 r->ssl) {../* Se
15f30 6e 64 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 nd close_notify
15f40 6d 65 73 73 61 67 65 20 2a 2f 0a 09 64 70 72 69 message */..dpri
15f50 6e 74 66 28 22 53 53 4c 5f 73 68 75 74 64 6f 77 ntf("SSL_shutdow
15f60 6e 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 n(%p)", statePtr
15f70 2d 3e 73 73 6c 29 3b 0a 09 2f 2a 20 57 69 6c 6c ->ssl);../* Will
15f80 20 72 65 74 75 72 6e 20 72 65 74 75 72 6e 20 30 return return 0
15f90 20 77 68 69 6c 65 20 73 68 75 74 64 6f 77 6e 20 while shutdown
15fa0 69 6e 20 70 72 6f 63 65 73 73 2c 20 74 68 65 6e in process, then
15fb0 20 31 20 77 68 65 6e 20 63 6f 6d 70 6c 65 74 65 1 when complete
15fc0 20 2a 2f 0a 09 2f 2a 20 63 6c 6f 73 65 73 20 74 */../* closes t
15fd0 68 65 20 77 72 69 74 65 20 64 69 72 65 63 74 69 he write directi
15fe0 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 on of the connec
15ff0 74 69 6f 6e 3b 20 74 68 65 20 72 65 61 64 20 64 tion; the read d
16000 69 72 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 irection is clos
16010 65 64 20 62 79 20 74 68 65 20 70 65 65 72 2e 20 ed by the peer.
16020 2a 2f 0a 09 2f 2a 20 44 6f 65 73 20 6e 6f 74 20 */../* Does not
16030 61 66 66 65 63 74 20 73 6f 63 6b 65 74 20 2a 2f affect socket */
16040 0a 09 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28 73 ..SSL_shutdown(s
16050 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
16060 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
16070 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 * we're assumi
16080 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 ng here that we'
16090 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 re single-thread
160a0 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 ed. */. i
160b0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d f (statePtr->tim
160c0 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 er != (Tcl_Timer
160d0 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 Token) NULL) {..
160e0 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 Tcl_DeleteTimerH
160f0 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d andler(statePtr-
16100 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 >timer);..stateP
16110 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c tr->timer = NULL
16120 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
16130 52 65 6d 6f 76 65 20 63 61 6c 6c 62 61 63 6b 73 Remove callbacks
16140 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
16150 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 ePtr->callback)
16160 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f {..Tcl_DecrRefCo
16170 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 unt(statePtr->ca
16180 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 llback);..stateP
16190 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e tr->callback = N
161a0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
161b0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 f (statePtr->pas
161c0 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 sword) {..Tcl_De
161d0 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
161e0 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a Ptr->password);.
161f0 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 .statePtr->passw
16200 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ord = NULL;.
16210 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
16220 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c tr->vcmd) {..Tcl
16230 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _DecrRefCount(st
16240 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 atePtr->vcmd);..
16250 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
16260 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
16270 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
16280 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 protos) {..ckfre
16290 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 e(statePtr->prot
162a0 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e os);..statePtr->
162b0 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 protos = NULL;.
162c0 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
162d0 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 atePtr->bio) {..
162e0 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c /* This will cal
162f0 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 l SSL_shutdown.
16300 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 Bug 1414045 */..
16310 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 dprintf("BIO_fre
16320 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 e_all(%p)", stat
16330 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f ePtr->bio);..BIO
16340 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 _free_all(stateP
16350 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 tr->bio);..state
16360 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b Ptr->bio = NULL;
16370 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
16380 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b statePtr->ssl) {
16390 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 ..dprintf("SSL_f
163a0 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 ree(%p)", stateP
163b0 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 tr->ssl);..SSL_f
163c0 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ree(statePtr->ss
163d0 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 l);..statePtr->s
163e0 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d sl = NULL;. }
163f0 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
16400 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f tr->ctx) {..SSL_
16410 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 CTX_free(statePt
16420 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 r->ctx);..stateP
16430 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a tr->ctx = NULL;.
16440 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
16450 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b tf("Returning");
16460 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
16470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
164a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
164b0 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20 49 6e 66 . *. * Build Inf
164c0 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a o Command --. *.
164d0 20 2a 09 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e *.Create comman
164e0 64 20 74 6f 20 72 65 74 75 72 6e 20 62 75 69 6c d to return buil
164f0 64 20 69 6e 66 6f 20 66 6f 72 20 70 61 63 6b 61 d info for packa
16500 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ge.. *. * Result
16510 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
16520 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 Tcl result. *.
16530 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
16540 20 2a 09 43 72 65 61 74 65 64 20 62 75 69 6c 64 *.Created build
16550 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a 20 -info command..
16560 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
16570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
165a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
165b0 23 69 66 6e 64 65 66 20 53 54 52 49 4e 47 49 46 #ifndef STRINGIF
165c0 59 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 49 Y.# define STRI
165d0 4e 47 49 46 59 28 78 29 20 53 54 52 49 4e 47 49 NGIFY(x) STRINGI
165e0 46 59 31 28 78 29 0a 23 20 20 64 65 66 69 6e 65 FY1(x).# define
165f0 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 20 23 STRINGIFY1(x) #
16600 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 0a 42 75 x.#endif..int.Bu
16610 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 54 ildInfoCommand(T
16620 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65 72 cl_Interp* inter
16630 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64 p) {. Tcl_Cmd
16640 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 Info info;..
16650 69 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 if (Tcl_GetComma
16660 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 22 ndInfo(interp, "
16670 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66 ::tcl::build-inf
16680 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a 09 54 o", &info)) {..T
16690 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
166a0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
166b0 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c ls::build-info",
166c0 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28 info.objProc, (
166d0 76 6f 69 64 20 2a 29 28 0a 09 09 50 41 43 4b 41 void *)(...PACKA
166e0 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20 53 GE_VERSION "+" S
166f0 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 45 52 TRINGIFY(TLS_VER
16700 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66 20 64 SION_UUID).#if d
16710 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f efined(__clang__
16720 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 63 ) && defined(__c
16730 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09 lang_major__)...
16740 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20 53 . ".clang-" S
16750 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 TRINGIFY(__clang
16760 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f _major__).#if __
16770 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20 clang_minor__ <
16780 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65 10.... "0".#e
16790 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 49 ndif.... STRI
167a0 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69 NGIFY(__clang_mi
167b0 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 nor__).#endif.#i
167c0 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 f defined(__cplu
167d0 73 70 6c 75 73 29 20 26 26 20 21 64 65 66 69 6e splus) && !defin
167e0 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09 ed(__OBJC__)....
167f0 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 73 22 ".cplusplus"
16800 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 .#endif.#ifndef
16810 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e NDEBUG.... ".
16820 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 debug".#endif.#i
16830 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 f !defined(__cla
16840 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 ng__) && !define
16850 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c d(__INTEL_COMPIL
16860 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f ER) && defined(_
16870 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20 20 _GNUC__)....
16880 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 49 46 ".gcc-" STRINGIF
16890 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 20 Y(__GNUC__).#if
168a0 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c __GNUC_MINOR__ <
168b0 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 10.... "0".#
168c0 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 endif.... STR
168d0 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d 49 INGIFY(__GNUC_MI
168e0 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 NOR__).#endif.#i
168f0 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d fdef __INTEL_COM
16900 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22 2e 69 PILER.... ".i
16910 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f cc-" STRINGIFY(_
16920 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 _INTEL_COMPILER)
16930 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 .#endif.#ifdef T
16940 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09 09 CL_MEM_DEBUG....
16950 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 22 0a ".memdebug".
16960 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
16970 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09 09 ed(_MSC_VER)....
16980 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 54 52 ".msvc-" STR
16990 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 52 29 INGIFY(_MSC_VER)
169a0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 55 .#endif.#ifdef U
169b0 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20 20 SE_NMAKE....
169c0 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66 0a ".nmake".#endif.
169d0 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 47 5f #ifndef TCL_CFG_
169e0 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 20 20 OPTIMIZED....
169f0 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a ".no-optimize".
16a00 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f #endif.#ifdef __
16a10 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22 2e OBJC__.... ".
16a20 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 69 66 objective-c".#if
16a30 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 defined(__cplus
16a40 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22 70 6c plus).... "pl
16a50 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 usplus".#endif.#
16a60 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c endif.#ifdef TCL
16a70 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09 09 _CFG_PROFILED...
16a80 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 22 0a . ".profile".
16a90 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 50 55 #endif.#ifdef PU
16aa0 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e 70 75 RIFY.... ".pu
16ab0 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 69 66 rify".#endif.#if
16ac0 64 65 66 20 53 54 41 54 49 43 5f 42 55 49 4c 44 def STATIC_BUILD
16ad0 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74 69 63 .... ".static
16ae0 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e 55 ".#endif...), NU
16af0 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 LL);. }. r
16b00 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
16b10 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
16b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
16b50 2a 0a 20 2a 20 54 6c 73 4c 69 62 53 68 75 74 64 *. * TlsLibShutd
16b60 6f 77 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 53 68 75 own --. *. *.Shu
16b70 74 64 6f 77 6e 20 53 53 4c 20 6c 69 62 72 61 72 tdown SSL librar
16b80 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 y once per appli
16b90 63 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73 cation. *. * Res
16ba0 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
16bb0 61 72 64 20 54 43 4c 20 72 65 73 75 6c 74 0a 20 ard TCL result.
16bc0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
16bd0 73 3a 0a 20 2a 09 53 68 75 74 64 6f 77 6e 20 53 s:. *.Shutdown S
16be0 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a SL library. *. *
16bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16c20 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 76 6f 69 64 ------*. */.void
16c30 20 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e 28 TlsLibShutdown(
16c40 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
16c50 74 44 61 74 61 29 20 7b 0a 20 20 20 20 64 70 72 tData) {. dpr
16c60 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
16c70 0a 20 20 20 20 42 49 4f 5f 63 6c 65 61 6e 75 70 . BIO_cleanup
16c80 28 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ();.}../*. *----
16c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16cc0 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 --*. *. *.TlsLib
16cd0 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e Init --. *. *.In
16ce0 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 itializes SSL li
16cf0 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 brary once per a
16d00 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 0a 20 2a pplication. *. *
16d10 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
16d20 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
16d30 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 lt. *. * Side ef
16d40 66 65 63 74 73 3a 0a 20 2a 09 49 6e 69 74 69 61 fects:. *.Initia
16d50 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 lizes SSL librar
16d60 79 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d y. *. *---------
16d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
16da0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c */.static int Tl
16db0 73 4c 69 62 49 6e 69 74 28 29 20 7b 0a 20 20 20 sLibInit() {.
16dc0 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 static int init
16dd0 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 20 20 ialized = 0;..
16de0 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
16df0 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 69 d");.. if (!i
16e00 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 2f nitialized) {../
16e10 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 * Initialize BOT
16e20 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 H libcrypto and
16e30 6c 69 62 73 73 6c 2e 20 2a 2f 0a 09 69 66 20 28 libssl. */..if (
16e40 21 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 !OPENSSL_init_ss
16e50 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c l(OPENSSL_INIT_L
16e60 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 OAD_SSL_STRINGS
16e70 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c | OPENSSL_INIT_L
16e80 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e OAD_CRYPTO_STRIN
16e90 47 53 0a 09 20 20 20 20 7c 20 4f 50 45 4e 53 53 GS.. | OPENSS
16ea0 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 L_INIT_ADD_ALL_C
16eb0 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c IPHERS | OPENSSL
16ec0 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 _INIT_ADD_ALL_DI
16ed0 47 45 53 54 53 0a 09 20 20 20 20 7c 20 4f 50 45 GESTS.. | OPE
16ee0 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 NSSL_INIT_LOAD_C
16ef0 4f 4e 46 49 47 20 7c 20 4f 50 45 4e 53 53 4c 5f ONFIG | OPENSSL_
16f00 49 4e 49 54 5f 41 53 59 4e 43 2c 20 4e 55 4c 4c INIT_ASYNC, NULL
16f10 29 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e )) {.. return
16f20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a TCL_ERROR;..}..
16f30 09 2f 2a 20 43 72 65 61 74 65 20 42 49 4f 20 68 ./* Create BIO h
16f40 61 6e 64 6c 65 72 73 20 2a 2f 0a 09 42 49 4f 5f andlers */..BIO_
16f50 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 new_tcl(NULL, 0)
16f60 3b 0a 09 0a 09 2f 2a 20 43 72 65 61 74 65 20 65 ;..../* Create e
16f70 78 69 74 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 09 xit handler */..
16f80 54 63 6c 5f 43 72 65 61 74 65 45 78 69 74 48 61 Tcl_CreateExitHa
16f90 6e 64 6c 65 72 28 54 6c 73 4c 69 62 53 68 75 74 ndler(TlsLibShut
16fa0 64 6f 77 6e 2c 20 4e 55 4c 4c 29 3b 0a 09 69 6e down, NULL);..in
16fb0 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 20 itialized = 1;.
16fc0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
16fd0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 20 49 TCL_OK;.}.../* I
16fe0 6e 69 74 20 73 63 72 69 70 74 20 2a 2f 0a 73 74 nit script */.st
16ff0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
17000 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 tlsTclInitScript
17010 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 [] = {.#include
17020 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 7d 3b 0a 0a "tls.tcl.h".};..
17030 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
17040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17070 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
17080 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a ls_Init --. *. *
17090 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 .This is a packa
170a0 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f ge initializatio
170b0 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 n procedure, whi
170c0 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 ch is called. *.
170d0 62 79 20 54 43 4c 20 77 68 65 6e 20 74 68 69 73 by TCL when this
170e0 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 package is to b
170f0 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e e added to an in
17100 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a terpreter.. *. *
17110 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 49 6e 69 Results:. *.Ini
17120 74 69 61 6c 69 7a 65 73 20 73 74 72 75 63 74 75 tializes structu
17130 72 65 73 20 61 6e 64 20 63 72 65 61 74 65 73 20 res and creates
17140 63 6f 6d 6d 61 6e 64 73 2e 0a 20 2a 0a 20 2a 20 commands.. *. *
17150 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
17160 09 20 43 72 65 61 74 65 20 74 68 65 20 63 6f 6d . Create the com
17170 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d mands. *. *-----
17180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
171a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
171b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
171c0 2a 2f 0a 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f */..#if TCL_MAJO
171d0 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 64 R_VERSION > 8.#d
171e0 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f efine MIN_VERSIO
171f0 4e 20 22 39 2e 30 22 0a 23 65 6c 73 65 0a 23 64 N "9.0".#else.#d
17200 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f efine MIN_VERSIO
17210 4e 20 22 38 2e 35 22 0a 23 65 6e 64 69 66 0a 0a N "8.5".#endif..
17220 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c DLLEXPORT int Tl
17230 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 s_Init(Tcl_Inter
17240 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 0a 20 20 p *interp) {..
17250 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
17260 64 22 29 3b 0a 0a 23 69 66 64 65 66 20 55 53 45 d");..#ifdef USE
17270 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 _TCL_STUBS. i
17280 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 f (Tcl_InitStubs
17290 28 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56 45 52 (interp, MIN_VER
172a0 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c SION, 0) == NULL
172b0 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
172c0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e ERROR;. }.#en
172d0 64 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f dif. if (Tcl_
172e0 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 PkgRequire(inter
172f0 70 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 p, "Tcl", MIN_VE
17300 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c RSION, 0) == NUL
17310 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
17320 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
17330 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 if (TlsLibIni
17340 74 28 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b t() != TCL_OK) {
17350 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
17360 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c lt(interp, "coul
17370 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 d not initialize
17380 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 SSL library", (
17390 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
173a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
173b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c ;. }.. Tcl
173c0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
173d0 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 d(interp, "::tls
173e0 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 ::ciphers", Ciph
173f0 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 ersObjCmd, (Clie
17400 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
17410 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
17420 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
17430 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
17440 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
17450 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c ls::connection",
17460 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f ConnectionInfoO
17470 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
17480 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 ta) NULL, (Tcl_C
17490 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
174a0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
174b0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
174c0 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a interp, "::tls::
174d0 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 handshake", Hand
174e0 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c shakeObjCmd, (Cl
174f0 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
17500 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
17510 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
17520 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
17530 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
17540 3a 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 :tls::import", I
17550 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c mportObjCmd, (Cl
17560 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
17570 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
17580 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
17590 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
175a0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
175b0 3a 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c :tls::unimport",
175c0 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c UnimportObjCmd,
175d0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
175e0 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
175f0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
17600 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
17610 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
17620 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 73 74 61 63 , "::tls::unstac
17630 6b 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 k", UnimportObjC
17640 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
17650 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 NULL, (Tcl_CmdD
17660 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
17670 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
17680 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
17690 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74 61 erp, "::tls::sta
176a0 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 tus", StatusObjC
176b0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
176c0 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 NULL, (Tcl_CmdD
176d0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
176e0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
176f0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
17700 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 76 65 72 erp, "::tls::ver
17710 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 sion", VersionOb
17720 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
17730 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d a) NULL, (Tcl_Cm
17740 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
17750 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
17760 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
17770 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 6d nterp, "::tls::m
17780 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 isc", MiscObjCmd
17790 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e , (ClientData) N
177a0 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ULL, (Tcl_CmdDel
177b0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
177c0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
177d0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
177e0 70 2c 20 22 3a 3a 74 6c 73 3a 3a 70 72 6f 74 6f p, "::tls::proto
177f0 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 cols", Protocols
17800 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
17810 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f ata) NULL, (Tcl_
17820 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
17830 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 75 69 NULL);.. Bui
17840 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 69 6e ldInfoCommand(in
17850 74 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 terp);.. if (
17860 69 6e 74 65 72 70 20 26 26 20 54 63 6c 5f 45 76 interp && Tcl_Ev
17870 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 al(interp, tlsTc
17880 6c 49 6e 69 74 53 63 72 69 70 74 29 20 21 3d 20 lInitScript) !=
17890 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 TCL_OK) {..retur
178a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
178b0 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }.. return T
178c0 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e cl_PkgProvide(in
178d0 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 terp, PACKAGE_NA
178e0 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 ME, PACKAGE_VERS
178f0 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d ION);.}../*. *--
17900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17940 2d 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 -. *. *.Tls_Safe
17950 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Init --. *. *.Th
17960 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 is is a package
17970 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 initialization p
17980 72 6f 63 65 64 75 72 65 20 66 6f 72 20 73 61 66 rocedure for saf
17990 65 20 69 6e 74 65 72 70 73 2e 0a 20 2a 0a 20 2a e interps.. *. *
179a0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 53 61 6d Results:. *.Sam
179b0 65 20 61 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 e as of 'Tls_Ini
179c0 74 27 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t'. *. * Side ef
179d0 66 65 63 74 73 3a 0a 20 2a 09 53 61 6d 65 20 61 fects:. *.Same a
179e0 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a s of 'Tls_Init'.
179f0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
17a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17a30 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c --------. */.DLL
17a40 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 EXPORT int Tls_S
17a50 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 afeInit(Tcl_Inte
17a60 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 rp *interp) {.
17a70 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
17a80 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 d");. return
17a90 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 Tls_Init(interp)
17aa0 3b 0a 7d 0a ;.}.