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: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0390: 63 72 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 crypto.h>.#inclu
03a0: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e de <openssl/ssl.
03b0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 h>.#include <ope
03c0: 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 23 69 6e 63 nssl/evp.h>.#inc
03d0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 62 lude <openssl/ob
03e0: 6a 65 63 74 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 jects.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: 2f 2a 0a 20 2a 20 45 78 74 65 72 6e 61 6c 20 66 /*. * External f
04b0: 75 6e 63 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 2f 2a unctions. */../*
04c0: 0a 20 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c . * Forward decl
04d0: 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64 arations. */..#d
04e0: 65 66 69 6e 65 20 46 32 4e 28 6b 65 79 2c 20 64 efine F2N(key, d
04f0: 73 70 29 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d sp) \..(((key) =
0500: 3d 20 4e 55 4c 4c 29 20 3f 20 28 63 68 61 72 20 = NULL) ? (char
0510: 2a 29 20 4e 55 4c 4c 20 3a 20 5c 0a 09 09 54 63 *) NULL : \...Tc
0520: 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e l_TranslateFileN
0530: 61 6d 65 28 69 6e 74 65 72 70 2c 20 28 6b 65 79 ame(interp, (key
0540: 29 2c 20 28 64 73 70 29 29 29 0a 23 64 65 66 69 ), (dsp))).#defi
0550: 6e 65 20 52 45 41 53 4f 4e 28 29 09 45 52 52 5f ne REASON().ERR_
0560: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 reason_error_str
0570: 69 6e 67 28 45 52 52 5f 67 65 74 5f 65 72 72 6f ing(ERR_get_erro
0580: 72 28 29 29 0a 0a 73 74 61 74 69 63 20 53 53 4c r())..static SSL
0590: 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69 74 28 53 _CTX *CTX_Init(S
05a0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 tate *statePtr,
05b0: 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e int isServer, in
05c0: 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b t proto, char *k
05d0: 65 79 2c 0a 09 09 63 68 61 72 20 2a 63 65 72 74 ey,...char *cert
05e0: 66 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 file, unsigned c
05f0: 68 61 72 20 2a 6b 65 79 5f 61 73 6e 31 2c 20 75 har *key_asn1, u
0600: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 nsigned char *ce
0610: 72 74 5f 61 73 6e 31 2c 0a 09 09 69 6e 74 20 6b rt_asn1,...int k
0620: 65 79 5f 61 73 6e 31 5f 6c 65 6e 2c 20 69 6e 74 ey_asn1_len, int
0630: 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65 6e 2c 20 cert_asn1_len,
0640: 63 68 61 72 20 2a 43 41 64 69 72 2c 20 63 68 61 char *CAdir, cha
0650: 72 20 2a 43 41 66 69 6c 65 2c 0a 09 09 63 68 61 r *CAfile,...cha
0660: 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 r *ciphers, char
0670: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 *ciphersuites,
0680: 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 int level, char
0690: 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a 73 74 61 *DHparams);..sta
06a0: 74 69 63 20 69 6e 74 09 54 6c 73 4c 69 62 49 6e tic int.TlsLibIn
06b0: 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c it(int uninitial
06c0: 69 7a 65 29 3b 0a 0a 23 64 65 66 69 6e 65 20 54 ize);..#define T
06d0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 09 09 30 LS_PROTO_SSL2..0
06e0: 78 30 31 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f x01.#define TLS_
06f0: 50 52 4f 54 4f 5f 53 53 4c 33 09 09 30 78 30 32 PROTO_SSL3..0x02
0700: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f .#define TLS_PRO
0710: 54 4f 5f 54 4c 53 31 09 09 30 78 30 34 0a 23 64 TO_TLS1..0x04.#d
0720: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f efine TLS_PROTO_
0730: 54 4c 53 31 5f 31 09 30 78 30 38 0a 23 64 65 66 TLS1_1.0x08.#def
0740: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ine TLS_PROTO_TL
0750: 53 31 5f 32 09 30 78 31 30 0a 23 64 65 66 69 6e S1_2.0x10.#defin
0760: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
0770: 5f 33 09 30 78 32 30 0a 23 64 65 66 69 6e 65 20 _3.0x20.#define
0780: 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61 ENABLED(flag, ma
0790: 73 6b 29 09 28 28 28 66 6c 61 67 29 20 26 20 28 sk).(((flag) & (
07a0: 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29 mask)) == (mask)
07b0: 29 0a 0a 23 64 65 66 69 6e 65 20 53 53 4c 4b 45 )..#define SSLKE
07c0: 59 4c 4f 47 46 49 4c 45 09 09 22 53 53 4c 4b 45 YLOGFILE.."SSLKE
07d0: 59 4c 4f 47 46 49 4c 45 22 0a 0a 2f 2a 0a 20 2a YLOGFILE"../*. *
07e0: 20 53 74 61 74 69 63 20 64 61 74 61 20 73 74 72 Static data str
07f0: 75 63 74 75 72 65 73 0a 20 2a 2f 0a 0a 23 69 66 uctures. */..#if
0800: 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ndef OPENSSL_NO_
0810: 44 48 0a 23 69 6e 63 6c 75 64 65 20 22 64 68 5f DH.#include "dh_
0820: 70 61 72 61 6d 73 2e 68 22 0a 23 65 6e 64 69 66 params.h".#endif
0830: 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 2d 53 ../*. * Thread-S
0840: 61 66 65 20 54 4c 53 20 43 6f 64 65 0a 20 2a 2f afe TLS Code. */
0850: 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f 54 48 52 ..#ifdef TCL_THR
0860: 45 41 44 53 0a 23 64 65 66 69 6e 65 20 4f 50 45 EADS.#define OPE
0870: 4e 53 53 4c 5f 54 48 52 45 41 44 5f 44 45 46 49 NSSL_THREAD_DEFI
0880: 4e 45 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 NES.#include <op
0890: 65 6e 73 73 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e enssl/opensslcon
08a0: 66 2e 68 3e 0a 0a 23 69 66 64 65 66 20 4f 50 45 f.h>..#ifdef OPE
08b0: 4e 53 53 4c 5f 54 48 52 45 41 44 53 0a 23 69 6e NSSL_THREADS.#in
08c0: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 clude <openssl/c
08d0: 72 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 rypto.h>.#includ
08e0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 e <openssl/ssl.h
08f0: 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 65 >../*. * Threade
0900: 64 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 75 d operation requ
0910: 69 72 65 73 20 6c 6f 63 6b 69 6e 67 20 63 61 6c ires locking cal
0920: 6c 62 61 63 6b 73 0a 20 2a 20 42 61 73 65 64 20 lbacks. * Based
0930: 66 72 6f 6d 20 2f 63 72 79 70 74 6f 2f 63 72 79 from /crypto/cry
0940: 70 74 6c 69 62 2e 63 20 6f 66 20 4f 70 65 6e 53 ptlib.c of OpenS
0950: 53 4c 20 61 6e 64 20 4e 53 4f 70 65 6e 53 53 4c SL and NSOpenSSL
0960: 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 .. */..static Tc
0970: 6c 5f 4d 75 74 65 78 20 2a 6c 6f 63 6b 73 20 3d l_Mutex *locks =
0980: 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e NULL;.static in
0990: 74 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 t locksCount = 0
09a0: 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 ;.static Tcl_Mut
09b0: 65 78 20 69 6e 69 74 5f 6d 78 3b 0a 23 65 6e 64 ex init_mx;.#end
09c0: 69 66 20 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 48 if /* OPENSSL_TH
09d0: 52 45 41 44 53 20 2a 2f 0a 23 65 6e 64 69 66 20 READS */.#endif
09e0: 2f 2a 20 54 43 4c 5f 54 48 52 45 41 44 53 20 2a /* TCL_THREADS *
09f0: 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /..../**********
0a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 **********/./* C
0a10: 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 20 20 20 allbacks
0a20: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./************
0a30: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a ********/../*. *
0a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a80: 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20 43 ---. *. * Eval C
0a90: 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64 20 allback Command
0aa0: 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63 61 --. *. *.Eval ca
0ab0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 61 llback command a
0ac0: 6e 64 20 63 61 74 63 68 20 61 6e 79 20 65 72 72 nd catch any err
0ad0: 6f 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ors. *. * Result
0ae0: 73 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e s:. *.0 = Comman
0af0: 64 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 20 d returned fail
0b00: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64 or eval returned
0b10: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31 20 TCL_ERROR. *.1
0b20: 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e = Command return
0b30: 65 64 20 73 75 63 63 65 73 73 20 6f 72 20 65 76 ed success or ev
0b40: 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c 5f al returned TCL_
0b50: 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 OK. *. * Side ef
0b60: 66 65 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75 61 fects:. *.Evalua
0b70: 74 65 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d tes callback com
0b80: 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d mand. *. *------
0b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
0bd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 45 76 61 /.static int.Eva
0be0: 6c 43 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49 6e lCallback(Tcl_In
0bf0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 53 74 terp *interp, St
0c00: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 54 ate *statePtr, T
0c10: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29 20 cl_Obj *cmdPtr)
0c20: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 {. int code,
0c30: 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 54 63 6c ok = 0;.. Tcl
0c40: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
0c50: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a tData) interp);.
0c60: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
0c70: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
0c80: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a atePtr);.. /*
0c90: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 77 Eval callback w
0ca0: 69 74 68 20 73 75 63 63 65 73 73 20 66 6f 72 20 ith success for
0cb0: 6f 6b 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c ok or return val
0cc0: 75 65 20 31 2c 20 66 61 69 6c 20 66 6f 72 20 65 ue 1, fail for e
0cd0: 72 72 6f 72 20 6f 72 20 72 65 74 75 72 6e 20 76 rror or return v
0ce0: 61 6c 75 65 20 30 20 2a 2f 0a 20 20 20 20 54 63 alue 0 */. Tc
0cf0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e l_ResetResult(in
0d00: 74 65 72 70 29 3b 0a 20 20 20 20 63 6f 64 65 20 terp);. code
0d10: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 = Tcl_EvalObjEx(
0d20: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
0d30: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
0d40: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d ;. if (code =
0d50: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 = TCL_OK) {../*
0d60: 43 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72 Check result for
0d70: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f return value */
0d80: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c ..Tcl_Obj *resul
0d90: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 t = Tcl_GetObjRe
0da0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 sult(interp);..i
0db0: 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c f (result == NUL
0dc0: 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 L || Tcl_GetIntF
0dd0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 romObj(interp, r
0de0: 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54 esult, &ok) != T
0df0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b CL_OK) {.. ok
0e00: 20 3d 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 = 1;..}. } e
0e10: 6c 73 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 lse {../* Error
0e20: 2d 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 - reject the cer
0e30: 74 69 66 69 63 61 74 65 20 2a 2f 0a 23 69 66 20 tificate */.#if
0e40: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 (TCL_MAJOR_VERSI
0e50: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c ON == 8) && (TCL
0e60: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MINOR_VERSION <
0e70: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 6)..Tcl_Backgro
0e80: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 undError(interp)
0e90: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 ;.#else..Tcl_Bac
0ea0: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e kgroundException
0eb0: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a (interp, code);.
0ec0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
0ed0: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 Tcl_Release((C
0ee0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
0ef0: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 Ptr);. Tcl_Re
0f00: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
0f10: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 a) interp);.
0f20: 72 65 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f return ok;.}.../
0f30: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e -------. *. * In
0f80: 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a foCallback --. *
0f90: 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c . *.Monitors SSL
0fa0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 connection proc
0fb0: 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ess. *. * Result
0fc0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
0fd0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
0fe0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
0ff0: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
1000: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1040: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
1050: 63 20 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 c void.InfoCallb
1060: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 ack(const SSL *s
1070: 73 6c 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 sl, int where, i
1080: 6e 74 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 nt ret) {. St
1090: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
10a0: 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f (State*)SSL_get_
10b0: 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 app_data((SSL *)
10c0: 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e ssl);. Tcl_In
10d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
10e0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
10f0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
1100: 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a dPtr;. char *
1110: 6d 61 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e major; char *min
1120: 6f 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 or;.. dprintf
1130: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
1140: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
1150: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f allback == (Tcl_
1160: 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 Obj*)NULL)..retu
1170: 72 6e 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 rn;.. if (whe
1180: 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 re & SSL_CB_HAND
1190: 53 48 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 SHAKE_START) {..
11a0: 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 major = "handsha
11b0: 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 ke";..minor = "s
11c0: 74 61 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 tart";. } els
11d0: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 e if (where & SS
11e0: 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 L_CB_HANDSHAKE_D
11f0: 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 ONE) {..major =
1200: 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 "handshake";..mi
1210: 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 nor = "done";.
1220: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 } else {..if (
1230: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 where & SSL_CB_A
1240: 4c 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 LERT)..major = "
1250: 61 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 alert";..else if
1260: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 (where & SSL_ST
1270: 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 _CONNECT).major
1280: 3d 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c = "connect";..el
1290: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
12a0: 53 4c 5f 53 54 5f 41 43 43 45 50 54 29 09 09 6d SL_ST_ACCEPT)..m
12b0: 61 6a 6f 72 20 3d 20 22 61 63 63 65 70 74 22 3b ajor = "accept";
12c0: 0a 09 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 ..else.....major
12d0: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 = "unknown";...
12e0: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
12f0: 43 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 CB_READ)..minor
1300: 3d 20 22 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 = "read";..else
1310: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
1320: 43 42 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 CB_WRITE)..minor
1330: 20 3d 20 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 = "write";..els
1340: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 e if (where & SS
1350: 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f L_CB_LOOP)..mino
1360: 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 r = "loop";..els
1370: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 e if (where & SS
1380: 4c 5f 43 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f L_CB_EXIT)..mino
1390: 72 20 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 r = "exit";..els
13a0: 65 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 e.....minor = "u
13b0: 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a nknown";. }..
13c0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f /* Create co
13d0: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f mmand to eval */
13e0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 . cmdPtr = Tc
13f0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
1400: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
1410: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 k);. Tcl_List
1420: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1430: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
1440: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1450: 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a j("info", -1));.
1460: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
1470: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
1480: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
1490: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
14a0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
14b0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
14c0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
14d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
14e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
14f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
1500: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 wStringObj(major
1510: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
1520: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1530: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1540: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
1550: 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 ngObj(minor, -1)
1560: 29 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 );.. if (wher
1570: 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 e & SSL_CB_ALERT
1580: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ) {..Tcl_ListObj
1590: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
15a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
15b0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
15c0: 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 Obj(SSL_alert_de
15d0: 73 63 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 sc_string_long(r
15e0: 65 74 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f et), -1));..Tcl_
15f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1600: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1610: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
1620: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 wStringObj(SSL_a
1630: 6c 65 72 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 lert_type_string
1640: 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 _long(ret), -1))
1650: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
1660: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1670: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1680: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
1690: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 l_NewStringObj(S
16a0: 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f SL_state_string_
16b0: 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b long(ssl), -1));
16c0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
16d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
16e0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
16f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 ewStringObj("inf
1700: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a o", -1));. }.
1710: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
1720: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
1730: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
1740: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
1750: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 EvalCallback(
1760: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
1770: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 , cmdPtr);. T
1780: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
1790: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a cmdPtr);.}.../*.
17a0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17e0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 -----. *. * Mess
17f0: 61 67 65 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 ageCallback --.
1800: 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 *. *.Monitors SS
1810: 4c 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 L protocol messa
1820: 67 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ges. *. * Result
1830: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
1840: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
1850: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
1860: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
1870: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 ------. */.#ifnd
18c0: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ef OPENSSL_NO_SS
18d0: 4c 5f 54 52 41 43 45 0a 73 74 61 74 69 63 20 76 L_TRACE.static v
18e0: 6f 69 64 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 oid.MessageCallb
18f0: 61 63 6b 28 69 6e 74 20 77 72 69 74 65 5f 70 2c ack(int write_p,
1900: 20 69 6e 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e int version, in
1910: 74 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 t content_type,
1920: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 75 66 2c const void *buf,
1930: 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c size_t len, SSL
1940: 20 2a 73 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 *ssl, void *arg
1950: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
1960: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
1970: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 *)arg;. Tcl_I
1980: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
1990: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
19a0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
19b0: 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 mdPtr;. char
19c0: 2a 76 65 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 *ver, *type;.
19d0: 20 42 49 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 BIO *bio;. c
19e0: 68 61 72 20 62 75 66 66 65 72 5b 31 35 30 30 30 har buffer[15000
19f0: 5d 3b 0a 20 20 20 20 62 75 66 66 65 72 5b 30 5d ];. buffer[0]
1a00: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e = 0;.. dprin
1a10: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
1a20: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
1a30: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 >callback == (Tc
1a40: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 l_Obj*)NULL)..re
1a50: 74 75 72 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 turn;.. switc
1a60: 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66 h(version) {.#if
1a70: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
1a80: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
1a90: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 0000L && !define
1aa0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 d(NO_SSL2) && !d
1ab0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
1ac0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 O_SSL2). case
1ad0: 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 SSL2_VERSION:..
1ae0: 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 ver = "SSLv2";..
1af0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
1b00: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
1b10: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
1b20: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
1b30: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 56 . case SSL3_V
1b40: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 ERSION:..ver = "
1b50: 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a SSLv3";..break;.
1b60: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 #endif. case
1b70: 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 TLS1_VERSION:..v
1b80: 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 er = "TLSv1";..b
1b90: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 reak;. case T
1ba0: 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 LS1_1_VERSION:..
1bb0: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b ver = "TLSv1.1";
1bc0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1bd0: 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e e TLS1_2_VERSION
1be0: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e :..ver = "TLSv1.
1bf0: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 2";..break;.
1c00: 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 case TLS1_3_VERS
1c10: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 ION:..ver = "TLS
1c20: 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 v1.3";..break;.
1c30: 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65 72 20 case 0:..ver
1c40: 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 6b = "none";..break
1c50: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 ;. default:..
1c60: 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b ver = "unknown";
1c70: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a ..break;. }..
1c80: 20 20 20 20 73 77 69 74 63 68 20 28 63 6f 6e 74 switch (cont
1c90: 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20 20 20 ent_type) {.
1ca0: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 45 41 case SSL3_RT_HEA
1cb0: 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 DER:..type = "He
1cc0: 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 ader";..break;.
1cd0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f case SSL3_RT_
1ce0: 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 59 INNER_CONTENT_TY
1cf0: 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49 6e 6e PE:..type = "Inn
1d00: 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70 65 22 er Content Type"
1d10: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ;..break;. ca
1d20: 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41 4e 47 se SSL3_RT_CHANG
1d30: 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a 0a 09 E_CIPHER_SPEC:..
1d40: 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65 20 43 type = "Change C
1d50: 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a ipher";..break;.
1d60: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 case SSL3_RT
1d70: 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d 20 _ALERT:..type =
1d80: 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61 6b 3b "Alert";..break;
1d90: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 . case SSL3_R
1da0: 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79 T_HANDSHAKE:..ty
1db0: 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 22 pe = "Handshake"
1dc0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ;..break;. ca
1dd0: 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 se SSL3_RT_APPLI
1de0: 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 CATION_DATA:..ty
1df0: 70 65 20 3d 20 22 41 70 70 20 44 61 74 61 22 3b pe = "App Data";
1e00: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1e10: 65 20 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 e DTLS1_RT_HEART
1e20: 42 45 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 BEAT:..type = "H
1e30: 65 61 72 74 62 65 61 74 22 3b 0a 09 62 72 65 61 eartbeat";..brea
1e40: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a k;. default:.
1e50: 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e .type = "unknown
1e60: 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a ";. }.. /*
1e70: 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 Needs compile t
1e80: 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 ime option "enab
1e90: 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a le-ssl-trace". *
1ea0: 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f 20 3d /. if ((bio =
1eb0: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d BIO_new(BIO_s_m
1ec0: 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 em())) != NULL)
1ed0: 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 {..int n;..SSL_t
1ee0: 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20 76 65 race(write_p, ve
1ef0: 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 rsion, content_t
1f00: 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 ype, buf, len, s
1f10: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 sl, (void *)bio)
1f20: 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 ;..n = BIO_read(
1f30: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 6d 69 6e bio, buffer, min
1f40: 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f (BIO_pending(bio
1f50: 29 2c 20 31 34 39 39 39 29 29 3b 0a 09 6e 20 3d ), 14999));..n =
1f60: 20 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a (n<0) ? 0 : n;.
1f70: 09 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a .buffer[n] = 0;.
1f80: 09 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 .(void)BIO_flush
1f90: 28 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 (bio);..BIO_free
1fa0: 28 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 (bio);. }..
1fb0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
1fc0: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
1fd0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
1fe0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
1ff0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
2000: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2010: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2020: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
2030: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
2040: 6d 65 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a message", -1));.
2050: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2060: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2070: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
2080: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
2090: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
20a0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
20b0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
20c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
20d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
20e0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
20f0: 77 53 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65 wStringObj(write
2100: 5f 70 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52 _p ? "Sent" : "R
2110: 65 63 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a eceived", -1));.
2120: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2130: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
2140: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
2150: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65 _NewStringObj(ve
2160: 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c r, -1));. Tcl
2170: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2180: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
2190: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
21a0: 69 6e 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29 ingObj(type, -1)
21b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
21c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
21d0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
21e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
21f0: 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a (buffer, -1));..
2200: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
2210: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
2220: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
2230: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
2240: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 EvalCallback(i
2250: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
2260: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 cmdPtr);. Tc
2270: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
2280: 6d 64 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 mdPtr);.}.#endif
2290: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
22e0: 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b * VerifyCallback
22f0: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f --. *. *.Monito
2300: 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 rs SSL certifica
2310: 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 te validation pr
2320: 6f 63 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 ocess. Used to c
2330: 6f 6e 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 ontrol the. *.be
2340: 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 havior when the
2350: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 SSL_VERIFY_PEER
2360: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 flag is set. Thi
2370: 73 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 s is called. *.w
2380: 68 65 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 henever a certif
2390: 69 63 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 icate is inspect
23a0: 65 64 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e ed or decided in
23b0: 76 61 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f valid. Called fo
23c0: 72 0a 20 2a 09 65 61 63 68 20 63 65 72 74 69 66 r. *.each certif
23d0: 69 63 61 74 65 20 69 6e 20 74 68 65 20 63 65 72 icate in the cer
23e0: 74 20 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43 t chain.. *. * C
23f0: 68 65 63 6b 73 3a 0a 20 2a 09 63 65 72 74 69 66 hecks:. *.certif
2400: 69 63 61 74 65 20 63 68 61 69 6e 20 69 73 20 63 icate chain is c
2410: 68 65 63 6b 65 64 20 73 74 61 72 74 69 6e 67 20 hecked starting
2420: 77 69 74 68 20 74 68 65 20 64 65 65 70 65 73 74 with the deepest
2430: 20 6e 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 nesting level.
2440: 2a 09 20 20 28 74 68 65 20 72 6f 6f 74 20 43 41 *. (the root CA
2450: 20 63 65 72 74 69 66 69 63 61 74 65 29 20 61 6e certificate) an
2460: 64 20 77 6f 72 6b 65 64 20 75 70 77 61 72 64 20 d worked upward
2470: 74 6f 20 74 68 65 20 70 65 65 72 27 73 20 63 65 to the peer's ce
2480: 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c rtificate.. *.Al
2490: 6c 20 73 69 67 6e 61 74 75 72 65 73 20 61 72 65 l signatures are
24a0: 20 76 61 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 valid, current
24b0: 74 69 6d 65 20 69 73 20 77 69 74 68 69 6e 20 66 time is within f
24c0: 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 76 61 irst and last va
24d0: 6c 69 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 lidity time.. *.
24e0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 63 Check that the c
24f0: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 73 ertificate is is
2500: 73 75 65 64 20 62 79 20 74 68 65 20 69 73 73 75 sued by the issu
2510: 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20 69 er certificate i
2520: 73 73 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 ssuer.. *.Check
2530: 74 68 65 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 the revocation s
2540: 74 61 74 75 73 20 66 6f 72 20 65 61 63 68 20 63 tatus for each c
2550: 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 ertificate.. *.C
2560: 68 65 63 6b 20 74 68 65 20 76 61 6c 69 64 69 74 heck the validit
2570: 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 43 y of the given C
2580: 52 4c 20 61 6e 64 20 74 68 65 20 63 65 72 74 20 RL and the cert
2590: 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 revocation statu
25a0: 73 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 s.. *.Check the
25b0: 70 6f 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 policies of all
25c0: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 73 the certificates
25d0: 0a 20 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 . *. * Args. *.p
25e0: 72 65 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 reverify_ok indi
25f0: 63 61 74 65 73 20 77 68 65 74 68 65 72 20 74 68 cates whether th
2600: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 76 65 e certificate ve
2610: 72 69 66 69 63 61 74 69 6f 6e 20 70 61 73 73 65 rification passe
2620: 64 20 28 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 d (1) or not (0)
2630: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
2640: 20 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f *.A callback bo
2650: 75 6e 64 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 und to the socke
2660: 74 20 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 t may return one
2670: 20 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 of:. *. 0...
2680: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 - the certificat
2690: 65 20 69 73 20 64 65 65 6d 65 64 20 69 6e 76 61 e is deemed inva
26a0: 6c 69 64 2c 20 73 65 6e 64 20 76 65 72 69 66 69 lid, send verifi
26b0: 63 61 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 cation. *.... f
26c0: 61 69 6c 75 72 65 20 61 6c 65 72 74 20 74 6f 20 ailure alert to
26d0: 70 65 65 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e peer, and termin
26e0: 61 74 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 ate handshake..
26f0: 2a 09 20 20 20 20 31 09 09 09 2d 20 74 68 65 20 *. 1...- the
2700: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64 certificate is d
2710: 65 65 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e eemed valid, con
2720: 74 69 6e 75 65 20 77 69 74 68 20 68 61 6e 64 73 tinue with hands
2730: 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 hake.. *. emp
2740: 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 ty string.- no c
2750: 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 hange to certifi
2760: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a cate validation.
2770: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
2780: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 ts:. *.The err f
2790: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 ield of the curr
27a0: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 ently operative
27b0: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 State is set. *.
27c0: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 to a string de
27d0: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c scribing the SSL
27e0: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 negotiation fai
27f0: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 lure reason. *.
2800: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2840: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
2850: 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 int.VerifyCallba
2860: 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f ck(int ok, X509_
2870: 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 20 STORE_CTX *ctx)
2880: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 {. Tcl_Obj *c
2890: 6d 64 50 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 mdPtr;. SSL
28a0: 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 *ssl..= (SSL*)X
28b0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 509_STORE_CTX_ge
28c0: 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20 53 t_ex_data(ctx, S
28d0: 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 SL_get_ex_data_X
28e0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 509_STORE_CTX_id
28f0: 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20 20 x());. X509
2900: 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53 54 *cert..= X509_ST
2910: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 ORE_CTX_get_curr
2920: 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 ent_cert(ctx);.
2930: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
2940: 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr.= (State*)SSL
2950: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73 _get_app_data(ss
2960: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 l);. Tcl_Inte
2970: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
2980: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
2990: 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20 int depth..=
29a0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 X509_STORE_CTX_g
29b0: 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63 et_error_depth(c
29c0: 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 tx);. int err
29d0: 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 ..= X509_STORE_C
29e0: 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78 TX_get_error(ctx
29f0: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 );.. dprintf(
2a00: 22 56 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b "Verify: %d", ok
2a10: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
2a20: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 ePtr->vcmd == (T
2a30: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
2a40: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 .if (statePtr->v
2a50: 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 flags & SSL_VERI
2a60: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
2a70: 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 ER_CERT) {..
2a80: 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c return ok;..} el
2a90: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e se {.. return
2aa0: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 1;..}. } els
2ab0: 65 20 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 e if (cert == NU
2ac0: 4c 4c 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c LL || ssl == NUL
2ad0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a L) {..return 0;.
2ae0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
2af0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
2b00: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 eval */. cmdP
2b10: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
2b20: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
2b30: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
2b40: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2b50: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2b60: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
2b70: 67 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d gObj("verify", -
2b80: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
2b90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2ba0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2bb0: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 ,..Tcl_NewString
2bc0: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
2bd0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
2be0: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 >self), -1));.
2bf0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2c00: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2c10: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2c20: 65 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 ewIntObj(depth))
2c30: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
2c40: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2c50: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
2c60: 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e ls_NewX509Obj(in
2c70: 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 terp, cert));.
2c80: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2c90: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2ca0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2cb0: 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 ewIntObj(ok));.
2cc0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2cd0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2ce0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c rp, cmdPtr,..Tcl
2cf0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 _NewStringObj((c
2d00: 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 har*)X509_verify
2d10: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 _cert_error_stri
2d20: 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a ng(err), -1));..
2d30: 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 /* Prevent I
2d40: 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 /O while callbac
2d50: 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 k is in progress
2d60: 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 */. /* state
2d70: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c Ptr->flags |= TL
2d80: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 S_TCL_CALLBACK;
2d90: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 */.. /* Eval
2da0: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
2db0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
2dc0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
2dd0: 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 ;. ok = EvalC
2de0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
2df0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
2e00: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
2e10: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
2e20: 0a 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 .. /* statePt
2e30: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c r->flags &= ~(TL
2e40: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b S_TCL_CALLBACK);
2e50: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f */. return(o
2e60: 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c k);./* By defaul
2e70: 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 t, leave verific
2e80: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e ation unchanged.
2e90: 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d */.}.../*. *---
2ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ee0: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 . *. * Tls_Error
2ef0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 --. *. *.Calls
2f00: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 callback with li
2f10: 73 74 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a st of errors.. *
2f20: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
2f30: 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 :. *.The err fie
2f40: 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e ld of the curren
2f50: 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 tly operative St
2f60: 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 ate is set. *.
2f70: 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 to a string desc
2f80: 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e ribing the SSL n
2f90: 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 egotiation failu
2fa0: 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d re reason. *. *-
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ff0: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f --. */.void.Tls_
3000: 45 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 Error(State *sta
3010: 74 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 tePtr, char *msg
3020: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 ) {. Tcl_Inte
3030: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
3040: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
3050: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
3060: 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 tr, *listPtr;.
3070: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 unsigned long
3080: 65 72 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 err;. statePt
3090: 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 r->err = msg;..
30a0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
30b0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
30c0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
30d0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e k == (Tcl_Obj*)N
30e0: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 ULL)..return;..
30f0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
3100: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a mand to eval */.
3110: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
3120: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
3130: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
3140: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
3150: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3160: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3170: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
3180: 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a ("error", -1));.
3190: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
31a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
31b0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
31c0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
31d0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
31e0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
31f0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
3200: 20 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c if (msg != NULL
3210: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ) {..Tcl_ListObj
3220: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3230: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
3240: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
3250: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d sg, -1));.. }
3260: 20 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d else if ((msg =
3270: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
3280: 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a omObj(Tcl_GetObj
3290: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 Result(interp),
32a0: 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 NULL)) != NULL)
32b0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
32c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
32d0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
32e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 NewStringObj(msg
32f0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 , -1));.. } e
3300: 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d lse {..listPtr =
3310: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
3320: 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 0, NULL);..while
3330: 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67 65 74 ((err = ERR_get
3340: 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30 29 20 _error()) != 0)
3350: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
3360: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3370: 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c interp, listPtr,
3380: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3390: 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 j(ERR_reason_err
33a0: 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 or_string(err),
33b0: 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 -1));..}..Tcl_Li
33c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
33d0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
33e0: 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 r, listPtr);.
33f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 }.. /* Eval
3400: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
3410: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
3420: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
3430: 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 ;. EvalCallba
3440: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ck(interp, state
3450: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 Ptr, cmdPtr);.
3460: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
3470: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a nt(cmdPtr);.}...
3480: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
3490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b --------. *. * K
34d0: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d eyLogCallback --
34e0: 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 63 . *. *.Write rec
34f0: 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 20 74 eived key data t
3500: 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 o log file.. *.
3510: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
3520: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.none. *. *---
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3570: 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 . */.void KeyLog
3580: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
3590: 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 SL *ssl, const c
35a0: 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 har *line) {.
35b0: 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67 65 74 char *str = get
35c0: 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c env(SSLKEYLOGFIL
35d0: 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 E);. FILE *fd
35e0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
35f0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
3600: 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 f (str) {..fd =
3610: 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b fopen(str, "a");
3620: 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 ..fprintf(fd, "%
3630: 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c s\n",line);..fcl
3640: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d ose(fd);. }.}
3650: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
36a0: 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 * Password Callb
36b0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c ack --. *. *.Cal
36c0: 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 77 led when a passw
36d0: 6f 72 64 20 66 6f 72 20 61 20 70 72 69 76 61 74 ord for a privat
36e0: 65 20 6b 65 79 20 6c 6f 61 64 69 6e 67 2f 73 74 e key loading/st
36f0: 6f 72 69 6e 67 20 61 20 50 45 4d 0a 20 2a 09 63 oring a PEM. *.c
3700: 65 72 74 69 66 69 63 61 74 65 20 77 69 74 68 20 ertificate with
3710: 65 6e 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c encryption. Eval
3720: 73 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 s callback scrip
3730: 74 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a t and returns. *
3740: 09 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 .the result as t
3750: 68 65 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 he password stri
3760: 6e 67 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a ng in buf.. *. *
3770: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
3780: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
3790: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 ects:. *.Calls c
37a0: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 allback (if defi
37b0: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ned). *. * Retur
37c0: 6e 73 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 ns:. *.Password
37d0: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 size in bytes or
37e0: 20 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 -1 for an error
37f0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
3840: 74 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f tatic int.Passwo
3850: 72 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 rdCallback(char
3860: 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 *buf, int size,
3870: 69 6e 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 int rwflag, void
3880: 20 2a 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 *udata) {. S
3890: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d tate *statePtr.=
38a0: 20 28 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 (State *) udata
38b0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
38c0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
38d0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
38e0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
38f0: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a ;. int code;.
3900: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
3910: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 lled");.. /*
3920: 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 If no callback,
3930: 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c use default call
3940: 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 back */. if (
3950: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
3960: 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 rd == NULL) {..i
3970: 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e f (Tcl_EvalEx(in
3980: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 terp, "tls::pass
3990: 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 word", -1, TCL_E
39a0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 VAL_GLOBAL) == T
39b0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 CL_OK) {.. ch
39c0: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 ar *ret = (char
39d0: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 *) Tcl_GetString
39e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
39f0: 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 . strncpy(buf
3a00: 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 , ret, (size_t)
3a10: 73 69 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75 size);.. retu
3a20: 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 rn (int)strlen(r
3a30: 65 74 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 et);..} else {..
3a40: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 return -1;..
3a50: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
3a60: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
3a70: 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d o eval */. cm
3a80: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
3a90: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
3aa0: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 ->password);.
3ab0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3ac0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3ad0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
3ae0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 wStringObj("pass
3af0: 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 word", -1));.
3b00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3b10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3b20: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
3b30: 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 wIntObj(rwflag))
3b40: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3b50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3b60: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3b70: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a cl_NewIntObj(siz
3b80: 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 e));.. Tcl_Pr
3b90: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
3ba0: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 ta) interp);.
3bb0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 Tcl_Preserve((C
3bc0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
3bd0: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 Ptr);.. /* Ev
3be0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
3bf0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
3c00: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
3c10: 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 tr);. code =
3c20: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e Tcl_EvalObjEx(in
3c30: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 terp, cmdPtr, TC
3c40: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a L_EVAL_GLOBAL);.
3c50: 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 if (code !=
3c60: 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 TCL_OK) {.#if (T
3c70: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
3c80: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d == 8) && (TCL_M
3c90: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 INOR_VERSION < 6
3ca0: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e )..Tcl_Backgroun
3cb0: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a dError(interp);.
3cc0: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 #else..Tcl_Backg
3cd0: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 roundException(i
3ce0: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 nterp, code);.#e
3cf0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 ndif. }. T
3d00: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
3d10: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 cmdPtr);.. Tc
3d20: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
3d30: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
3d40: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 63 ;.. /* If suc
3d50: 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 62 61 cessful, pass ba
3d60: 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 ck password stri
3d70: 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20 ng and truncate
3d80: 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 if too long */.
3d90: 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 if (code == T
3da0: 43 4c 5f 4f 4b 29 20 7b 0a 09 69 6e 74 20 6c 65 CL_OK) {..int le
3db0: 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 n;..char *ret =
3dc0: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
3dd0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 StringFromObj(Tc
3de0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
3df0: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 nterp), &len);..
3e00: 69 66 20 28 6c 65 6e 20 3e 20 73 69 7a 65 2d 31 if (len > size-1
3e10: 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 73 ) {.. len = s
3e20: 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 ize-1;..}..strnc
3e30: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 py(buf, ret, (si
3e40: 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 ze_t) len);..buf
3e50: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 [len] = '\0';..T
3e60: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
3e70: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
3e80: 0a 09 72 65 74 75 72 6e 28 6c 65 6e 29 3b 0a 20 ..return(len);.
3e90: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c }. Tcl_Rel
3ea0: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 ease((ClientData
3eb0: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 ) interp);. r
3ec0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a eturn -1;.}.../*
3ed0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
3ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f10: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 ------. *. * Ses
3f20: 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f sion Callback fo
3f30: 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a r Clients --. *.
3f40: 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 *.Called when a
3f50: 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 69 73 20 new session is
3f60: 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 61 63 added to the cac
3f70: 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 he. In TLS 1.3.
3f80: 2a 09 74 68 69 73 20 6d 61 79 20 62 65 20 72 65 *.this may be re
3f90: 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 ceived multiple
3fa0: 74 69 6d 65 73 20 61 66 74 65 72 20 74 68 65 20 times after the
3fb0: 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 handshake. For.
3fc0: 2a 09 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f *.earlier versio
3fd0: 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 ns, this will be
3fe0: 20 72 65 63 65 69 76 65 64 20 64 75 72 69 6e 67 received during
3ff0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a the handshake..
4000: 20 2a 09 54 68 69 73 20 69 73 20 74 68 65 20 70 *.This is the p
4010: 72 65 66 65 72 72 65 64 20 77 61 79 20 74 6f 20 referred way to
4020: 6f 62 74 61 69 6e 20 61 20 72 65 73 75 6d 61 62 obtain a resumab
4030: 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 le session.. *.
4040: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
4050: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
4060: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
4070: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
4080: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 ined). *. * Retu
4090: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d rn codes:. *.0 =
40a0: 20 65 72 72 6f 72 20 77 68 65 72 65 20 73 65 73 error where ses
40b0: 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d sion will be imm
40c0: 65 64 69 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 ediately removed
40d0: 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e from the intern
40e0: 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d al cache.. *.1 =
40f0: 20 73 75 63 63 65 73 73 20 77 68 65 72 65 20 61 success where a
4100: 70 70 20 72 65 74 61 69 6e 73 20 73 65 73 73 69 pp retains sessi
4110: 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 on in session ca
4120: 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 che, and must ca
4130: 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 ll SSL_SESSION_f
4140: 72 65 65 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e ree() when done.
4150: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
41a0: 61 74 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e atic int.Session
41b0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
41c0: 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 SL *ssl, SSL_SES
41d0: 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b SION *session) {
41e0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
41f0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 ePtr = (State*)S
4200: 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 SL_get_app_data(
4210: 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 (SSL *)ssl);.
4220: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
4230: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
4240: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
4250: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
4260: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
4270: 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 char *ticket;.
4280: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
4290: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 char *session_i
42a0: 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 d;. size_t le
42b0: 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 n2;. unsigned
42c0: 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 int ulen;..
42d0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
42e0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
42f0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
4300: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
4310: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
4320: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 TLSEXT_ERR_OK;.
4330: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 } else if (ss
4340: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 l == NULL) {..re
4350: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
4360: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
4370: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
4380: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
4390: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
43a0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
43b0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
43c0: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ack);. Tcl_Li
43d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
43e0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
43f0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4400: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d Obj("session", -
4410: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
4420: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4430: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4440: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
4450: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
4460: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
4470: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
4480: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f ;.. /* Sessio
4490: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 n id */. sess
44a0: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 ion_id = SSL_SES
44b0: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 SION_get_id(sess
44c0: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 ion, &ulen);.
44d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
44e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
44f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4500: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 wByteArrayObj(se
4510: 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 ssion_id, (int)
4520: 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 ulen));.. /*
4530: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a Session ticket *
4540: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f /. SSL_SESSIO
4550: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 N_get0_ticket(se
4560: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 ssion, &ticket,
4570: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f &len2);. Tcl_
4580: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
4590: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
45a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 Ptr, Tcl_NewByte
45b0: 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c ArrayObj(ticket,
45c0: 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a (int) len2));..
45d0: 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 /* Lifetime
45e0: 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f - number of seco
45f0: 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c nds */. Tcl_L
4600: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4610: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
4620: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 tr,..Tcl_NewLong
4630: 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 Obj((long) SSL_S
4640: 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 ESSION_get_ticke
4650: 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 t_lifetime_hint(
4660: 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 session)));..
4670: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 /* Eval callbac
4680: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 k command */.
4690: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
46a0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 t(cmdPtr);. E
46b0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
46c0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
46d0: 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 dPtr);. Tcl_D
46e0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
46f0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
4700: 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 0;.}.../*. *----
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4750: 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 *. * ALPN Callb
4760: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 ack for Servers
4770: 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b and NPN Callback
4780: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a for Clients --.
4790: 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72 *. *.Perform pr
47a0: 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 otocol (http/1.1
47b0: 2c 20 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 , h2, h3, etc.)
47c0: 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 selection for th
47d0: 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f e. *.incoming co
47e0: 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 nnection. Called
47f0: 20 61 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64 after Hello and
4800: 20 73 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b server callback
4810: 73 2e 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74 s.. *.Where 'out
4820: 27 20 69 73 20 73 65 6c 65 63 74 65 64 20 70 72 ' is selected pr
4830: 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20 otocol and 'in'
4840: 69 73 20 74 68 65 20 70 65 65 72 20 61 64 76 65 is the peer adve
4850: 72 74 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a rtised list.. *.
4860: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
4870: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
4880: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
4890: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
48a0: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
48b0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
48c0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a L_TLSEXT_ERR_OK:
48d0: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 ALPN protocol s
48e0: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e elected. The con
48f0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
4900: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s.. *.SSL_TLSEXT
4910: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
4920: 3a 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f : There was no o
4930: 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 verlap between t
4940: 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 he client's. *.
4950: 20 20 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 supplied list
4960: 20 61 6e 64 20 74 68 65 20 73 65 72 76 65 72 20 and the server
4970: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 configuration. T
4980: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 he connection wi
4990: 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 ll be aborted..
49a0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
49b0: 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f _NOACK: ALPN pro
49c0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 tocol not select
49d0: 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 ed, e.g., becaus
49e0: 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 e no ALPN. *.
49f0: 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 protocols are c
4a00: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 onfigured for th
4a10: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 is connection. T
4a20: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
4a30: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d ntinues.. *. *--
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a80: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
4a90: 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f .ALPNCallback(co
4aa0: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f nst SSL *ssl, co
4ab0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
4ac0: 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 r **out, unsigne
4ad0: 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a d char *outlen,.
4ae0: 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 .const unsigned
4af0: 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e char *in, unsign
4b00: 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f ed int inlen, vo
4b10: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
4b20: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
4b30: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 (State*)arg;.
4b40: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
4b50: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
4b60: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
4b70: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
4b80: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b int code, res;
4b90: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
4ba0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
4bb0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (ssl == NULL ||
4bc0: 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a arg == NULL) {.
4bd0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4be0: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
4bf0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 }.. /* Sele
4c00: 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 ct protocol */.
4c10: 20 20 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 if (SSL_selec
4c20: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 t_next_proto(out
4c30: 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 , outlen, stateP
4c40: 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 tr->protos, stat
4c50: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e ePtr->protos_len
4c60: 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d ,..in, inlen) ==
4c70: 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 OPENSSL_NPN_NEG
4c80: 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d OTIATED) {../* M
4c90: 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 atch found */..r
4ca0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
4cb0: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c ERR_OK;. } el
4cc0: 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c se {../* OPENSSL
4cd0: 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 _NPN_NO_OVERLAP
4ce0: 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f = No overlap, so
4cf0: 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 use first item
4d00: 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 from client prot
4d10: 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 ocol list */..re
4d20: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
4d30: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
4d40: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
4d50: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f r->vcmd == (Tcl_
4d60: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 Obj*)NULL) {..re
4d70: 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a turn res;. }.
4d80: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
4d90: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a ommand to eval *
4da0: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
4db0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
4dc0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
4dd0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4de0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4df0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
4e00: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
4e10: 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 alpn", -1));.
4e20: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4e30: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4e40: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
4e50: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
4e60: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
4e70: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
4e80: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 f), -1));. Tc
4e90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4ea0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
4eb0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
4ec0: 72 69 6e 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 ringObj(*out, -1
4ed0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
4ee0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
4ef0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
4f00: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f Tcl_NewBooleanO
4f10: 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c bj(res == SSL_TL
4f20: 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a SEXT_ERR_OK));..
4f30: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
4f40: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
4f50: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
4f60: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
4f70: 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 if ((code = Ev
4f80: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 alCallback(inter
4f90: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 p, statePtr, cmd
4fa0: 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 Ptr)) > 1) {..re
4fb0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
4fc0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 RR_NOACK;. }
4fd0: 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d else if (code ==
4fe0: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 1) {..res = SSL
4ff0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
5000: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 } else {..re
5010: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
5020: 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a RR_ALERT_FATAL;.
5030: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 }. Tcl_De
5040: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
5050: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 r);. return r
5060: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d es;.}.../*. *---
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50b0: 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 65 . *. * Advertise
50c0: 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 Protocols Callb
50d0: 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 6f ack for Next Pro
50e0: 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f tocol Negotiatio
50f0: 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 n (NPN) in Serve
5100: 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 rHello --. *. *.
5110: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 4c called when a TL
5120: 53 20 73 65 72 76 65 72 20 6e 65 65 64 73 20 61 S server needs a
5130: 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f 72 74 list of support
5140: 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 ed protocols for
5150: 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f Next. *.Protoco
5160: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 l Negotiation..
5170: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
5180: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
5190: 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 effects:. *. *
51a0: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a Return codes:. *
51b0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
51c0: 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c OK: NPN protocol
51d0: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 selected. The c
51e0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
51f0: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 ues.. *.SSL_TLSE
5200: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 XT_ERR_NOACK: NP
5210: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 N protocol not s
5220: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e elected. The con
5230: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
5240: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d s.. *. *--------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
5290: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 #ifdef USE_NPN.s
52a0: 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c tatic int.NPNCal
52b0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
52c0: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 *ssl, const unsi
52d0: 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c gned char **out,
52e0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f unsigned int *o
52f0: 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 utlen, void *arg
5300: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
5310: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
5320: 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 *)arg;.. dpri
5330: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
5340: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e if (ssl == N
5350: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 ULL || arg == NU
5360: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
5370: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
5380: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f CK;. }.. /
5390: 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 * Set protocols
53a0: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 list */. if (
53b0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
53c0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 != NULL) {..*ou
53d0: 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 t = statePtr->pr
53e0: 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d otos;..*outlen =
53f0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
5400: 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 s_len;. } els
5410: 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c e {..*out = NULL
5420: 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a ;..*outlen = 0;.
5430: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
5440: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
5450: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 }. return S
5460: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
5470: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a ;.}.#endif.../*.
5480: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54c0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 -----. *. * SNI
54d0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 Callback for Ser
54e0: 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 vers --. *. *.Pe
54f0: 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 64 rform server-sid
5500: 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 e SNI hostname s
5510: 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 20 72 election after r
5520: 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65 78 74 eceiving SNI ext
5530: 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 ension. *.in Cli
5540: 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 ent Hello. Calle
5550: 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 d after hello ca
5560: 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 6f 72 llback but befor
5570: 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e e ALPN callback.
5580: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
5590: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
55a0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
55b0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
55c0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
55d0: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 Return codes:.
55e0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
55f0: 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d _OK: SNI hostnam
5600: 65 20 69 73 20 61 63 63 65 70 74 65 64 2e 20 54 e is accepted. T
5610: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
5620: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f ntinues.. *.SSL_
5630: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 TLSEXT_ERR_ALERT
5640: 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 _FATAL: SNI host
5650: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 name is not acce
5660: 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 pted. The connec
5670: 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 tion. *. is a
5680: 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c 74 20 borted. Default
5690: 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 53 4c for alert is SSL
56a0: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 _AD_UNRECOGNIZED
56b0: 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c _NAME.. *.SSL_TL
56c0: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 SEXT_ERR_ALERT_W
56d0: 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 ARNING: SNI host
56e0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 name is not acce
56f0: 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c pted, warning al
5700: 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 ert. *. sent
5710: 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 (not supported i
5720: 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 n TLSv1.3). The
5730: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
5740: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
5750: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 EXT_ERR_NOACK: S
5760: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e NI hostname is n
5770: 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64 20 ot accepted and
5780: 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 not acknowledged
5790: 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 ,. *. e.g. if
57a0: 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65 SNI has not bee
57b0: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 n configured. Th
57c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
57d0: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d tinues.. *. *---
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5820: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
5830: 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 SNICallback(cons
5840: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 t SSL *ssl, int
5850: 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 *alert, void *ar
5860: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a g) {. State *
5870: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
5880: 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f e*)arg;. Tcl_
5890: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d Interp *interp.=
58a0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
58b0: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p;. Tcl_Obj *
58c0: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 cmdPtr;. int
58d0: 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 code, res;. c
58e0: 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 20 har *servername
58f0: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 = NULL;.. dpr
5900: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
5910: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 . if (ssl ==
5920: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e NULL || arg == N
5930: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
5940: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
5950: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ACK;. }..
5960: 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f /* Only works fo
5970: 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20 65 61 r TLS 1.2 and ea
5980: 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73 65 72 rlier */. ser
5990: 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 vername = SSL_ge
59a0: 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c t_servername(ssl
59b0: 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 , TLSEXT_NAMETYP
59c0: 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 E_host_name);.
59d0: 20 20 69 66 20 28 21 73 65 72 76 65 72 6e 61 6d if (!servernam
59e0: 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b e || servername[
59f0: 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72 0] == '\0') {..r
5a00: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
5a10: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
5a20: 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
5a30: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 Ptr->vcmd == (Tc
5a40: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
5a50: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
5a60: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a T_ERR_OK;. }.
5a70: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
5a80: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a ommand to eval *
5a90: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
5aa0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
5ab0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
5ac0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
5ad0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
5ae0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
5af0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
5b00: 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 sni", -1));.
5b10: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
5b20: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
5b30: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
5b40: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 l_NewStringObj(T
5b50: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
5b60: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
5b70: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ), -1));. Tcl
5b80: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
5b90: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
5ba0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
5bb0: 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d ingObj(servernam
5bc0: 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f e , -1));.. /
5bd0: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
5be0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
5bf0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
5c00: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 cmdPtr);. if
5c10: 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c ((code = EvalCal
5c20: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
5c30: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 atePtr, cmdPtr))
5c40: 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 > 1) {..res = S
5c50: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
5c60: 45 52 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 ERT_WARNING;..*a
5c70: 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e lert = SSL_AD_UN
5c80: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b RECOGNIZED_NAME;
5c90: 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 /* Not supporte
5ca0: 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a d by TLS 1.3 */.
5cb0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
5cc0: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 ode == 1) {..res
5cd0: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 = SSL_TLSEXT_ER
5ce0: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 R_OK;. } else
5cf0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
5d00: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 SEXT_ERR_ALERT_F
5d10: 41 54 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 ATAL;..*alert =
5d20: 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 SSL_AD_UNRECOGNI
5d30: 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 ZED_NAME; /* Not
5d40: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c supported by TL
5d50: 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 S 1.3 */. }.
5d60: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
5d70: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
5d80: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c return res;.}..
5d90: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
5da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
5de0: 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 ClientHello Hand
5df0: 73 68 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 shake Callback f
5e00: 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a or Servers --. *
5e10: 0a 20 2a 09 55 73 65 64 20 62 79 20 73 65 72 76 . *.Used by serv
5e20: 65 72 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 er to examine th
5e30: 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e e server name in
5e40: 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 dication (SNI) e
5e50: 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 xtension. *.prov
5e60: 69 64 65 64 20 62 79 20 74 68 65 20 63 6c 69 65 ided by the clie
5e70: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 nt in order to s
5e80: 65 6c 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72 elect an appropr
5e90: 69 61 74 65 20 63 65 72 74 69 66 69 63 61 74 65 iate certificate
5ea0: 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 to. *.present,
5eb0: 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 and make other c
5ec0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a onfiguration adj
5ed0: 75 73 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e ustments relevan
5ee0: 74 20 74 6f 20 74 68 61 74 20 73 65 72 76 65 72 t to that server
5ef0: 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 . *.name and its
5f00: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 configuration.
5f10: 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77 This includes sw
5f20: 61 70 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61 apping out the a
5f30: 73 73 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c ssociated. *.SSL
5f40: 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f _CTX pointer, mo
5f50: 64 69 66 79 69 6e 67 20 74 68 65 20 73 65 72 76 difying the serv
5f60: 65 72 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72 er's list of per
5f70: 6d 69 74 74 65 64 20 54 4c 53 20 76 65 72 73 69 mitted TLS versi
5f80: 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 ons,. *.changing
5f90: 20 74 68 65 20 73 65 72 76 65 72 27 73 20 63 69 the server's ci
5fa0: 70 68 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73 pher list in res
5fb0: 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69 ponse to the cli
5fc0: 65 6e 74 27 73 20 63 69 70 68 65 72 20 6c 69 73 ent's cipher lis
5fd0: 74 2c 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 t, etc.. *.Calle
5fe0: 64 20 62 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 d before SNI and
5ff0: 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e ALPN callbacks.
6000: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
6010: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
6020: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
6030: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
6040: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
6050: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 Return codes:.
6060: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c *.SSL_CLIENT_HEL
6070: 4c 4f 5f 52 45 54 52 59 3a 20 73 75 73 70 65 6e LO_RETRY: suspen
6080: 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c d the handshake,
6090: 20 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 and the handsha
60a0: 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c ke function will
60b0: 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 return immediat
60c0: 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e ely. *.SSL_CLIEN
60d0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 T_HELLO_ERROR: f
60e0: 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 ailure, terminat
60f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 e connection. Se
6100: 74 20 61 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 t alert to error
6110: 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c code.. *.SSL_CL
6120: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 IENT_HELLO_SUCCE
6130: 53 53 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 SS: success. *.
6140: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
6150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6180: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
6190: 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 int.HelloCallbac
61a0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
61b0: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f , int *alert, vo
61c0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
61d0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
61e0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 (State*)arg;.
61f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
6200: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
6210: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
6220: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
6230: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b int code, res;
6240: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
6250: 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 *servername;.
6260: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
6270: 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a char *p;. siz
6280: 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 e_t len, remaini
6290: 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 ng;.. dprintf
62a0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
62b0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
62c0: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a cmd == (Tcl_Obj*
62d0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
62e0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
62f0: 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d O_SUCCESS;. }
6300: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d else if (ssl ==
6310: 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 (const SSL *)NU
6320: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f LL || arg == (vo
6330: 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 id *)NULL) {..re
6340: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
6350: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
6360: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e }.. /* Get n
6370: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 ames */. if (
6380: 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c !SSL_client_hell
6390: 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 o_get0_ext(ssl,
63a0: 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 TLSEXT_TYPE_serv
63b0: 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 er_name, &p, &re
63c0: 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 maining) || rema
63d0: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a ining <= 2) {..*
63e0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 alert = SSL_R_SS
63f0: 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 LV3_ALERT_ILLEGA
6400: 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 L_PARAMETER;..re
6410: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
6420: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
6430: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 }.. /* Extra
6440: 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 ct the length of
6450: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 the supplied li
6460: 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a st of names. */.
6470: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b len = (*(p++
6480: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e ) << 8);. len
6490: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 += *(p++);.
64a0: 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 if (len + 2 != r
64b0: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c emaining) {..*al
64c0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 ert = SSL_R_SSLV
64d0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 3_ALERT_ILLEGAL_
64e0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 PARAMETER;..retu
64f0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
6500: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
6510: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d . remaining =
6520: 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 len;.. /* Th
6530: 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 e list in practi
6540: 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 ce only has a si
6550: 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f ngle element, so
6560: 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 we only conside
6570: 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e r the first one.
6580: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 */. if (rema
6590: 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 ining == 0 || *p
65a0: 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d ++ != TLSEXT_NAM
65b0: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 ETYPE_host_name)
65c0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
65d0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
65e0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 NTERNAL_ERROR;..
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 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
6610: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
6620: 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f ng--;.. /* No
6630: 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 w we can finally
6640: 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 pull out the by
6650: 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 te array with th
6660: 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d e actual hostnam
6670: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 e. */. if (re
6680: 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a maining <= 2) {.
6690: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f .*alert = SSL_R_
66a0: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 TLSV1_ALERT_INTE
66b0: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 RNAL_ERROR;..ret
66c0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
66d0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
66e0: 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 }. len = (*(p
66f0: 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c ++) << 8);. l
6700: 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 en += *(p++);.
6710: 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 if (len + 2 >
6720: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 remaining) {..*a
6730: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 lert = SSL_R_TLS
6740: 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 V1_ALERT_INTERNA
6750: 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e L_ERROR;..return
6760: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6770: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 O_ERROR;. }.
6780: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c remaining = l
6790: 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 en;. serverna
67a0: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 me = (const char
67b0: 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 *)p;.. /* Cr
67c0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
67d0: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 eval */. cmdP
67e0: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
67f0: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
6800: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
6810: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
6820: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
6830: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
6840: 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 gObj("hello", -1
6850: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
6860: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
6870: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
6880: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
6890: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 ingObj(Tcl_GetCh
68a0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
68b0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b tr->self), -1));
68c0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
68d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
68e0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
68f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 l_NewStringObj(s
6900: 65 72 76 65 72 6e 61 6d 65 2c 20 28 69 6e 74 29 ervername, (int)
6910: 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 len));.. /*
6920: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
6930: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
6940: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
6950: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 dPtr);. if ((
6960: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 code = EvalCallb
6970: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
6980: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e ePtr, cmdPtr)) >
6990: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 1) {..res = SSL
69a0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 _CLIENT_HELLO_RE
69b0: 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 TRY;..*alert = S
69c0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 SL_R_TLSV1_ALERT
69d0: 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b _USER_CANCELLED;
69e0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
69f0: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 code == 1) {..re
6a00: 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 s = SSL_CLIENT_H
6a10: 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 ELLO_SUCCESS;.
6a20: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 } else {..res
6a30: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c = SSL_CLIENT_HEL
6a40: 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 LO_ERROR;..*aler
6a50: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f t = SSL_R_TLSV1_
6a60: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 ALERT_INTERNAL_E
6a70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
6a80: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
6a90: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 (cmdPtr);. re
6aa0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a turn res;.}.../*
6ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6ac0: 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 ***/./* Commands
6ad0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a */./***
6ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6af0: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d */../*. *-------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
6b40: 20 2a 20 48 61 73 68 20 43 61 6c 63 20 2d 2d 0a * Hash Calc --.
6b50: 20 2a 0a 20 2a 09 43 61 6c 63 75 6c 61 74 65 20 *. *.Calculate
6b60: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f message digest o
6b70: 66 20 64 61 74 61 20 75 73 69 6e 67 20 74 79 70 f data using typ
6b80: 65 20 68 61 73 68 20 61 6c 67 6f 72 69 74 68 6d e hash algorithm
6b90: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
6ba0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
6bb0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
6bc0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
6bd0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c20: 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73 68 43 61 6c . */.int.HashCal
6c30: 63 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e c(Tcl_Interp *in
6c40: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
6c50: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
6c60: 62 6a 76 5b 5d 2c 20 63 6f 6e 73 74 20 45 56 50 bjv[], const EVP
6c70: 5f 4d 44 20 2a 74 79 70 65 29 20 7b 0a 20 20 20 _MD *type) {.
6c80: 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 20 char *data;.
6c90: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75 6e int len;. un
6ca0: 73 69 67 6e 65 64 20 69 6e 74 20 6d 64 6c 65 6e signed int mdlen
6cb0: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ;. unsigned c
6cc0: 68 61 72 20 6d 64 62 75 66 5b 45 56 50 5f 4d 41 har mdbuf[EVP_MA
6cd0: 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 X_MD_SIZE];.
6ce0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 65 78 20 const char *hex
6cf0: 3d 20 22 30 31 32 33 34 35 36 37 38 39 41 42 43 = "0123456789ABC
6d00: 44 45 46 22 3b 0a 0a 20 20 20 20 69 66 20 28 6f DEF";.. if (o
6d10: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
6d20: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
6d30: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
6d40: 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e 20 data");..return
6d50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
6d60: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 61 74 .. /* Get dat
6d70: 61 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d 20 a */. data =
6d80: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 Tcl_GetByteArray
6d90: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
6da0: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 &len);. if (
6db0: 64 61 74 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 data == NULL ||
6dc0: 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c len == 0) {..Tcl
6dd0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
6de0: 70 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20 4e 55 p, "No data", NU
6df0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
6e00: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
6e10: 20 20 20 2f 2a 20 43 61 6c 63 20 68 61 73 68 20 /* Calc hash
6e20: 76 61 6c 75 65 2c 20 63 72 65 61 74 65 20 68 65 value, create he
6e30: 78 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e x representation
6e40: 2c 20 61 6e 64 20 77 72 69 74 65 20 74 6f 20 72 , and write to r
6e50: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 69 66 20 esult */. if
6e60: 28 45 56 50 5f 44 69 67 65 73 74 28 64 61 74 61 (EVP_Digest(data
6e70: 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 , (size_t) len,
6e80: 6d 64 62 75 66 2c 20 26 6d 64 6c 65 6e 2c 20 74 mdbuf, &mdlen, t
6e90: 79 70 65 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09 54 ype, NULL)) {..T
6ea0: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 cl_Obj *resultOb
6eb0: 6a 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 j;..unsigned cha
6ec0: 72 20 2a 70 74 72 3b 0a 09 72 65 73 75 6c 74 4f r *ptr;..resultO
6ed0: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 bj = Tcl_NewObj(
6ee0: 29 3b 0a 09 70 74 72 20 3d 20 54 63 6c 5f 53 65 );..ptr = Tcl_Se
6ef0: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 tByteArrayLength
6f00: 28 72 65 73 75 6c 74 4f 62 6a 2c 20 6d 64 6c 65 (resultObj, mdle
6f10: 6e 2a 32 29 3b 0a 0a 09 66 6f 72 20 28 75 6e 73 n*2);...for (uns
6f20: 69 67 6e 65 64 20 69 6e 74 20 69 20 3d 20 30 3b igned int i = 0;
6f30: 20 69 20 3c 20 6d 64 6c 65 6e 3b 20 69 2b 2b 29 i < mdlen; i++)
6f40: 20 7b 0a 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d {.. *ptr++ =
6f50: 20 68 65 78 5b 28 6d 64 62 75 66 5b 69 5d 20 3e hex[(mdbuf[i] >
6f60: 3e 20 34 29 20 26 20 30 78 30 46 5d 3b 0a 09 20 > 4) & 0x0F];..
6f70: 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b *ptr++ = hex[
6f80: 6d 64 62 75 66 5b 69 5d 20 26 20 30 78 30 46 5d mdbuf[i] & 0x0F]
6f90: 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 4f 62 6a ;..}..Tcl_SetObj
6fa0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 Result(interp, r
6fb0: 65 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 7d esultObj);. }
6fc0: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 53 65 74 else {..Tcl_Set
6fd0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
6fe0: 48 61 73 68 20 63 61 6c 63 75 6c 61 74 69 6f 6e Hash calculation
6ff0: 20 65 72 72 6f 72 22 2c 20 4e 55 4c 4c 29 3b 0a error", NULL);.
7000: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7010: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 R;. }. ret
7020: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f urn TCL_OK;.}../
7030: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
7040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7070: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 -------. *. * Ha
7080: 73 68 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 sh Commands --.
7090: 2a 0a 20 2a 09 52 65 74 75 72 6e 20 74 68 65 20 *. *.Return the
70a0: 64 69 67 65 73 74 20 61 73 20 61 20 68 65 78 20 digest as a hex
70b0: 73 74 72 69 6e 67 20 66 6f 72 20 64 61 74 61 20 string for data
70c0: 75 73 69 6e 67 20 74 79 70 65 20 6d 65 73 73 61 using type messa
70d0: 67 65 20 64 69 67 65 73 74 2e 0a 20 2a 0a 20 2a ge digest.. *. *
70e0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
70f0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
7100: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
7110: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
7120: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
7130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 69 ---------. */.Di
7170: 67 65 73 74 43 6d 64 28 43 6c 69 65 6e 74 44 61 gestCmd(ClientDa
7180: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
7190: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
71a0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
71b0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
71c0: 5b 5d 29 20 7b 0a 20 20 20 20 69 6e 74 20 6c 65 []) {. int le
71d0: 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 n;. const cha
71e0: 72 20 2a 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e r *name;. con
71f0: 73 74 20 45 56 50 5f 4d 44 20 2a 74 79 70 65 3b st EVP_MD *type;
7200: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
7210: 3d 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 3) {..Tcl_Wron
7220: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
7230: 20 31 2c 20 6f 62 6a 76 2c 20 22 74 79 70 65 20 1, objv, "type
7240: 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e 20 data");..return
7250: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7260: 0a 0a 20 20 20 20 6e 61 6d 65 20 3d 20 54 63 6c .. name = Tcl
7270: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
7280: 6a 28 6f 62 6a 76 5b 31 5d 2c 26 6c 65 6e 29 3b j(objv[1],&len);
7290: 0a 20 20 20 20 69 66 20 28 6e 61 6d 65 20 3d 3d . if (name ==
72a0: 20 4e 55 4c 4c 20 7c 7c 20 28 74 79 70 65 20 3d NULL || (type =
72b0: 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74 62 EVP_get_digestb
72c0: 79 6e 61 6d 65 28 6e 61 6d 65 29 29 20 3d 3d 20 yname(name)) ==
72d0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
72e0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
72f0: 2c 20 22 49 6e 76 61 6c 69 64 20 64 69 67 65 73 , "Invalid diges
7300: 74 20 74 79 70 65 20 5c 22 22 2c 20 6e 61 6d 65 t type \"", name
7310: 2c 20 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 , "\"", NULL);..
7320: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7330: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 62 6a 63 ;. }. objc
7340: 2d 2d 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a --;. objv++;.
7350: 20 20 20 20 72 65 74 75 72 6e 20 48 61 73 68 43 return HashC
7360: 61 6c 63 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 alc(interp, objc
7370: 2c 20 6f 62 6a 76 2c 20 74 79 70 65 29 3b 0a 7d , objv, type);.}
7380: 0a 0a 2f 2a 0a 20 2a 20 43 6f 6d 6d 61 6e 64 20 ../*. * Command
7390: 74 6f 20 43 61 6c 63 75 6c 61 74 65 20 4d 44 34 to Calculate MD4
73a0: 20 4d 65 73 73 61 67 65 20 44 69 67 65 73 74 0a Message Digest.
73b0: 20 2a 2f 0a 69 6e 74 0a 44 69 67 65 73 74 4d 44 */.int.DigestMD
73c0: 34 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 4Cmd(ClientData
73d0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
73e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
73f0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
7400: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
7410: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 48 61 {. return Ha
7420: 73 68 43 61 6c 63 28 69 6e 74 65 72 70 2c 20 6f shCalc(interp, o
7430: 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d bjc, objv, EVP_m
7440: 64 34 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 d4());.}../*. *
7450: 43 6f 6d 6d 61 6e 64 20 74 6f 20 43 61 6c 63 75 Command to Calcu
7460: 6c 61 74 65 20 4d 44 35 20 4d 65 73 73 61 67 65 late MD5 Message
7470: 20 44 69 67 65 73 74 0a 20 2a 2f 0a 69 6e 74 0a Digest. */.int.
7480: 44 69 67 65 73 74 4d 44 35 43 6d 64 28 43 6c 69 DigestMD5Cmd(Cli
7490: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
74a0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
74b0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
74c0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
74d0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 objv[]) {. r
74e0: 65 74 75 72 6e 20 48 61 73 68 43 61 6c 63 28 69 eturn HashCalc(i
74f0: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a nterp, objc, obj
7500: 76 2c 20 45 56 50 5f 6d 64 35 28 29 29 3b 0a 7d v, EVP_md5());.}
7510: 0a 0a 2f 2a 0a 20 2a 20 43 6f 6d 6d 61 6e 64 20 ../*. * Command
7520: 74 6f 20 43 61 6c 63 75 6c 61 74 65 20 53 48 41 to Calculate SHA
7530: 2d 31 20 48 61 73 68 0a 20 2a 2f 0a 69 6e 74 0a -1 Hash. */.int.
7540: 44 69 67 65 73 74 53 48 41 31 43 6d 64 28 43 6c DigestSHA1Cmd(Cl
7550: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
7560: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
7570: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
7580: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
7590: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
75a0: 72 65 74 75 72 6e 20 48 61 73 68 43 61 6c 63 28 return HashCalc(
75b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 interp, objc, ob
75c0: 6a 76 2c 20 45 56 50 5f 73 68 61 31 28 29 29 3b jv, EVP_sha1());
75d0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43 6f 6d 6d 61 6e .}../*. * Comman
75e0: 64 20 74 6f 20 43 61 6c 63 75 6c 61 74 65 20 53 d to Calculate S
75f0: 48 41 32 20 53 48 41 2d 32 35 36 20 48 61 73 68 HA2 SHA-256 Hash
7600: 0a 20 2a 2f 0a 69 6e 74 0a 44 69 67 65 73 74 53 . */.int.DigestS
7610: 48 41 32 35 36 43 6d 64 28 43 6c 69 65 6e 74 44 HA256Cmd(ClientD
7620: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
7630: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
7640: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
7650: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
7660: 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 v[]) {. retur
7670: 6e 20 48 61 73 68 43 61 6c 63 28 69 6e 74 65 72 n HashCalc(inter
7680: 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 p, objc, objv, E
7690: 56 50 5f 73 68 61 32 35 36 28 29 29 3b 0a 7d 0a VP_sha256());.}.
76a0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
76b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
76f0: 48 61 73 68 20 4c 69 73 74 20 43 6f 6d 6d 61 6e Hash List Comman
7700: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 d --. *. *.Retur
7710: 6e 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 n a list of all
7720: 76 61 6c 69 64 20 68 61 73 68 20 61 6c 67 6f 72 valid hash algor
7730: 69 74 68 6d 73 20 6f 72 20 6d 65 73 73 61 67 65 ithms or message
7740: 20 64 69 67 65 73 74 73 2e 0a 20 2a 0a 20 2a 20 digests.. *. *
7750: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
7760: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
7770: 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 t list.. *. * Si
7780: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
7790: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
77a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
77b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
77c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
77d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
77e0: 2f 0a 76 6f 69 64 20 4c 69 73 74 43 61 6c 6c 62 /.void ListCallb
77f0: 61 63 6b 28 63 6f 6e 73 74 20 4f 42 4a 5f 4e 41 ack(const OBJ_NA
7800: 4d 45 20 2a 6f 62 6a 2c 20 76 6f 69 64 20 2a 61 ME *obj, void *a
7810: 72 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 rg) {. Tcl_Ob
7820: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 28 54 63 6c j *objPtr = (Tcl
7830: 5f 4f 62 6a 20 2a 29 20 61 72 67 3b 0a 20 20 20 _Obj *) arg;.
7840: 20 69 66 20 28 31 20 7c 7c 20 21 6f 62 6a 2d 3e if (1 || !obj->
7850: 61 6c 69 61 73 29 20 7b 0a 09 2f 2a 20 46 69 6c alias) {../* Fil
7860: 74 65 72 20 6f 75 74 20 73 69 67 6e 65 64 20 64 ter out signed d
7870: 69 67 65 73 74 73 20 28 61 2e 6b 2e 61 20 73 69 igests (a.k.a si
7880: 67 6e 61 74 75 72 65 20 61 6c 67 6f 72 69 74 68 gnature algorith
7890: 6d 73 29 20 2a 2f 0a 09 69 66 20 28 73 74 72 73 ms) */..if (strs
78a0: 74 72 28 6f 62 6a 2d 3e 6e 61 6d 65 2c 20 22 72 tr(obj->name, "r
78b0: 73 61 22 29 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 sa") == NULL &&
78c0: 73 74 72 73 74 72 28 6f 62 6a 2d 3e 6e 61 6d 65 strstr(obj->name
78d0: 2c 20 22 52 53 41 22 29 20 3d 3d 20 4e 55 4c 4c , "RSA") == NULL
78e0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
78f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
7900: 74 28 4e 55 4c 4c 2c 20 6f 62 6a 50 74 72 2c 20 t(NULL, objPtr,
7910: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
7920: 28 6f 62 6a 2d 3e 6e 61 6d 65 2c 2d 31 29 29 3b (obj->name,-1));
7930: 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6e 74 ..}. }.}..int
7940: 0a 44 69 67 65 73 74 4c 69 73 74 43 6d 64 28 43 .DigestListCmd(C
7950: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
7960: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
7970: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
7980: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
7990: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
79a0: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
79b0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
79c0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 j(0, NULL);..#if
79d0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
79e0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
79f0: 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 0000L. OpenSS
7a00: 4c 5f 61 64 64 5f 61 6c 6c 5f 64 69 67 65 73 74 L_add_all_digest
7a10: 73 28 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 s(); /* Make sur
7a20: 65 20 74 68 65 79 27 72 65 20 6c 6f 61 64 65 64 e they're loaded
7a30: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 */.#endif..
7a40: 4f 42 4a 5f 4e 41 4d 45 5f 64 6f 5f 61 6c 6c 28 OBJ_NAME_do_all(
7a50: 4f 42 4a 5f 4e 41 4d 45 5f 54 59 50 45 5f 4d 44 OBJ_NAME_TYPE_MD
7a60: 5f 4d 45 54 48 2c 20 4c 69 73 74 43 61 6c 6c 62 _METH, ListCallb
7a70: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 20 6f 62 ack, (void *) ob
7a80: 6a 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 jPtr);. Tcl_R
7a90: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 esetResult(inter
7aa0: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f p);. Tcl_SetO
7ab0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
7ac0: 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 objPtr);.. r
7ad0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
7ae0: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
7af0: 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 ntData;..objc =
7b00: 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 objc;..objv = ob
7b10: 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 56 61 jv;.}.../*. * Va
7b20: 6c 69 64 20 53 53 4c 20 61 6e 64 20 54 4c 53 20 lid SSL and TLS
7b30: 50 72 6f 74 6f 63 6f 6c 20 56 65 72 73 69 6f 6e Protocol Version
7b40: 73 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e s. */.static con
7b50: 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f st char *protoco
7b60: 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 ls[] = {.."ssl2"
7b70: 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 , "ssl3", "tls1"
7b80: 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 , "tls1.1", "tls
7b90: 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 1.2", "tls1.3",
7ba0: 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f NULL.};.enum pro
7bb0: 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f tocol {. TLS_
7bc0: 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 SSL2, TLS_SSL3,
7bd0: 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c TLS_TLS1, TLS_TL
7be0: 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 S1_1, TLS_TLS1_2
7bf0: 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c , TLS_TLS1_3, TL
7c00: 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 2f 2a 0a 20 2a S_NONE.};../*. *
7c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c50: 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 ---. *. * Cipher
7c60: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 sObjCmd -- list
7c70: 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 available cipher
7c80: 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f s. *. *.This pro
7c90: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
7ca0: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 d to process the
7cb0: 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 "tls::ciphers"
7cc0: 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 command. *.to li
7cd0: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 st available cip
7ce0: 68 65 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e hers, based upon
7cf0: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 protocol select
7d00: 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ed.. *. * Result
7d10: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
7d20: 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 Tcl result list
7d30: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
7d40: 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 ects:. *.constru
7d50: 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73 cts and destroys
7d60: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 SSL context (CT
7d70: 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d X). *. *--------
7d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
7dc0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 .static int.Ciph
7dd0: 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 ersObjCmd(Client
7de0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
7df0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
7e00: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
7e10: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
7e20: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
7e30: 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 Obj *objPtr = NU
7e40: 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 LL;. SSL_CTX
7e50: 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *ctx = NULL;.
7e60: 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c SSL *ssl = NULL
7e70: 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 ;. STACK_OF(S
7e80: 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a SL_CIPHER) *sk;.
7e90: 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 char *cp, bu
7ea0: 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 f[BUFSIZ];. i
7eb0: 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 nt index, verbos
7ec0: 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f e = 0, use_suppo
7ed0: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f rted = 0;. co
7ee0: 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a nst SSL_METHOD *
7ef0: 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 method;.. dpr
7f00: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
7f10: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c . if ((objc <
7f20: 20 31 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 1) || (objc > 4
7f30: 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e )) {..Tcl_WrongN
7f40: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
7f50: 2c 20 6f 62 6a 76 2c 20 22 3f 70 72 6f 74 6f 63 , objv, "?protoc
7f60: 6f 6c 3f 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 ol? ?verbose? ?s
7f70: 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 upported?");..re
7f80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7f90: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6f 62 }. if (ob
7fa0: 6a 63 20 3d 3d 20 31 29 20 7b 0a 09 2f 2a 20 4c jc == 1) {../* L
7fb0: 69 73 74 20 61 6c 6c 20 63 69 70 68 65 72 73 20 ist all ciphers
7fc0: 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a */..Tcl_Obj *obj
7fd0: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
7fe0: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a tObj(0, NULL);..
7ff0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
8000: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
8010: 30 31 30 30 30 30 30 4c 0a 09 4f 70 65 6e 53 53 0100000L..OpenSS
8020: 4c 5f 61 64 64 5f 61 6c 6c 5f 63 69 70 68 65 72 L_add_all_cipher
8030: 73 28 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 s(); /* Make sur
8040: 65 20 74 68 65 79 27 72 65 20 6c 6f 61 64 65 64 e they're loaded
8050: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 09 4f 42 4a */.#endif...OBJ
8060: 5f 4e 41 4d 45 5f 64 6f 5f 61 6c 6c 28 4f 42 4a _NAME_do_all(OBJ
8070: 5f 4e 41 4d 45 5f 54 59 50 45 5f 43 49 50 48 45 _NAME_TYPE_CIPHE
8080: 52 5f 4d 45 54 48 2c 20 4c 69 73 74 43 61 6c 6c R_METH, ListCall
8090: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 20 6f back, (void *) o
80a0: 62 6a 50 74 72 29 3b 0a 09 54 63 6c 5f 52 65 73 bjPtr);..Tcl_Res
80b0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 etResult(interp)
80c0: 3b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 ;..Tcl_SetObjRes
80d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ult(interp, objP
80e0: 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c tr);..return TCL
80f0: 5f 4f 4b 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 _OK;.. } else
8100: 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 if (Tcl_GetInde
8110: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c xFromObj(interp,
8120: 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 objv[1], protoc
8130: 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c ols, "protocol",
8140: 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 0, &index) != T
8150: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
8160: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8170: 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 }. if ((objc
8180: 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 > 2) && Tcl_GetB
8190: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e ooleanFromObj(in
81a0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 terp, objv[2], &
81b0: 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f verbose) != TCL_
81c0: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
81d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
81e0: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 if ((objc > 3
81f0: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c ) && Tcl_GetBool
8200: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 eanFromObj(inter
8210: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 p, objv[3], &use
8220: 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 _supported) != T
8230: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
8240: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8250: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
8260: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 _error();.. s
8270: 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f witch ((enum pro
8280: 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 tocol)index) {..
8290: 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 case TLS_SSL2:.#
82a0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
82b0: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 ON_NUMBER >= 0x1
82c0: 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 0100000L || defi
82d0: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 ned(NO_SSL2) ||
82e0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
82f0: 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 NO_SSL2).. Tc
8300: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
8310: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
8320: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
8330: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
8340: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
8350: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
8360: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 R;.#else.. me
8370: 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 thod = SSLv2_met
8380: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 hod(); break;.#e
8390: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 ndif..case TLS_S
83a0: 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 SL3:.#if defined
83b0: 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 (NO_SSL3) || def
83c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
83d0: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL3) || defined
83e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
83f0: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 _METHOD).. Tc
8400: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
8410: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
8420: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
8430: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
8440: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
8450: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
8460: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 R;.#else.. me
8470: 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 thod = SSLv3_met
8480: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 hod(); break;.#e
8490: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
84a0: 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 LS1:.#if defined
84b0: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 (NO_TLS1) || def
84c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
84d0: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 TLS1) || defined
84e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
84f0: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 _METHOD).. Tc
8500: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
8510: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
8520: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
8530: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
8540: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
8550: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
8560: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 R;.#else.. me
8570: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 thod = TLSv1_met
8580: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 hod(); break;.#e
8590: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
85a0: 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e LS1_1:.#if defin
85b0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
85c0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
85d0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 _NO_TLS1_1) || d
85e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
85f0: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 O_TLS1_1_METHOD)
8600: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
8610: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
8620: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
8630: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
8640: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
8650: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
8660: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
8670: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 .. method = T
8680: 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b LSv1_1_method();
8690: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
86a0: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a case TLS_TLS1_2:
86b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
86c0: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e TLS1_2) || defin
86d0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
86e0: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_2) || defined
86f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
8700: 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 _2_METHOD)..
8710: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
8720: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
8730: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
8740: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
8750: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 rted", NULL);..
8760: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
8770: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
8780: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 method = TLSv1_2
8790: 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b _method(); break
87a0: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 ;.#endif..case T
87b0: 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 LS_TLS1_3:.#if d
87c0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
87d0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
87e0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
87f0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
8800: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
8810: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
8820: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
8830: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
8840: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
8850: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
8860: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c . method = TL
8870: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 S_method();..
8880: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e SSL_CTX_set_min
8890: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
88a0: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 tx, TLS1_3_VERSI
88b0: 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 ON);.. SSL_CT
88c0: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f X_set_max_proto_
88d0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 version(ctx, TLS
88e0: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 1_3_VERSION);..
88f0: 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 break;.#endif
8900: 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 ..default:..
8910: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 method = TLS_met
8920: 68 6f 64 28 29 3b 0a 09 20 20 20 20 62 72 65 61 hod();.. brea
8930: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 74 k;. }.. ct
8940: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 x = SSL_CTX_new(
8950: 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 method);. if
8960: 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ctx == NULL) {.
8970: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
8980: 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e t(interp, REASON
8990: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 (), NULL);..retu
89a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
89b0: 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 }.. ssl = S
89c0: 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 SL_new(ctx);.
89d0: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
89e0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
89f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 esult(interp, RE
8a00: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 ASON(), NULL);..
8a10: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
8a20: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
8a30: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
8a40: 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 /* Use list and
8a50: 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 order as would
8a60: 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 be sent in a Cli
8a70: 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 entHello or all
8a80: 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 available cipher
8a90: 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 s */. if (use
8aa0: 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 _supported) {..s
8ab0: 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 k = SSL_get1_sup
8ac0: 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 ported_ciphers(s
8ad0: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 sl);. } else
8ae0: 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f {..sk = SSL_get_
8af0: 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 ciphers(ssl);.
8b00: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 }.. if (sk
8b10: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 != NULL) {..if (
8b20: 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 !verbose) {..
8b30: 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 objPtr = Tcl_Ne
8b40: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
8b50: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 );.. for (int
8b60: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 i = 0; i < sk_S
8b70: 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b SL_CIPHER_num(sk
8b80: 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 ); i++) {...cons
8b90: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 t SSL_CIPHER *c
8ba0: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f = sk_SSL_CIPHER_
8bb0: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 value(sk, i);...
8bc0: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 if (c == NULL) c
8bd0: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 ontinue;..../* c
8be0: 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e ipher name or (N
8bf0: 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 ONE) */...cp = S
8c00: 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 SL_CIPHER_get_na
8c10: 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 me(c);...if (cp
8c20: 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a == NULL) break;.
8c30: 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
8c40: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
8c50: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
8c60: 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 ewStringObj(cp,
8c70: 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d -1));.. }...}
8c80: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a else {.. obj
8c90: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 Ptr = Tcl_NewStr
8ca0: 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 ingObj("",0);..
8cb0: 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 for (int i =
8cc0: 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 0; i < sk_SSL_CI
8cd0: 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b PHER_num(sk); i+
8ce0: 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c +) {...const SSL
8cf0: 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f _CIPHER *c = sk_
8d00: 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 SSL_CIPHER_value
8d10: 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 (sk, i);...if (c
8d20: 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e == NULL) contin
8d30: 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 ue;..../* textua
8d40: 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 l description of
8d50: 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 the cipher */..
8d60: 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f .if (SSL_CIPHER_
8d70: 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 description(c, b
8d80: 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 uf, sizeof(buf))
8d90: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 != NULL) {...
8da0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 Tcl_AppendToOb
8db0: 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 j(objPtr, buf, (
8dc0: 54 63 6c 5f 53 69 7a 65 29 20 73 74 72 6c 65 6e Tcl_Size) strlen
8dd0: 28 62 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 (buf));...} else
8de0: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 {... Tcl_App
8df0: 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c endToObj(objPtr,
8e00: 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 "UNKNOWN\n", 8)
8e10: 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a ;...}.. }..}.
8e20: 09 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 .if (use_support
8e30: 65 64 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 ed) {.. sk_SS
8e40: 4c 5f 43 49 50 48 45 52 5f 66 72 65 65 28 73 6b L_CIPHER_free(sk
8e50: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 );..}. }.
8e60: 53 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 SSL_free(ssl);.
8e70: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 SSL_CTX_free(
8e80: 63 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 ctx);.. Tcl_R
8e90: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 esetResult(inter
8ea0: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f p);. Tcl_SetO
8eb0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
8ec0: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 objPtr);. re
8ed0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c turn TCL_OK;..cl
8ee0: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e ientData = clien
8ef0: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a tData;.}.../*. *
8f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f40: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 ---. *. * Protoc
8f50: 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 olsObjCmd -- lis
8f60: 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 t available prot
8f70: 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 ocols. *. *.This
8f80: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
8f90: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 voked to process
8fa0: 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f the "tls::proto
8fb0: 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a cols" command. *
8fc0: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 .to list availab
8fd0: 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a le protocols.. *
8fe0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
8ff0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
9000: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 esult list.. *.
9010: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
9020: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.none. *. *---
9030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9070: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
9080: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 ProtocolsObjCmd(
9090: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
90a0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
90b0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
90c0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
90d0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
90e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
90f0: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 r;.. dprintf(
9100: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
9110: 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b if (objc != 1) {
9120: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
9130: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
9140: 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e jv, "");..return
9150: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
9160: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
9170: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f _error();.. o
9180: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
9190: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
91a0: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
91b0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
91c0: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
91d0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
91e0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
91f0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
9200: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
9210: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
9220: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
9230: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
9240: 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 cols[TLS_SSL2],
9250: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 -1));.#endif.#if
9260: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
9270: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
9280: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 PENSSL_NO_SSL3)
9290: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
92a0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 SSL_NO_SSL3_METH
92b0: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 OD). Tcl_List
92c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
92d0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
92e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
92f0: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
9300: 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e SSL3], -1));.#en
9310: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
9320: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 (NO_TLS1) && !de
9330: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
9340: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e _TLS1) && !defin
9350: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
9360: 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 S1_METHOD). T
9370: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
9380: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
9390: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
93a0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
93b0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 ls[TLS_TLS1], -1
93c0: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
93d0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
93e0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
93f0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
9400: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
9410: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f ENSSL_NO_TLS1_1_
9420: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f METHOD). Tcl_
9430: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
9440: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
9450: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
9460: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
9470: 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 TLS_TLS1_1], -1)
9480: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
9490: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
94a0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
94b0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
94c0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
94d0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d NSSL_NO_TLS1_2_M
94e0: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c ETHOD). Tcl_L
94f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
9500: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
9510: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
9520: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
9530: 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 LS_TLS1_2], -1))
9540: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
9550: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
9560: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
9570: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
9580: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
9590: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
95a0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
95b0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
95c0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
95d0: 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 _3], -1));.#endi
95e0: 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 f.. Tcl_SetOb
95f0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
9600: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 objPtr);. ret
9610: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
9620: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
9630: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
9640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9680: 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e --. *. * Version
9690: 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e ObjCmd -- return
96a0: 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 version string
96b0: 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a from OpenSSL.. *
96c0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
96d0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
96e0: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
96f0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
9700: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
9710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
9750: 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 .static int.Vers
9760: 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 ionObjCmd(Client
9770: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
9780: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
9790: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
97a0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
97b0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
97c0: 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 Obj *objPtr;..
97d0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
97e0: 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 d");.. objPtr
97f0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 = Tcl_NewString
9800: 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 Obj(OPENSSL_VERS
9810: 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 ION_TEXT, -1);.
9820: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
9830: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ult(interp, objP
9840: 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e tr);.. return
9850: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
9860: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
9870: 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b a;..objc = objc;
9880: 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d ..objv = objv;.}
9890: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
98a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
98e0: 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d * HandshakeObjCm
98f0: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 d --. *. *.This
9900: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 command is used
9910: 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 68 65 to verify whethe
9920: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 r the handshake
9930: 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f is complete. *.o
9940: 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 r not.. *. * Res
9950: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
9960: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 ard Tcl result.
9970: 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 1 means handshak
9980: 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 e complete, 0 me
9990: 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a ans pending.. *.
99a0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
99b0: 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 . *.May force SS
99c0: 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f L negotiation to
99d0: 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a take place.. *.
99e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
99f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9a20: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
9a30: 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 int HandshakeOb
9a40: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
9a50: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
9a60: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
9a70: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
9a80: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
9a90: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e {. Tcl_Chann
9aa0: 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 el chan;
9ab0: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 /* The channel t
9ac0: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e o set a mode on.
9ad0: 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 */. State *s
9ae0: 74 61 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 tatePtr;
9af0: 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 /* client state
9b00: 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a for ssl socket *
9b10: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 /. const char
9b20: 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b *errStr = NULL;
9b30: 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 . int ret = 1
9b40: 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 ;. int err =
9b50: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
9b60: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
9b70: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b if (objc != 2) {
9b80: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
9b90: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
9ba0: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a jv, "channel");.
9bb0: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f .return(TCL_ERRO
9bc0: 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 R);. }.. E
9bd0: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
9be0: 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 ;.. chan = Tc
9bf0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
9c00: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 erp, Tcl_GetStri
9c10: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 ngFromObj(objv[1
9c20: 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b ], NULL), NULL);
9c30: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
9c40: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
9c50: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 ULL) {..return(T
9c60: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
9c70: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
9c80: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
9c90: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
9ca0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
9cb0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
9cc0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
9cd0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
9ce0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
9cf0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
9d00: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
9d10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
9d20: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
9d30: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
9d40: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 ame(chan),..
9d50: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
9d60: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a hannel", NULL);.
9d70: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
9d80: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
9d90: 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 43 "HANDSHAKE", "C
9da0: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
9db0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
9dc0: 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f L);..return(TCL_
9dd0: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20 ERROR);. }.
9de0: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 statePtr = (St
9df0: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 ate *)Tcl_GetCha
9e00: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
9e10: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 (chan);.. dpr
9e20: 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c intf("Calling Tl
9e30: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
9e40: 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c ");. ret = Tl
9e50: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
9e60: 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c (statePtr, &err,
9e70: 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 1);. dprintf
9e80: 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e ("Tls_WaitForCon
9e90: 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25 nect returned: %
9ea0: 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 i", ret);.. i
9eb0: 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 28 28 f (ret < 0 && ((
9ec0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
9ed0: 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 & TLS_TCL_ASYNC)
9ee0: 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41 && (err == EAGA
9ef0: 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 IN))) {..dprintf
9f00: 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 ("Async set and
9f10: 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a err = EAGAIN");.
9f20: 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 .ret = 0;. }
9f30: 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20 30 else if (ret < 0
9f40: 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 6c 74 ) {..long result
9f50: 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 ;..errStr = stat
9f60: 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f ePtr->err;..Tcl_
9f70: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 ResetResult(inte
9f80: 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 rp);..Tcl_SetErr
9f90: 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 no(err);...if (!
9fa0: 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 errStr || (*errS
9fb0: 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 tr == 0)) {..
9fc0: 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f errStr = Tcl_Po
9fd0: 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 sixError(interp)
9fe0: 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e ;..}...Tcl_Appen
9ff0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
a000: 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 "handshake faile
a010: 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 d: ", errStr, (c
a020: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 69 har *) NULL);..i
a030: 66 20 28 28 72 65 73 75 6c 74 20 3d 20 53 53 4c f ((result = SSL
a040: 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 _get_verify_resu
a050: 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c lt(statePtr->ssl
a060: 29 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 )) != X509_V_OK)
a070: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
a080: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
a090: 20 22 20 64 75 65 20 74 6f 3a 20 22 2c 20 58 35 " due to: ", X5
a0a0: 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 09_verify_cert_e
a0b0: 72 72 6f 72 5f 73 74 72 69 6e 67 28 72 65 73 75 rror_string(resu
a0c0: 6c 74 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 lt), (char *) NU
a0d0: 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 LL);..}..Tcl_Set
a0e0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
a0f0: 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 , "TLS", "HANDSH
a100: 41 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 AKE", "FAILED",
a110: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
a120: 09 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e .dprintf("Return
a130: 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 ing TCL_ERROR wi
a140: 74 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 th handshake fai
a150: 6c 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 led: %s", errStr
a160: 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 );..return(TCL_E
a170: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c 73 RROR);. } els
a180: 65 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 e {..if (err !=
a190: 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 0) {.. dprint
a1a0: 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 f("Got an error
a1b0: 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 with a completed
a1c0: 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 handshake: err
a1d0: 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a = %i", err);..}.
a1e0: 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a .ret = 1;. }.
a1f0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 . dprintf("Re
a200: 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 turning TCL_OK w
a210: 69 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 ith data \"%i\""
a220: 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f , ret);. Tcl_
a230: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
a240: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f erp, Tcl_NewIntO
a250: 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 bj(ret));. re
a260: 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 63 turn(TCL_OK);..c
a270: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
a280: 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a ntData;.}../*. *
a290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a2d0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 ---. *. * Import
a2e0: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
a2f0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
a300: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
a310: 63 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 cess the "ssl" c
a320: 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 ommand. *. *.The
a330: 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 ssl command pus
a340: 68 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 hes SSL over a (
a350: 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 newly connected)
a360: 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 tcp socket. *.
a370: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
a380: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
a390: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
a3a0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
a3b0: 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 modify the behav
a3c0: 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 ior of an IO cha
a3d0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nnel.. *. *-----
a3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
a420: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d */.static int.Im
a430: 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e portObjCmd(Clien
a440: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
a450: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
a460: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
a470: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
a480: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
a490: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 _Channel chan;..
a4a0: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 /* The channel t
a4b0: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e o set a mode on.
a4c0: 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 */. State *s
a4d0: 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 tatePtr;../* cli
a4e0: 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 ent state for ss
a4f0: 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 l socket */.
a500: 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 20 SSL_CTX *ctx.
a510: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
a520: 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 Tcl_Obj *script
a530: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
a540: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 . Tcl_Obj *pa
a550: 73 73 77 6f 72 64 09 20 20 20 20 20 20 20 20 3d ssword. =
a560: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f NULL;. Tcl_O
a570: 62 6a 20 2a 76 63 6d 64 09 20 20 20 20 20 20 20 bj *vcmd.
a580: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c = NULL;. Tcl
a590: 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 _DString upperCh
a5a0: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
a5b0: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c , upperChannelBl
a5c0: 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 ocking, upperCha
a5d0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 nnelEncoding, up
a5e0: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 perChannelEOFCha
a5f0: 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 r;. int idx,
a600: 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 len;. int fla
a610: 67 73 09 09 20 20 20 20 20 20 20 20 3d 20 54 4c gs.. = TL
a620: 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 S_TCL_INIT;.
a630: 69 6e 74 20 73 65 72 76 65 72 09 09 20 20 20 20 int server..
a640: 20 20 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20 63 = 0;./* is c
a650: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 onnection incomi
a660: 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 ng or outgoing?
a670: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 */. char *key
a680: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e file. = N
a690: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 ULL;. char *c
a6a0: 65 72 74 66 69 6c 65 09 20 20 20 20 20 20 20 20 ertfile.
a6b0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 = NULL;. unsi
a6c0: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20 20 gned char *key
a6d0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 .= NULL;. int
a6e0: 20 6b 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 key_len
a6f0: 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 = 0;.
a700: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
a710: 2a 63 65 72 74 20 20 20 20 20 20 20 20 20 3d 20 *cert =
a720: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 63 65 NULL;. int ce
a730: 72 74 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 rt_len
a740: 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 = 0;. c
a750: 68 61 72 20 2a 63 69 70 68 65 72 73 09 20 20 20 har *ciphers.
a760: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
a770: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 char *ciphersui
a780: 74 65 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 tes. = NU
a790: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 LL;. char *CA
a7a0: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e file. = N
a7b0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 ULL;. char *C
a7c0: 41 64 69 72 09 09 20 20 20 20 20 20 20 20 3d 20 Adir.. =
a7d0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
a7e0: 44 48 70 61 72 61 6d 73 09 20 20 20 20 20 20 20 DHparams.
a7f0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
a800: 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20 20 20 r *model..
a810: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 = NULL;. ch
a820: 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 20 ar *servername.
a830: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f = NULL;./
a840: 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 * hostname for S
a850: 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 erver Name Indic
a860: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e ation */. con
a870: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
a880: 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e *session_id = N
a890: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
a8a0: 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a *alpn..= NULL;.
a8b0: 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 int ssl2 = 0
a8c0: 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 , ssl3 = 0;.
a8d0: 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c int tls1 = 1, tl
a8e0: 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 s1_1 = 1, tls1_2
a8f0: 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 = 1, tls1_3 = 1
a900: 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 ;. int proto
a910: 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b = 0, level = -1;
a920: 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 . int verify
a930: 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 = 0, require = 0
a940: 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70 , request = 1, p
a950: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 ost_handshake =
a960: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
a970: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 "Called");..#if
a980: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
a990: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
a9a0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 SSL_NO_TLS1).
a9b0: 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 tls1 = 0;.#endi
a9c0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
a9d0: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
a9e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
a9f0: 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f LS1_1). tls1_
aa00: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 1 = 0;.#endif.#i
aa10: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
aa20: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
aa30: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
aa40: 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 2). tls1_2 =
aa50: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
aa60: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
aa70: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
aa80: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
aa90: 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 tls1_3 = 0;.#
aaa0: 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f endif.. if (o
aab0: 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f bjc < 2) {..Tcl_
aac0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
aad0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
aae0: 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f hannel ?options?
aaf0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
ab00: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
ab10: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
ab20: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d r();.. chan =
ab30: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
ab40: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
ab50: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
ab60: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c v[1], NULL), NUL
ab70: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e L);. if (chan
ab80: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
ab90: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
aba0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
abb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 }.. /* Make
abc0: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
abd0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
abe0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
abf0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
ac00: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 hannel(chan);..
ac10: 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b for (idx = 2;
ac20: 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 idx < objc; idx
ac30: 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 ++) {..char *opt
ac40: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
ac50: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 FromObj(objv[idx
ac60: 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 ], NULL);...if (
ac70: 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 opt[0] != '-')..
ac80: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 break;...OPT
ac90: 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 OBJ("-alpn", alp
aca0: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 n);..OPTSTR("-ca
acb0: 64 69 72 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f dir", CAdir);..O
acc0: 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c PTSTR("-cafile",
acd0: 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 42 59 CAfile);..OPTBY
ace0: 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 TE("-cert", cert
acf0: 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 , cert_len);..OP
ad00: 54 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 TSTR("-certfile"
ad10: 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 , certfile);..OP
ad20: 54 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 TSTR("-cipher",
ad30: 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 ciphers);..OPTST
ad40: 52 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 R("-ciphers", ci
ad50: 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 phers);..OPTSTR(
ad60: 22 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 2c "-ciphersuites",
ad70: 20 63 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a ciphersuites);.
ad80: 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e .OPTOBJ("-comman
ad90: 64 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 d", script);..OP
ada0: 54 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 TSTR("-dhparams"
adb0: 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 , DHparams);..OP
adc0: 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 TBYTE("-key", ke
add0: 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 y, key_len);..OP
ade0: 54 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c TSTR("-keyfile",
adf0: 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 keyfile);..OPTS
ae00: 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 TR("-model", mod
ae10: 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 el);..OPTOBJ("-p
ae20: 61 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f assword", passwo
ae30: 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d rd);..OPTBOOL("-
ae40: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c post_handshake",
ae50: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 post_handshake)
ae60: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 ;..OPTBOOL("-req
ae70: 75 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b uest", request);
ae80: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 ..OPTBOOL("-requ
ae90: 69 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a ire", require);.
aea0: 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 .OPTINT("-securi
aeb0: 74 79 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 tylevel", level)
aec0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 ;..OPTBOOL("-ser
aed0: 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 ver", server);..
aee0: 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e OPTSTR("-servern
aef0: 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 ame", servername
af00: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 );..OPTSTR("-ses
af10: 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f sion_id", sessio
af20: 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 n_id);..OPTBOOL(
af30: 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a "-ssl2", ssl2);.
af40: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 .OPTBOOL("-ssl3"
af50: 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f , ssl3);..OPTBOO
af60: 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 L("-tls1", tls1)
af70: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
af80: 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 1.1", tls1_1);..
af90: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 OPTBOOL("-tls1.2
afa0: 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 ", tls1_2);..OPT
afb0: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 BOOL("-tls1.3",
afc0: 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a tls1_3);..OPTOBJ
afd0: 28 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 ("-validatecomma
afe0: 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 nd", vcmd);..OPT
aff0: 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d OBJ("-vcmd", vcm
b000: 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 d);...OPTBAD("op
b010: 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d tion", "-alpn, -
b020: 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 cadir, -cafile,
b030: 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 -cert, -certfile
b040: 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 , -cipher, -ciph
b050: 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 ersuites, -comma
b060: 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d nd, -dhparams, -
b070: 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d key, -keyfile, -
b080: 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 model, -password
b090: 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b , -post_handshak
b0a0: 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 e, -request, -re
b0b0: 71 75 69 72 65 2c 20 2d 73 65 63 75 72 69 74 79 quire, -security
b0c0: 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 level, -server,
b0d0: 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 -servername, -se
b0e0: 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c ssion_id, -ssl2,
b0f0: 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d -ssl3, -tls1, -
b100: 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c tls1.1, -tls1.2,
b110: 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 -tls1.3, or -va
b120: 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b lidatecommand");
b130: 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
b140: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
b150: 66 20 28 72 65 71 75 65 73 74 29 09 09 76 65 72 f (request)..ver
b160: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 ify |= SSL_VERIF
b170: 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 Y_CLIENT_ONCE |
b180: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b SSL_VERIFY_PEER;
b190: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 . if (request
b1a0: 20 26 26 20 72 65 71 75 69 72 65 29 09 76 65 72 && require).ver
b1b0: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 ify |= SSL_VERIF
b1c0: 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 Y_FAIL_IF_NO_PEE
b1d0: 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 R_CERT;. if (
b1e0: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f request && post_
b1f0: 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 handshake).verif
b200: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
b210: 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a POST_HANDSHAKE;.
b220: 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d if (verify =
b230: 3d 20 30 29 09 09 76 65 72 69 66 79 20 3d 20 53 = 0)..verify = S
b240: 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a SL_VERIFY_NONE;.
b250: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 . proto |= (s
b260: 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f sl2 ? TLS_PROTO_
b270: 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 SSL2 : 0);. p
b280: 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 roto |= (ssl3 ?
b290: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a TLS_PROTO_SSL3 :
b2a0: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 0);. proto |
b2b0: 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 = (tls1 ? TLS_PR
b2c0: 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 OTO_TLS1 : 0);.
b2d0: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 proto |= (tls
b2e0: 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 1_1 ? TLS_PROTO_
b2f0: 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 TLS1_1 : 0);.
b300: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f proto |= (tls1_
b310: 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 2 ? TLS_PROTO_TL
b320: 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 S1_2 : 0);. p
b330: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 roto |= (tls1_3
b340: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 ? TLS_PROTO_TLS1
b350: 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a _3 : 0);.. /*
b360: 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 reset to NULL i
b370: 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 f blank string p
b380: 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 rovided */. i
b390: 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 f (cert && !*cer
b3a0: 74 29 09 09 20 20 20 20 20 20 20 20 63 65 72 74 t).. cert
b3b0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
b3c0: 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 . if (key &&
b3d0: 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 !*key)..
b3e0: 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 key. = NU
b3f0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 LL;. if (cert
b400: 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 file && !*certfi
b410: 6c 65 29 20 20 20 20 20 20 20 20 20 63 65 72 74 le) cert
b420: 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 file.= NULL;.
b430: 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 if (keyfile &&
b440: 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 !*keyfile)..keyf
b450: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ile. = NU
b460: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 LL;. if (ciph
b470: 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 ers && !*ciphers
b480: 29 09 20 20 20 20 20 20 20 20 63 69 70 68 65 72 ). cipher
b490: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c s. = NULL
b4a0: 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 ;. if (cipher
b4b0: 73 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 suites && !*ciph
b4c0: 65 72 73 75 69 74 65 73 29 20 63 69 70 68 65 72 ersuites) cipher
b4d0: 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c suites = NULL
b4e0: 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 ;. if (CAfile
b4f0: 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 && !*CAfile).
b500: 20 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 CAfile.
b510: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
b520: 20 69 66 20 28 43 41 64 69 72 20 26 26 20 21 2a if (CAdir && !*
b530: 43 41 64 69 72 29 09 20 20 20 20 20 20 20 20 43 CAdir). C
b540: 41 64 69 72 09 20 20 20 20 20 20 20 20 3d 20 4e Adir. = N
b550: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 ULL;. if (DHp
b560: 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 arams && !*DHpar
b570: 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70 ams). DHp
b580: 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e arams = N
b590: 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 ULL;.. /* new
b5a0: 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 SSL state */.
b5b0: 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 statePtr..= (S
b5c0: 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 tate *) ckalloc(
b5d0: 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f (unsigned) sizeo
b5e0: 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d f(State));. m
b5f0: 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 emset(statePtr,
b600: 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 0, sizeof(State)
b610: 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 );.. statePtr
b620: 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b ->flags.= flags;
b630: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 . statePtr->i
b640: 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a nterp.= interp;.
b650: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 statePtr->vf
b660: 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 lags.= verify;.
b670: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 statePtr->err
b680: 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 .= "";.. /* a
b690: 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a llocate script *
b6a0: 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74 /. if (script
b6b0: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f ) {..(void) Tcl_
b6c0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
b6d0: 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a (script, &len);.
b6e0: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 .if (len) {..
b6f0: 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 statePtr->callb
b700: 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 ack = script;..
b710: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
b720: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 unt(statePtr->ca
b730: 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 llback);..}.
b740: 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 }.. /* alloca
b750: 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 te password */.
b760: 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 if (password)
b770: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 {..(void) Tcl_G
b780: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
b790: 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b password, &len);
b7a0: 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 ..if (len) {..
b7b0: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 statePtr->pass
b7c0: 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b word = password;
b7d0: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
b7e0: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
b7f0: 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 >password);..}.
b800: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c }.. /* all
b810: 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 ocate validate c
b820: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 ommand */. if
b830: 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 (vcmd) {..(void
b840: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
b850: 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 romObj(vcmd, &le
b860: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
b870: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 . statePtr->v
b880: 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 cmd = vcmd;..
b890: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
b8a0: 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 t(statePtr->vcmd
b8b0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
b8c0: 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 if (model != NU
b8d0: 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b LL) {..int mode;
b8e0: 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f ../* Get the "mo
b8f0: 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a del" context */.
b900: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 .chan = Tcl_GetC
b910: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d hannel(interp, m
b920: 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 odel, &mode);..i
b930: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
b940: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
b950: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
b960: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
b970: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
b980: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
b990: 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 *.. * Make sure
b9a0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
b9b0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
b9c0: 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 l.. */..chan = T
b9d0: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
b9e0: 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c (chan);..if (Tcl
b9f0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
ba00: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
ba10: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 nnelType()) {..
ba20: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
ba30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
ba40: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
ba50: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
ba60: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e (chan),..."\": n
ba70: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
ba80: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 ", NULL);.. T
ba90: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
baa0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
bab0: 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 IMPORT", "CHANNE
bac0: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 L", "INVALID", (
bad0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
bae0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
baf0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
bb00: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
bb10: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 _ERROR;..}..ctx
bb20: 3d 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f = ((State *)Tcl_
bb30: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
bb40: 63 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 ceData(chan))->c
bb50: 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b tx;. } else {
bb60: 0a 09 69 66 20 28 28 63 74 78 20 3d 20 43 54 58 ..if ((ctx = CTX
bb70: 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20 _Init(statePtr,
bb80: 73 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b server, proto, k
bb90: 65 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 eyfile, certfile
bba0: 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 6b 65 79 , key, cert, key
bbb0: 5f 6c 65 6e 2c 0a 09 20 20 20 20 63 65 72 74 5f _len,.. cert_
bbc0: 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 66 69 len, CAdir, CAfi
bbd0: 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 le, ciphers, cip
bbe0: 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c hersuites, level
bbf0: 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 , DHparams)) ==
bc00: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 NULL) {.. Tls
bc10: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
bc20: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
bc30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
bc40: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 ..}. }.. s
bc50: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 tatePtr->ctx = c
bc60: 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 tx;.. /*.
bc70: 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 * We need to ma
bc80: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 ke sure that the
bc90: 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 channel works i
bca0: 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 n binary (for th
bcb0: 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 e. * encrypt
bcc0: 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 ion not to get g
bcd0: 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 oofed up)..
bce0: 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 * We only want t
bcf0: 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 o adjust the buf
bd00: 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 fering in pre-v2
bd10: 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 channels, where
bd20: 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 . * each cha
bd30: 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 nnel in the stac
bd40: 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 k maintained its
bd50: 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 own buffers..
bd60: 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 */. Tcl_DS
bd70: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
bd80: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
bd90: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 on);. Tcl_DSt
bda0: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
bdb0: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b hannelBlocking);
bdc0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
bdd0: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
bde0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 elEOFChar);.
bdf0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
be00: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 &upperChannelEnc
be10: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f oding);. Tcl_
be20: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
be30: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
be40: 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 -eofchar", &uppe
be50: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
be60: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 ;. Tcl_GetCha
be70: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
be80: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 p, chan, "-encod
be90: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e ing", &upperChan
bea0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 nelEncoding);.
beb0: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
bec0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
bed0: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 han, "-translati
bee0: 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e on", &upperChann
bef0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
bf00: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e Tcl_GetChann
bf10: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
bf20: 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e chan, "-blockin
bf30: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 g", &upperChanne
bf40: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 lBlocking);.
bf50: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
bf60: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
bf70: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
bf80: 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 ", "binary");.
bf90: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
bfa0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
bfb0: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 han, "-blocking"
bfc0: 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 , "true");. d
bfd0: 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e printf("Consumin
bfe0: 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 g Tcl channel %s
bff0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
c000: 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 lName(chan));.
c010: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 statePtr->self
c020: 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e = Tcl_StackChan
c030: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f nel(interp, Tls_
c040: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 ChannelType(), (
c050: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
c060: 65 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 ePtr, (TCL_READA
c070: 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 BLE | TCL_WRITAB
c080: 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 LE), chan);.
c090: 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 dprintf("Created
c0a0: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 channel named %
c0b0: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e s", Tcl_GetChann
c0c0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
c0d0: 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 >self));. if
c0e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 (statePtr->self
c0f0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
c100: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a NULL) {../*.. *
c110: 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 No use of Tcl_E
c120: 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 ventuallyFree be
c130: 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c cause no possibl
c140: 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a e Tcl_Preserve..
c150: 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 . */..Tls_Free((
c160: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
c170: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
c180: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
c190: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
c1a0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 ption(interp, st
c1b0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d atePtr->self, "-
c1c0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 translation", Tc
c1d0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
c1e0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
c1f0: 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 slation));. T
c200: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
c210: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ion(interp, stat
c220: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e ePtr->self, "-en
c230: 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 coding", Tcl_DSt
c240: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
c250: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
c260: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
c270: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
c280: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
c290: 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 lf, "-eofchar",
c2a0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
c2b0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f (&upperChannelEO
c2c0: 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c FChar));. Tcl
c2d0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
c2e0: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
c2f0: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 tr->self, "-bloc
c300: 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 king", Tcl_DStri
c310: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
c320: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b annelBlocking));
c330: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
c340: 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 SSL Initializati
c350: 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 on. */. s
c360: 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 tatePtr->ssl = S
c370: 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d SL_new(statePtr-
c380: 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 >ctx);. if (!
c390: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b statePtr->ssl) {
c3a0: 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 ../* SSL library
c3b0: 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 error */..Tcl_A
c3c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
c3d0: 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f rp, "couldn't co
c3e0: 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 nstruct ssl sess
c3f0: 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 ion: ", REASON()
c400: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
c410: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
c420: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
c430: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
c440: 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 "INIT", "FAILED
c450: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
c460: 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 );..Tls_Free((ch
c470: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
c480: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
c490: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
c4a0: 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 * Set host serve
c4b0: 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 r name */. if
c4c0: 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a (servername) {.
c4d0: 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 ./* Sets the ser
c4e0: 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 ver name indicat
c4f0: 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 ion (SNI) in Cli
c500: 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 entHello extensi
c510: 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 on */../* Per RF
c520: 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 C 6066, hostname
c530: 20 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f is a ASCII enco
c540: 64 65 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 ded string, thou
c550: 67 68 20 52 46 43 20 34 33 36 36 20 73 61 79 73 gh RFC 4366 says
c560: 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 UTF-8. */..if (
c570: 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f !SSL_set_tlsext_
c580: 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 host_name(stateP
c590: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e tr->ssl, servern
c5a0: 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29 ame) && require)
c5b0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
c5c0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
c5d0: 20 22 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f "setting TLS ho
c5e0: 73 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f st name extensio
c5f0: 6e 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 n failed", (char
c600: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
c610: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
c620: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
c630: 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c "IMPORT", "SNI",
c640: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
c650: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
c660: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
c670: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
c680: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
c690: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 OR;..}.../* Set
c6a0: 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 hostname for pee
c6b0: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 68 6f r certificate ho
c6c0: 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74 stname verificat
c6d0: 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a ion in clients..
c6e0: 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53 . Don't use SS
c6f0: 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 L_set1_host sinc
c700: 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74 e it has limitat
c710: 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 ions. */..if (!S
c720: 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 SL_add1_host(sta
c730: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 tePtr->ssl, serv
c740: 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 ername)) {..
c750: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
c760: 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e (interp, "settin
c770: 67 20 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 g DNS host name
c780: 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a failed", (char *
c790: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 ) NULL);.. Tc
c7a0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
c7b0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
c7c0: 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d MPORT", "HOSTNAM
c7d0: 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 E", "FAILED", (c
c7e0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
c7f0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
c800: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
c810: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
c820: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
c830: 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 . /* Resume s
c840: 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 ession id */.
c850: 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 if (session_id
c860: 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f && strlen(sessio
c870: 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 n_id) <= SSL_MAX
c880: 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 _SID_CTX_LENGTH)
c890: 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 {../* SSL_set_s
c8a0: 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 ession() */..if
c8b0: 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 (!SSL_SESSION_se
c8c0: 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 t1_id_context(SS
c8d0: 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 L_get_session(st
c8e0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 atePtr->ssl), se
c8f0: 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 ssion_id, (unsig
c900: 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 ned int) strlen(
c910: 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a session_id))) {.
c920: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
c930: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 esult(interp, "R
c940: 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 esume session id
c950: 20 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 ", session_id,
c960: 22 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 " failed", (char
c970: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
c980: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
c990: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
c9a0: 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 "IMPORT", "SESSI
c9b0: 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 ON", "FAILED", (
c9c0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
c9d0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
c9e0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
c9f0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
ca00: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
ca10: 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 .. /* Enable
ca20: 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 Application-Laye
ca30: 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 r Protocol Negot
ca40: 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 iation. Examples
ca50: 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a are: http/1.0,.
ca60: 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 .http/1.1, h2, h
ca70: 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 3, ftp, imap, po
ca80: 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c p3, xmpp-client,
ca90: 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 xmpp-server, mq
caa0: 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f tt, irc, etc. */
cab0: 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b . if (alpn) {
cac0: 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 ../* Convert a T
cad0: 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 CL list into a p
cae0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 rotocol-list in
caf0: 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 wire-format */..
cb00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 unsigned char *p
cb10: 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 rotos, *p;..unsi
cb20: 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f gned int protos_
cb30: 6c 65 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c len = 0;..int i,
cb40: 20 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f len, cnt;..Tcl_
cb50: 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 Obj **list;...if
cb60: 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 (Tcl_ListObjGet
cb70: 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c Elements(interp,
cb80: 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 alpn, &cnt, &li
cb90: 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b st) != TCL_OK) {
cba0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
cbb0: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
cbc0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
cbd0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
cbe0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 * Determine the
cbf0: 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 memory required
cc00: 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c for the protocol
cc10: 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 -list */..for (i
cc20: 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 = 0; i < cnt; i
cc30: 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 ++) {.. Tcl_G
cc40: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
cc50: 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a list[i], &len);.
cc60: 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 . if (len > 2
cc70: 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 55) {...Tcl_Appe
cc80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
cc90: 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 "ALPN protocol
cca0: 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 name too long",
ccb0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
ccc0: 09 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
ccd0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
cce0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 , "IMPORT", "ALP
ccf0: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 N", "FAILED", (c
cd00: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
cd10: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
cd20: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 ) statePtr);...r
cd30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
cd40: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f .. }.. pro
cd50: 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c tos_len += 1 + l
cd60: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c en;..}.../* Buil
cd70: 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 d the complete p
cd80: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a rotocol-list */.
cd90: 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f .protos = ckallo
cda0: 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 c(protos_len);..
cdb0: 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 /* protocol-list
cdc0: 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 s consist of 8-b
cdd0: 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 it length-prefix
cde0: 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 ed, byte strings
cdf0: 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c */..for (i = 0,
ce00: 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c p = protos; i <
ce10: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 cnt; i++) {..
ce20: 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 char *str = Tc
ce30: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
ce40: 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e bj(list[i], &len
ce50: 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c );.. *p++ = l
ce60: 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 en;.. memcpy(
ce70: 70 2c 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 p, str, len);..
ce80: 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a p += len;..}.
ce90: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 ../* SSL_set_alp
cea0: 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 n_protos makes a
ceb0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f copy of the pro
cec0: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f tocol-list */../
ced0: 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e * Note: This fun
cee0: 63 74 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 ctions reverses
cef0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 the return value
cf00: 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 convention */..
cf10: 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e if (SSL_set_alpn
cf20: 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 _protos(statePtr
cf30: 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 ->ssl, protos, p
cf40: 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 rotos_len)) {..
cf50: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
cf60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 ult(interp, "fai
cf70: 6c 65 64 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 led to set ALPN
cf80: 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 protocols", (cha
cf90: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
cfa0: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 Tcl_SetErrorCod
cfb0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
cfc0: 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e "IMPORT", "ALPN
cfd0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
cfe0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
cff0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
d000: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
d010: 20 20 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f ckfree(proto
d020: 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 s);.. return
d030: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
d040: 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f /* Store protoco
d050: 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 ls list */..stat
d060: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 ePtr->protos = p
d070: 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 rotos;..statePtr
d080: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 ->protos_len = p
d090: 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d rotos_len;. }
d0a0: 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 else {..statePt
d0b0: 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c r->protos = NULL
d0c0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f ;..statePtr->pro
d0d0: 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 tos_len = 0;.
d0e0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 }.. /*.
d0f0: 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a * SSL Callbacks.
d100: 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f */. SSL_
d110: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 set_app_data(sta
d120: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 tePtr->ssl, (voi
d130: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f d *)statePtr);./
d140: 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 * point back to
d150: 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 us */. SSL_se
d160: 74 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74 t_verify(statePt
d170: 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 r->ssl, verify,
d180: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b VerifyCallback);
d190: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 . SSL_set_inf
d1a0: 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 o_callback(state
d1b0: 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 Ptr->ssl, InfoCa
d1c0: 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a llback);.. /*
d1d0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 Callback for ob
d1e0: 73 65 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c serving protocol
d1f0: 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 messages */.#if
d200: 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ndef OPENSSL_NO_
d210: 53 53 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a SSL_TRACE. /*
d220: 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 void SSL_CTX_se
d230: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 t_msg_callback_a
d240: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 rg(statePtr->ctx
d250: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
d260: 74 72 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 tr);. void SS
d270: 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 L_CTX_set_msg_ca
d280: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d llback(statePtr-
d290: 3e 63 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c >ctx, MessageCal
d2a0: 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 lback); */. S
d2b0: 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 SL_set_msg_callb
d2c0: 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 ack_arg(statePtr
d2d0: 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 ->ssl, (void *)s
d2e0: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 tatePtr);. SS
d2f0: 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 L_set_msg_callba
d300: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ck(statePtr->ssl
d310: 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 , MessageCallbac
d320: 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 k);.#endif..
d330: 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 /* Create Tcl_Ch
d340: 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 annel BIO Handle
d350: 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 r */. statePt
d360: 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e r->p_bio.= BIO_n
d370: 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c ew_tcl(statePtr,
d380: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 BIO_NOCLOSE);.
d390: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f statePtr->bio
d3a0: 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 .= BIO_new(BIO_f
d3b0: 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 _ssl());.. if
d3c0: 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 (server) {../*
d3d0: 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 Server callbacks
d3e0: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 */..SSL_CTX_set
d3f0: 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 _tlsext_serverna
d400: 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d me_arg(statePtr-
d410: 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 >ctx, (void *)st
d420: 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 atePtr);..SSL_CT
d430: 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 X_set_tlsext_ser
d440: 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b vername_callback
d450: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
d460: 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 SNICallback);..S
d470: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
d480: 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 t_hello_cb(state
d490: 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 Ptr->ctx, HelloC
d4a0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
d4b0: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 )statePtr);..if
d4c0: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
d4d0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 s != NULL) {..
d4e0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c SSL_CTX_set_al
d4f0: 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 pn_select_cb(sta
d500: 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e tePtr->ctx, ALPN
d510: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 Callback, (void
d520: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 *)statePtr);.#if
d530: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 def USE_NPN..
d540: 20 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 if (tls1_2 == 0
d550: 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 && tls1_3 == 0)
d560: 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 {...SSL_CTX_set
d570: 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 _next_protos_adv
d580: 65 72 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 ertised_cb(state
d590: 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c Ptr->ctx, NPNCal
d5a0: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 lback, (void *)s
d5b0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d tatePtr);.. }
d5c0: 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 .#endif..}.../*
d5d0: 45 6e 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f Enable server to
d5e0: 20 73 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 send cert reque
d5f0: 73 74 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 st after handsha
d600: 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 ke (TLS 1.3 only
d610: 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 ) */../* A write
d620: 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 operation must
d630: 74 61 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 take place for t
d640: 68 65 20 43 65 72 74 69 66 69 63 61 74 65 20 52 he Certificate R
d650: 65 71 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 equest to be..
d660: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 sent to the cli
d670: 65 6e 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 ent, this can be
d680: 20 64 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 done with SSL_d
d690: 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a o_handshake(). *
d6a0: 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 /..if (request &
d6b0: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 & post_handshake
d6c0: 20 26 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 && tls1_3) {..
d6d0: 20 20 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c SSL_verify_cl
d6e0: 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 ient_post_handsh
d6f0: 61 6b 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ake(statePtr->ss
d700: 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 l);..}.../* set
d710: 61 75 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 automatic curve
d720: 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 selection */..SS
d730: 4c 5f 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 L_set_ecdh_auto(
d740: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 statePtr->ssl, 1
d750: 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 );.../* Set serv
d760: 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 er mode */..stat
d770: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 ePtr->flags |= T
d780: 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 LS_TCL_SERVER;..
d790: 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 SSL_set_accept_s
d7a0: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 tate(statePtr->s
d7b0: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 sl);. } else
d7c0: 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c {../* Client cal
d7d0: 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 lbacks */.#ifdef
d7e0: 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 USE_NPN..if (st
d7f0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 atePtr->protos !
d800: 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 = NULL && tls1_2
d810: 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 == 0 && tls1_3
d820: 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c == 0) {.. SSL
d830: 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 _CTX_set_next_pr
d840: 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 oto_select_cb(st
d850: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 atePtr->ctx, ALP
d860: 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 NCallback, (void
d870: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d *)statePtr);..}
d880: 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 .#endif.../* Ses
d890: 73 69 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a sion caching */.
d8a0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 .SSL_CTX_set_ses
d8b0: 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 sion_cache_mode(
d8c0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 statePtr->ctx, S
d8d0: 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c SL_SESS_CACHE_CL
d8e0: 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f IENT | SSL_SESS_
d8f0: 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 CACHE_NO_INTERNA
d900: 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 L_STORE);..SSL_C
d910: 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f TX_sess_set_new_
d920: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 cb(statePtr->ctx
d930: 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 , SessionCallbac
d940: 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 k);.../* Enable
d950: 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 post handshake A
d960: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 uthentication ex
d970: 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 tension. TLS 1.3
d980: 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f only, not http/
d990: 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 2. */..if (reque
d9a0: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 st && post_hands
d9b0: 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c hake) {.. SSL
d9c0: 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 _set_post_handsh
d9d0: 61 6b 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 ake_auth(statePt
d9e0: 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a r->ssl, 1);..}..
d9f0: 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d ./* Set client m
da00: 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f ode */..SSL_set_
da10: 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 connect_state(st
da20: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
da30: 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f }. SSL_set_
da40: 62 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 bio(statePtr->ss
da50: 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 l, statePtr->p_b
da60: 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f io, statePtr->p_
da70: 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 bio);. BIO_se
da80: 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e t_ssl(statePtr->
da90: 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 bio, statePtr->s
daa0: 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 sl, BIO_NOCLOSE)
dab0: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
dac0: 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 End of SSL Init
dad0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 . */. dpr
dae0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 intf("Returning
daf0: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e %s", Tcl_GetChan
db00: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
db10: 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 ->self));. Tc
db20: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
db30: 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c rp, (char *) Tcl
db40: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
db50: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
db60: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a TCL_VOLATILE);.
db70: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
db80: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 OK;..clientData
db90: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a = clientData;.}.
dba0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
dbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
dbf0: 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 UnimportObjCmd
dc00: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
dc10: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
dc20: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 ed to remove the
dc30: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
dc40: 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 filter.. *. * R
dc50: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
dc60: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
dc70: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
dc80: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 ects:. *.May mod
dc90: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 ify the behavior
dca0: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 of an IO channe
dcb0: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d l.. *. *--------
dcc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dcf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
dd00: 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 static int.Unimp
dd10: 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 ortObjCmd(Client
dd20: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
dd30: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
dd40: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
dd50: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
dd60: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
dd70: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f Channel chan;../
dd80: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
dd90: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 set a mode on.
dda0: 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 */.. dprintf(
ddb0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
ddc0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b if (objc != 2) {
ddd0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
dde0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
ddf0: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a jv, "channel");.
de00: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
de10: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 R;. }.. ch
de20: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
de30: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f nel(interp, Tcl_
de40: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 GetString(objv[1
de50: 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 ]), NULL);. i
de60: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
de70: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
de80: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
de90: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
dea0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
deb0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
dec0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
ded0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
dee0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
def0: 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 an);.. if (Tc
df00: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
df10: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
df20: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
df30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
df40: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
df50: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
df60: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
df70: 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 an),..."\": not
df80: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 a TLS channel",
df90: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
dfa0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
dfb0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 erp, "TLS", "UNI
dfc0: 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c MPORT", "CHANNEL
dfd0: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 ", "INVALID", (c
dfe0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
dff0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
e000: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
e010: 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e Tcl_UnstackChann
e020: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 el(interp, chan)
e030: 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b == TCL_ERROR) {
e040: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
e050: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 OR;. }.. r
e060: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
e070: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
e080: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ntData;.}.../*.
e090: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
e0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e0d0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 ----. *. * CTX_I
e0e0: 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 nit -- construct
e0f0: 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 a SSL_CTX insta
e100: 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 nce. *. * Result
e110: 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 s:. *.A valid SS
e120: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f L_CTX instance o
e130: 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 r NULL.. *. * Si
e140: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 de effects:. *.c
e150: 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f onstructs SSL co
e160: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 ntext (CTX). *.
e170: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
e180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e1b0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
e1c0: 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e SSL_CTX *.CTX_In
e1d0: 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 it(State *stateP
e1e0: 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 tr, int isServer
e1f0: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 , int proto, cha
e200: 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 r *keyfile, char
e210: 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 *certfile,.
e220: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b unsigned char *k
e230: 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ey, unsigned cha
e240: 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 r *cert, int key
e250: 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c _len, int cert_l
e260: 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c en, char *CAdir,
e270: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c . char *CAfil
e280: 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 e, char *ciphers
e290: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 , char *ciphersu
e2a0: 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c ites, int level,
e2b0: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 char *DHparams)
e2c0: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 {. Tcl_Inter
e2d0: 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 p *interp = stat
e2e0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
e2f0: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d SSL_CTX *ctx =
e300: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 NULL;. Tcl_D
e310: 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 String ds;. T
e320: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a cl_DString ds1;.
e330: 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b int off = 0;
e340: 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 . int load_pr
e350: 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 ivate_key;. c
e360: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 onst SSL_METHOD
e370: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 *method;.. dp
e380: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
e390: 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f .. if (!proto
e3a0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
e3b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e esult(interp, "n
e3c0: 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c o valid protocol
e3d0: 20 73 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c selected", NULL
e3e0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
e3f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 . }.. /* c
e400: 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 reate SSL contex
e410: 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c t */.#if OPENSSL
e420: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
e430: 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c >= 0x10100000L |
e440: 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c | defined(NO_SSL
e450: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
e460: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 ENSSL_NO_SSL2).
e470: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
e480: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
e490: 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 SSL2)) {..Tcl_Ap
e4a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
e4b0: 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f p, "SSL2 protoco
e4c0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
e4d0: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
e4e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
e4f0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
e500: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 NO_SSL3) || defi
e510: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
e520: 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 SL3). if (ENA
e530: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
e540: 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 PROTO_SSL3)) {..
e550: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
e560: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 (interp, "SSL3 p
e570: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
e580: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
e590: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
e5a0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
e5b0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c fined(NO_TLS1) |
e5c0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
e5d0: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 L_NO_TLS1). i
e5e0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
e5f0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
e600: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
e610: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
e620: 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c TLS 1.0 protocol
e630: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
e640: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
e650: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
e660: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
e670: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 O_TLS1_1) || def
e680: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
e690: 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 TLS1_1). if (
e6a0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
e6b0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 LS_PROTO_TLS1_1)
e6c0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
e6d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 esult(interp, "T
e6e0: 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 LS 1.1 protocol
e6f0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
e700: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
e710: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
e720: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
e730: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
e740: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
e750: 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 LS1_2). if (E
e760: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
e770: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 S_PROTO_TLS1_2))
e780: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
e790: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
e7a0: 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.2 protocol n
e7b0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
e7c0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
e7d0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
e7e0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
e7f0: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e TLS1_3) || defin
e800: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e810: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e S1_3). if (EN
e820: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
e830: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 _PROTO_TLS1_3))
e840: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
e850: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ult(interp, "TLS
e860: 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 1.3 protocol no
e870: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
e880: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
e890: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
e8a0: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d if (proto ==
e8b0: 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 0) {../* Use fu
e8c0: 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c ll range */..SSL
e8d0: 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f _CTX_set_min_pro
e8e0: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 to_version(ctx,
e8f0: 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 0);..SSL_CTX_set
e900: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _max_proto_versi
e910: 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 on(ctx, 0);.
e920: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 }.. switch (p
e930: 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e roto) {.#if OPEN
e940: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
e950: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c ER < 0x10100000L
e960: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f && !defined(NO_
e970: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 SSL2) && !define
e980: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
e990: 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 2). case TLS_
e9a0: 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 PROTO_SSL2:..met
e9b0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
e9c0: 20 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 SSLv2_server_me
e9d0: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 thod() : SSLv2_c
e9e0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
e9f0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
ea00: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 if !defined(NO_S
ea10: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
ea20: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
ea30: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
ea40: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 ENSSL_NO_SSL3_ME
ea50: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 THOD). case T
ea60: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 LS_PROTO_SSL3:..
ea70: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
ea80: 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 r ? SSLv3_server
ea90: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 _method() : SSLv
eaa0: 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 3_client_method(
eab0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
eac0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
ead0: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
eae0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
eaf0: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
eb00: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
eb10: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 _METHOD). cas
eb20: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
eb30: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 :..method = isSe
eb40: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 rver ? TLSv1_ser
eb50: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 ver_method() : T
eb60: 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 LSv1_client_meth
eb70: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
eb80: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
eb90: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 d(NO_TLS1_1) &&
eba0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
ebb0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 _NO_TLS1_1) && !
ebc0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
ebd0: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 NO_TLS1_1_METHOD
ebe0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
ebf0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 ROTO_TLS1_1:..me
ec00: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
ec10: 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 ? TLSv1_1_server
ec20: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 _method() : TLSv
ec30: 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 1_1_client_metho
ec40: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
ec50: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
ec60: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 (NO_TLS1_2) && !
ec70: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
ec80: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
ec90: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
eca0: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 O_TLS1_2_METHOD)
ecb0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
ecc0: 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 OTO_TLS1_2:..met
ecd0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
ece0: 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f TLSv1_2_server_
ecf0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 method() : TLSv1
ed00: 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 _2_client_method
ed10: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
ed20: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
ed30: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
ed40: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
ed50: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 O_TLS1_3). ca
ed60: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
ed70: 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 1_3:../* Use the
ed80: 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 generic method
ed90: 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 and constraint r
eda0: 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 ange after conte
edb0: 78 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f xt is created */
edc0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
edd0: 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 ver ? TLS_server
ede0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f _method() : TLS_
edf0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
ee00: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
ee10: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a default:../*
ee20: 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 Negotiate highe
ee30: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c st available SSL
ee40: 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a /TLS version */.
ee50: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
ee60: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f er ? TLS_server_
ee70: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 method() : TLS_c
ee80: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
ee90: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
eea0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
eeb0: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
eec0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 ined(NO_SSL2) &&
eed0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
eee0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 L_NO_SSL2)..off
eef0: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 |= (ENABLED(prot
ef00: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c o, TLS_PROTO_SSL
ef10: 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 2) ? 0 : SSL_O
ef20: 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e P_NO_SSLv2);.#en
ef30: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
ef40: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 (NO_SSL3) && !de
ef50: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
ef60: 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 _SSL3)..off |= (
ef70: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
ef80: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 LS_PROTO_SSL3)
ef90: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
efa0: 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a _SSLv3);.#endif.
efb0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
efc0: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 TLS1) && !define
efd0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
efe0: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 1)..off |= (ENAB
eff0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
f000: 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 ROTO_TLS1) ? 0
f010: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
f020: 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 v1);.#endif.#if
f030: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
f040: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
f050: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
f060: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 1)..off |= (ENAB
f070: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
f080: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 ROTO_TLS1_1) ? 0
f090: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
f0a0: 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 v1_1);.#endif.#i
f0b0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
f0c0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
f0d0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
f0e0: 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 1_2)..off |= (EN
f0f0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
f100: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f _PROTO_TLS1_2) ?
f110: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
f120: 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a LSv1_2);.#endif.
f130: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
f140: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 TLS1_3) && !defi
f150: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
f160: 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 LS1_3)..off |= (
f170: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
f180: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
f190: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
f1a0: 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 _TLSv1_3);.#endi
f1b0: 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a f..break;. }.
f1c0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
f1d0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 rror();.. ctx
f1e0: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d = SSL_CTX_new(m
f1f0: 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 ethod);. if (
f200: 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 !ctx) {..return(
f210: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL);. }..
f220: 20 20 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c if (getenv(SSL
f230: 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 KEYLOGFILE)) {..
f240: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c SSL_CTX_set_keyl
f250: 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c og_callback(ctx,
f260: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 KeyLogCallback)
f270: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 ;. }..#if !de
f280: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
f290: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
f2a0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
f2b0: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d if (proto ==
f2c0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
f2d0: 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 3) {..SSL_CTX_se
f2e0: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 t_min_proto_vers
f2f0: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
f300: 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 VERSION);..SSL_C
f310: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f TX_set_max_proto
f320: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c _version(ctx, TL
f330: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 S1_3_VERSION);.
f340: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 }.#endif..
f350: 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 /* Force cipher
f360: 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 selection order
f370: 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 by server */.
f380: 20 20 69 66 20 28 21 69 73 53 65 72 76 65 72 29 if (!isServer)
f390: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
f3a0: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c options(ctx, SSL
f3b0: 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 _OP_CIPHER_SERVE
f3c0: 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 R_PREFERENCE);.
f3d0: 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 }..#if OPENSS
f3e0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
f3f0: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 < 0x10100000L.
f400: 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 OpenSSL_add_a
f410: 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b ll_algorithms();
f420: 20 2f 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 /* Load ciphers
f430: 20 61 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a and digests */.
f440: 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f #endif.. SSL_
f450: 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 CTX_set_app_data
f460: 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 (ctx, (void*)int
f470: 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 erp);./* remembe
f480: 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 r the interprete
f490: 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 r */. SSL_CTX
f4a0: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 _set_options(ctx
f4b0: 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f , SSL_OP_ALL);./
f4c0: 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f * all SSL bug wo
f4d0: 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 rkarounds */.
f4e0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 SSL_CTX_set_opt
f4f0: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 ions(ctx, SSL_OP
f500: 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 _NO_COMPRESSION)
f510: 3b 09 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d ;./* disable com
f520: 70 72 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 pression even if
f530: 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 supported */.
f540: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 SSL_CTX_set_op
f550: 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b tions(ctx, off);
f560: 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f ../* disable pro
f570: 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a tocol versions *
f580: 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 /.#if OPENSSL_VE
f590: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
f5a0: 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53 x10101000L. S
f5b0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 SL_CTX_set_mode(
f5c0: 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 ctx, SSL_MODE_AU
f5d0: 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 TO_RETRY);./* ha
f5e0: 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61 ndle new handsha
f5f0: 6b 65 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e kes in backgroun
f600: 64 2e 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 d. On by default
f610: 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e in OpenSSL 1.1.
f620: 31 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 1. */.#endif.
f630: 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 SSL_CTX_sess_se
f640: 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 t_cache_size(ctx
f650: 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 , 128);.. /*
f660: 53 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 Set user defined
f670: 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 ciphers, cipher
f680: 20 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 suites, and sec
f690: 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 urity level */.
f6a0: 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 20 if ((ciphers
f6b0: 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c != NULL) && !SSL
f6c0: 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f _CTX_set_cipher_
f6d0: 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 list(ctx, cipher
f6e0: 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e s)) {..Tcl_Appen
f6f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
f700: 22 53 65 74 20 63 69 70 68 65 72 73 20 66 61 69 "Set ciphers fai
f710: 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 led: No valid ci
f720: 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 phers", (char *)
f730: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
f740: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
f750: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
f760: 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 if ((ciphers
f770: 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 uites != NULL) &
f780: 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 & !SSL_CTX_set_c
f790: 69 70 68 65 72 73 75 69 74 65 73 28 63 74 78 2c iphersuites(ctx,
f7a0: 20 63 69 70 68 65 72 73 75 69 74 65 73 29 29 20 ciphersuites))
f7b0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
f7c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 ult(interp, "Set
f7d0: 20 63 69 70 68 65 72 20 73 75 69 74 65 73 20 66 cipher suites f
f7e0: 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 ailed: No valid
f7f0: 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 ciphers", (char
f800: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 *) NULL);..SSL_C
f810: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 TX_free(ctx);..r
f820: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
f830: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 }.. /* Set se
f840: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a curity level */.
f850: 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 if (level >
f860: 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 -1 && level < 6)
f870: 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 {../* SSL_set_s
f880: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f ecurity_level */
f890: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 ..SSL_CTX_set_se
f8a0: 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 curity_level(ctx
f8b0: 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a , level);. }.
f8c0: 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 . /* set some
f8d0: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 callbacks */.
f8e0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 SSL_CTX_set_de
f8f0: 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 fault_passwd_cb(
f900: 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c ctx, PasswordCal
f910: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f lback);. SSL_
f920: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
f930: 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 passwd_cb_userda
f940: 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 ta(ctx, (void *)
f950: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
f960: 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 65 /* read a Diffie
f970: 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 -Hellman paramet
f980: 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 ers file, or use
f990: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e the built-in on
f9a0: 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e e */.#ifdef OPEN
f9b0: 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 SSL_NO_DH. if
f9c0: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 (DHparams != NU
f9d0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
f9e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
f9f0: 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 "DH parameter su
fa00: 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 pport not availa
fa10: 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ble", (char *) N
fa20: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
fa30: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
fa40: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
fa50: 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 lse. {..DH* d
fa60: 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 h;..if (DHparams
fa70: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
fa80: 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 BIO *bio;..
fa90: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
faa0: 26 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d &ds);.. bio =
fab0: 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 BIO_new_file(F2
fac0: 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 N(DHparams, &ds)
fad0: 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 , "r");.. if
fae0: 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 (!bio) {...Tcl_D
faf0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
fb00: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
fb10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 ult(interp, "Cou
fb20: 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 ld not find DH p
fb30: 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c arameters file",
fb40: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
fb50: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
fb60: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e ctx);...return N
fb70: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ULL;.. }...
fb80: 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f dh = PEM_read_
fb90: 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f bio_DHparams(bio
fba0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 , NULL, NULL, NU
fbb0: 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 LL);.. BIO_fr
fbc0: 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 ee(bio);.. Tc
fbd0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
fbe0: 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 s);.. if (!dh
fbf0: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
fc00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
fc10: 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 Could not read D
fc20: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f H parameters fro
fc30: 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a m file", (char *
fc40: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
fc50: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
fc60: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 return NULL;..
fc70: 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 }..} else {..
fc80: 20 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50 61 dh = get_dhPa
fc90: 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f rams();..}..SSL_
fca0: 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 CTX_set_tmp_dh(c
fcb0: 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 tx, dh);..DH_fre
fcc0: 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e e(dh);. }.#en
fcd0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 dif.. /* set
fce0: 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20 our certificate
fcf0: 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 */. load_priv
fd00: 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 ate_key = 0;.
fd10: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d if (certfile !=
fd20: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 NULL) {..load_p
fd30: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a rivate_key = 1;.
fd40: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 ..Tcl_DStringIni
fd50: 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 t(&ds);...if (SS
fd60: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 L_CTX_use_certif
fd70: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 icate_file(ctx,
fd80: 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 F2N(certfile, &d
fd90: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 s), SSL_FILETYPE
fda0: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 _PEM) <= 0) {..
fdb0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
fdc0: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 ee(&ds);.. Tc
fdd0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
fde0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
fdf0: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 o set certificat
fe00: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 e file ", certfi
fe10: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 le, ": ",....
fe20: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 REASON(), (cha
fe30: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
fe40: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
fe50: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
fe60: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 NULL;..}. } e
fe70: 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 lse if (cert !=
fe80: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 NULL) {..load_pr
fe90: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 ivate_key = 1;..
fea0: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f if (SSL_CTX_use_
feb0: 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 certificate_ASN1
fec0: 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 (ctx, cert_len,
fed0: 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 cert) <= 0) {..
fee0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
fef0: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 ee(&ds);.. Tc
ff00: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
ff10: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
ff20: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 o set certificat
ff30: 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 e: ",.... RE
ff40: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
ff50: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c NULL);.. SSL
ff60: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
ff70: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c . return NULL
ff80: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
ff90: 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 {..certfile = (c
ffa0: 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 har*)X509_get_de
ffb0: 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 fault_cert_file(
ffc0: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 );...if (SSL_CTX
ffd0: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 _use_certificate
ffe0: 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 _file(ctx, certf
fff0: 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ile, SSL_FILETYP
10000 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 E_PEM) <= 0) {.#
10010 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 if 0.. Tcl_DS
10020 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
10030 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
10040 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
10050 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 nable to use def
10060 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 ault certificate
10070 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c file ", certfil
10080 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 e, ": ",....
10090 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
100a0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
100b0 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
100c0 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
100d0 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 ULL;.#endif..}.
100e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 }.. /* set
100f0 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 our private key
10100 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 */. if (load
10110 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a _private_key) {.
10120 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 .if (keyfile ==
10130 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e NULL && key == N
10140 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 ULL) {.. keyf
10150 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a ile = certfile;.
10160 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 .}...if (keyfile
10170 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
10180 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 /* get the priv
10190 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 ate key associat
101a0 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 ed with this cer
101b0 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 tificate */..
101c0 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 if (keyfile ==
101d0 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c NULL) {...keyfil
101e0 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 e = certfile;..
101f0 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 }... if (S
10200 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 SL_CTX_use_Priva
10210 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 teKey_file(ctx,
10220 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 F2N(keyfile, &ds
10230 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f ), SSL_FILETYPE_
10240 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 PEM) <= 0) {...T
10250 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
10260 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 ds);.../* flush
10270 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 the passphrase w
10280 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 hich might be le
10290 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 ft in the result
102a0 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 */...Tcl_SetRes
102b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c ult(interp, NULL
102c0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 , TCL_STATIC);..
102d0 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
102e0 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
102f0 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 e to set public
10300 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 key file ", keyf
10310 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 ile, " ",....
10320 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 REASON(),
10330 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
10340 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
10350 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
10360 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 LL;.. }..
10370 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
10380 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 &ds);...} else i
10390 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 f (key != NULL)
103a0 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 {.. if (SSL_C
103b0 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 TX_use_PrivateKe
103c0 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f y_ASN1(EVP_PKEY_
103d0 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 RSA, ctx, key,ke
103e0 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 y_len) <= 0) {..
103f0 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
10400 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 (&ds);.../* flus
10410 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 h the passphrase
10420 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 which might be
10430 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 left in the resu
10440 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 lt */...Tcl_SetR
10450 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 esult(interp, NU
10460 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b LL, TCL_STATIC);
10470 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
10480 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
10490 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 ble to set publi
104a0 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e c key: ", REASON
104b0 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
104c0 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
104d0 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
104e0 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 n NULL;.. }..
104f0 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f }../* Now we kno
10500 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 w that a key and
10510 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 cert have been
10520 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 set against.. *
10530 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 the SSL context
10540 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 */..if (!SSL_CTX
10550 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b _check_private_k
10560 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 ey(ctx)) {..
10570 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
10580 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 (interp, "privat
10590 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d e key does not m
105a0 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69 atch the certifi
105b0 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 cate public key"
105c0 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 20 ,.... (char
105d0 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
105e0 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
105f0 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
10600 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 LL;..}. }..
10610 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69 63 /* Set verific
10620 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 ation CAs */.
10630 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
10640 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 (&ds);. Tcl_D
10650 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 StringInit(&ds1)
10660 3b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 ;. /* There i
10670 73 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 64 69 s one default di
10680 72 65 63 74 6f 72 79 2c 20 6f 6e 65 20 64 65 66 rectory, one def
10690 61 75 6c 74 20 66 69 6c 65 2c 20 61 6e 64 20 6f ault file, and o
106a0 6e 65 20 64 65 66 61 75 6c 74 20 73 74 6f 72 65 ne default store
106b0 2e 0a 09 54 68 65 20 64 65 66 61 75 6c 74 20 43 ...The default C
106c0 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20 64 A certificates d
106d0 69 72 65 63 74 6f 72 79 20 28 61 6e 64 20 64 65 irectory (and de
106e0 66 61 75 6c 74 20 73 74 6f 72 65 29 20 69 73 20 fault store) is
106f0 69 6e 20 74 68 65 20 4f 70 65 6e 53 53 4c 0a 09 in the OpenSSL..
10700 63 65 72 74 73 20 64 69 72 65 63 74 6f 72 79 2e certs directory.
10710 20 49 74 20 63 61 6e 20 62 65 20 6f 76 65 72 72 It can be overr
10720 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c idden by the SSL
10730 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 _CERT_DIR env va
10740 72 2e 20 54 68 65 0a 09 64 65 66 61 75 6c 74 20 r. The..default
10750 43 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20 CA certificates
10760 66 69 6c 65 20 69 73 20 63 61 6c 6c 65 64 20 63 file is called c
10770 65 72 74 2e 70 65 6d 20 69 6e 20 74 68 65 20 64 ert.pem in the d
10780 65 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 09 efault OpenSSL..
10790 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20 63 61 directory. It ca
107a0 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 n be overridden
107b0 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f by the SSL_CERT_
107c0 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f FILE env var. */
107d0 0a 09 2f 2a 20 69 6e 74 20 53 53 4c 5f 43 54 58 ../* int SSL_CTX
107e0 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 _set_default_ver
107f0 69 66 79 5f 64 69 72 28 53 53 4c 5f 43 54 58 20 ify_dir(SSL_CTX
10800 2a 63 74 78 29 20 61 6e 64 20 69 6e 74 20 53 53 *ctx) and int SS
10810 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c L_CTX_set_defaul
10820 74 5f 76 65 72 69 66 79 5f 66 69 6c 65 28 53 53 t_verify_file(SS
10830 4c 5f 43 54 58 20 2a 63 74 78 29 20 2a 2f 0a 20 L_CTX *ctx) */.
10840 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f if (!SSL_CTX_
10850 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 load_verify_loca
10860 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 tions(ctx, F2N(C
10870 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e Afile, &ds), F2N
10880 28 43 41 64 69 72 2c 20 26 64 73 31 29 29 20 7c (CAdir, &ds1)) |
10890 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f |..!SSL_CTX_set_
108a0 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 default_verify_p
108b0 61 74 68 73 28 63 74 78 29 29 20 7b 0a 23 69 66 aths(ctx)) {.#if
108c0 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 0..Tcl_DStringF
108d0 72 65 65 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 ree(&ds);..Tcl_D
108e0 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 StringFree(&ds1)
108f0 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 ;../* Don't curr
10900 65 6e 74 6c 79 20 63 61 72 65 20 69 66 20 74 68 ently care if th
10910 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c is fails */..Tcl
10920 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
10930 74 65 72 70 2c 20 22 53 53 4c 20 64 65 66 61 75 terp, "SSL defau
10940 6c 74 20 76 65 72 69 66 79 20 70 61 74 68 73 3a lt verify paths:
10950 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 ", REASON(), (c
10960 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 har *) NULL);..S
10970 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
10980 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
10990 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
109a0 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 /* https://sou
109b0 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 rceforge.net/p/t
109c0 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 ls/bugs/57/ */.
109d0 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 /* XXX:TODO:
109e0 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70 Let the user sup
109f0 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 ply values here
10a00 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 instead of somet
10a10 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 hing that exists
10a20 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 on the filesyst
10a30 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 em */. if (CA
10a40 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
10a50 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e .STACK_OF(X509_N
10a60 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 AME) *certNames
10a70 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e = SSL_load_clien
10a80 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 t_CA_file(F2N(CA
10a90 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 file, &ds));..if
10aa0 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e (certNames != N
10ab0 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f ULL) {.. SSL_
10ac0 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 CTX_set_client_C
10ad0 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 A_list(ctx, cert
10ae0 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d Names);..}. }
10af0 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
10b00 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 gFree(&ds);.
10b10 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
10b20 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72 &ds1);. retur
10b30 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a n ctx;.}.../*. *
10b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 ---. *. * Status
10b90 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e ObjCmd -- return
10ba0 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 certificate for
10bb0 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e connected peer.
10bc0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
10bd0 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
10be0 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
10bf0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
10c00 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
10c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
10c50 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 */.static int.S
10c60 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 tatusObjCmd(Clie
10c70 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
10c80 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
10c90 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
10ca0 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
10cb0 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 objv[]) {. St
10cc0 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 ate *statePtr;.
10cd0 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 X509 *peer;.
10ce0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
10cf0 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e tr;. Tcl_Chan
10d00 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 nel chan;. ch
10d10 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c ar *channelName,
10d20 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 *ciphers;. i
10d30 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e nt mode;. con
10d40 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
10d50 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 *proto;. uns
10d60 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 igned int len;.
10d70 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b int nid, res;
10d80 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
10d90 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
10da0 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 (objc < 2 || ob
10db0 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 jc > 3 || (objc
10dc0 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70 28 == 3 && !strcmp(
10dd0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
10de0 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 jv[1]), "-local"
10df0 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 ))) {..Tcl_Wrong
10e00 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
10e10 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 1, objv, "?-loca
10e20 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 l? channel");..r
10e30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
10e40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 . }.. /* G
10e50 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f et channel Id */
10e60 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 . channelName
10e70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
10e80 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 28 6f 62 FromObj(objv[(ob
10e90 6a 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 jc == 2 ? 1 : 2)
10ea0 5d 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 63 68 ], NULL);. ch
10eb0 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
10ec0 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e nel(interp, chan
10ed0 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b nelName, &mode);
10ee0 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
10ef0 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
10f00 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
10f10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
10f20 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
10f30 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
10f40 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
10f50 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
10f60 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
10f70 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 nel(chan);. i
10f80 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
10f90 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
10fa0 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
10fb0 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
10fc0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
10fd0 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
10fe0 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
10ff0 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a me(chan),..."\":
11000 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
11010 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c el", NULL);..Tcl
11020 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
11030 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 terp, "TLS", "ST
11040 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 ATUS", "CHANNEL"
11050 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
11060 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
11070 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
11080 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 }. stateP
11090 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 tr = (State *) T
110a0 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
110b0 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b tanceData(chan);
110c0 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 .. /* Get cer
110d0 74 69 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 tificate for pee
110e0 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 r or self */.
110f0 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 if (objc == 2)
11100 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 {..peer = SSL_ge
11110 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 t_peer_certifica
11120 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
11130 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
11140 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f .peer = SSL_get_
11150 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 certificate(stat
11160 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
11170 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30 }. /* Get X50
11180 39 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 9 certificate in
11190 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 fo */. if (pe
111a0 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 er) {..objPtr =
111b0 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 Tls_NewX509Obj(i
111c0 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 nterp, peer);..i
111d0 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a f (objc == 2) {.
111e0 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70 . X509_free(p
111f0 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20 eer);.. peer
11200 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d = NULL;..}. }
11210 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 else {..objPtr
11220 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
11230 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d (0, NULL);. }
11240 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 .. /* Peer na
11250 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e me */. LAPPEN
11260 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11270 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 jPtr, "peername"
11280 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e , SSL_get0_peern
11290 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ame(statePtr->ss
112a0 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 l), -1);. LAP
112b0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
112c0 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22 objPtr, "sbits"
112d0 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 , SSL_get_cipher
112e0 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e _bits(statePtr->
112f0 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 ssl, NULL));..
11300 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 ciphers = (cha
11310 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 r*)SSL_get_ciphe
11320 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 r(statePtr->ssl)
11330 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 ;. LAPPEND_ST
11340 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11350 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 68 , "cipher", ciph
11360 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f ers, -1);.. /
11370 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 * Verify the X50
11380 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 9 certificate pr
11390 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 esented by the p
113a0 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 eer */. LAPPE
113b0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
113c0 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 65 bjPtr, "verifyRe
113d0 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 sult",..X509_ver
113e0 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 ify_cert_error_s
113f0 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 tring(SSL_get_ve
11400 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 rify_result(stat
11410 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 ePtr->ssl)), -1)
11420 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 ;.. /* Verify
11430 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 mode */. mod
11440 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 e = SSL_get_veri
11450 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 fy_mode(statePtr
11460 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 ->ssl);. if (
11470 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
11480 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 FY_NONE) {..LAPP
11490 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
114a0 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d objPtr, "verifyM
114b0 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 ode", "none", -1
114c0 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
114d0 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 .Tcl_Obj *listOb
114e0 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
114f0 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
11500 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c .if (mode && SSL
11510 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a _VERIFY_PEER) {.
11520 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
11530 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
11540 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 terp, listObjPtr
11550 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
11560 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b bj("peer", -1));
11570 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 ..}..if (mode &&
11580 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
11590 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
115a0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
115b0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
115c0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 t(interp, listOb
115d0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
115e0 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 ingObj("fail if
115f0 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d no peer cert", -
11600 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 1));..}..if (mod
11610 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f e && SSL_VERIFY_
11620 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 CLIENT_ONCE) {..
11630 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
11640 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
11650 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c erp, listObjPtr,
11660 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
11670 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c j("client once",
11680 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d -1));..}..if (m
11690 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
116a0 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 Y_POST_HANDSHAKE
116b0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
116c0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
116d0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 t(interp, listOb
116e0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
116f0 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e ingObj("post han
11700 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 dshake", -1));..
11710 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 }..LAPPEND_OBJ(i
11720 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11730 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 verifyMode", lis
11740 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a tObjPtr). }..
11750 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f /* Verify mo
11760 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 de depth */.
11770 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
11780 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 rp, objPtr, "ver
11790 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 ifyDepth", SSL_g
117a0 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 et_verify_depth(
117b0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b statePtr->ssl));
117c0 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 .. /* Report
117d0 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f the selected pro
117e0 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c tocol as a resul
117f0 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 t of the negotia
11800 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f tion */. SSL_
11810 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 get0_alpn_select
11820 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ed(statePtr->ssl
11830 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b , &proto, &len);
11840 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
11850 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11860 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a "alpn", (char *
11870 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 )proto, (int) le
11880 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f n);. LAPPEND_
11890 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
118a0 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 tr, "protocol",
118b0 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 SSL_get_version(
118c0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 statePtr->ssl),
118d0 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c -1);.. /* Val
118e0 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 id for non-RSA s
118f0 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 ignature and TLS
11900 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 1.3 */. if (
11910 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 objc == 2) {..re
11920 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 s = SSL_get_peer
11930 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 _signature_nid(s
11940 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e tatePtr->ssl, &n
11950 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 id);. } else
11960 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 {..res = SSL_get
11970 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 _signature_nid(s
11980 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e tatePtr->ssl, &n
11990 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 id);. }. i
119a0 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 f (!res) {nid =
119b0 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 0;}. LAPPEND_
119c0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
119d0 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 tr, "signatureHa
119e0 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 shAlgorithm", OB
119f0 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d J_nid2ln(nid), -
11a00 31 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 1);.. if (obj
11a10 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d c == 2) {..res =
11a20 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 SSL_get_peer_si
11a30 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 gnature_type_nid
11a40 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
11a50 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 &nid);. } els
11a60 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 e {..res = SSL_g
11a70 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 et_signature_typ
11a80 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
11a90 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 ssl, &nid);.
11aa0 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 }. if (!res)
11ab0 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c {nid = 0;}. L
11ac0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11ad0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e p, objPtr, "sign
11ae0 61 74 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f atureType", OBJ_
11af0 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 nid2ln(nid), -1)
11b00 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 ;.. Tcl_SetOb
11b10 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
11b20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 objPtr);. ret
11b30 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
11b40 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
11b50 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
11b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ba0 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 --. *. * Connect
11bb0 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d ionInfoObjCmd --
11bc0 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 return connecti
11bd0 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 on info from Ope
11be0 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 nSSL.. *. * Resu
11bf0 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f lts:. *.A list o
11c00 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 f connection inf
11c10 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d o. *. *--------
11c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
11c60 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e .static int Conn
11c70 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 ectionInfoObjCmd
11c80 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
11c90 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
11ca0 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
11cb0 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
11cc0 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
11cd0 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
11ce0 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
11cf0 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
11d00 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 de on */. Sta
11d10 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f te *statePtr;../
11d20 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
11d30 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
11d40 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
11d50 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a jPtr, *listPtr;.
11d60 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 const SSL *s
11d70 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 sl;. const SS
11d80 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 L_CIPHER *cipher
11d90 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f ;. const SSL_
11da0 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e SESSION *session
11db0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f ;. const EVP_
11dc0 4d 44 20 2a 6d 64 3b 0a 0a 20 20 20 20 69 66 20 MD *md;.. if
11dd0 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
11de0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
11df0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
11e00 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
11e10 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
11e20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e . }.. chan
11e30 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
11e40 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
11e50 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
11e60 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e bjv[1], NULL), N
11e70 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 ULL);. if (ch
11e80 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
11e90 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
11ea0 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
11eb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
11ec0 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
11ed0 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
11ee0 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
11ef0 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
11f00 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
11f10 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
11f20 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
11f30 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
11f40 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 Type()) {..Tcl_A
11f50 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
11f60 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
11f70 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
11f80 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
11f90 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 . "\": not a
11fa0 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
11fb0 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 LL);..Tcl_SetErr
11fc0 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
11fd0 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f TLS", "CONNECTIO
11fe0 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 N", "CHANNEL", "
11ff0 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
12000 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
12010 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
12020 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 }.. objPtr
12030 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
12040 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 (0, NULL);..
12050 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e /* Connection in
12060 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 fo */. stateP
12070 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 tr = (State *)Tc
12080 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
12090 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
120a0 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 ssl = stateP
120b0 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 tr->ssl;. if
120c0 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl != NULL) {.
120d0 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 ./* connection s
120e0 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 tate */..LAPPEND
120f0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12100 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53 Ptr, "state", SS
12110 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c L_state_string_l
12120 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a ong(ssl), -1);..
12130 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 ./* Get SNI requ
12140 65 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d ested server nam
12150 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 e */..LAPPEND_ST
12160 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
12170 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 , "servername",
12180 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 SSL_get_serverna
12190 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e me(ssl, TLSEXT_N
121a0 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d AMETYPE_host_nam
121b0 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 e), -1);.../* Ge
121c0 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c t protocol */..L
121d0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
121e0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 p, objPtr, "prot
121f0 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 ocol", SSL_get_v
12200 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 ersion(ssl), -1)
12210 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 ;.../* Renegotia
12220 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a tion allowed */.
12230 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
12240 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 terp, objPtr, "r
12250 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c enegotiation_all
12260 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 owed", SSL_get_s
12270 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 ecure_renegotiat
12280 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 ion_support(ssl)
12290 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 );.../* Get secu
122a0 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c rity level */..L
122b0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
122c0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 p, objPtr, "secu
122d0 72 69 74 79 6c 65 76 65 6c 22 2c 20 53 53 4c 5f ritylevel", SSL_
122e0 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 get_security_lev
122f0 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 el(ssl));.../* S
12300 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 ession info */..
12310 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
12320 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
12330 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 ssion_reused", S
12340 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 SL_session_reuse
12350 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 d(ssl));.../* Is
12360 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a server info */.
12370 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
12380 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 terp, objPtr, "i
12390 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 s_server", SSL_i
123a0 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a s_server(ssl));.
123b0 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a ../* Is DTLS */.
123c0 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
123d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 terp, objPtr, "i
123e0 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f s_dtls", SSL_is_
123f0 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 20 dtls(ssl));.
12400 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72 }.. /* Cipher
12410 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 info */. cip
12420 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 her = SSL_get_cu
12430 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c rrent_cipher(ssl
12440 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 );. if (ciphe
12450 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 r != NULL) {..ch
12460 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d ar buf[BUFSIZ] =
12470 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c {0};..int bits,
12480 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 alg_bits;.../*
12490 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 Cipher name */..
124a0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
124b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
124c0 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 her", SSL_CIPHER
124d0 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 _get_name(cipher
124e0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 ), -1);.../* RFC
124f0 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 name of cipher
12500 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
12510 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12520 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c "standard_name",
12530 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e SSL_CIPHER_stan
12540 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 dard_name(cipher
12550 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 ), -1);.../* Ope
12560 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 nSSL name of cip
12570 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
12580 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12590 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d tr, "openssl_nam
125a0 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 e", OPENSSL_ciph
125b0 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 er_name(SSL_CIPH
125c0 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 ER_standard_name
125d0 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
125e0 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 ../* number of s
125f0 65 63 72 65 74 20 62 69 74 73 20 75 73 65 64 20 ecret bits used
12600 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 for cipher */..b
12610 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 its = SSL_CIPHER
12620 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 _get_bits(cipher
12630 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c , &alg_bits);..L
12640 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
12650 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 p, objPtr, "secr
12660 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b et_bits", bits);
12670 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
12680 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 terp, objPtr, "a
12690 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 lgorithm_bits",
126a0 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 alg_bits);../* a
126b0 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 lg_bits is actua
126c0 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 l key secret bit
126d0 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 61 s. If use bits a
126e0 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 nd secret (algor
126f0 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 ithm) bits diffe
12700 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 r,.. the rest
12710 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20 of the bits are
12720 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 fixed, i.e. for
12730 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 limited export c
12740 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 iphers (bits < 5
12750 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 6) */.../* Indic
12760 61 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54 ates which SSL/T
12770 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 LS protocol vers
12780 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65 ion first define
12790 64 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a d the cipher */.
127a0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
127b0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 erp, objPtr, "mi
127c0 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f n_version", SSL_
127d0 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 CIPHER_get_versi
127e0 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b on(cipher), -1);
127f0 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 .../* Cipher NID
12800 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
12810 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12820 20 22 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63 "cipherNID", (c
12830 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e har *)OBJ_nid2ln
12840 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f (SSL_CIPHER_get_
12850 63 69 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65 cipher_nid(ciphe
12860 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 r)), -1);..LAPPE
12870 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
12880 62 6a 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49 bjPtr, "digestNI
12890 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f D", (char *)OBJ_
128a0 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 nid2ln(SSL_CIPHE
128b0 52 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 R_get_digest_nid
128c0 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
128d0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
128e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 erp, objPtr, "ke
128f0 79 45 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 yExchangeNID", (
12900 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c char *)OBJ_nid2l
12910 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 n(SSL_CIPHER_get
12920 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29 _kx_nid(cipher))
12930 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f , -1);..LAPPEND_
12940 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12950 74 72 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74 tr, "authenticat
12960 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a ionNID", (char *
12970 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f )OBJ_nid2ln(SSL_
12980 43 49 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f CIPHER_get_auth_
12990 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
129a0 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 );.../* message
129b0 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 authentication c
129c0 6f 64 65 20 2d 20 43 69 70 68 65 72 20 69 73 20 ode - Cipher is
129d0 41 45 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f AEAD (e.g. GCM o
129e0 72 20 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 r ChaCha20/Poly1
129f0 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 305) or not */..
12a00 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 74 65 64 /* Authenticated
12a10 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68 Encryption with
12a20 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 associated data
12a30 20 28 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f (AEAD) check */
12a40 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
12a50 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12a60 63 69 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c cipher_is_aead",
12a70 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 SSL_CIPHER_is_a
12a80 65 61 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 ead(cipher));...
12a90 2f 2a 20 44 69 67 65 73 74 20 75 73 65 64 20 64 /* Digest used d
12aa0 75 72 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c uring the SSL/TL
12ab0 53 20 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e S handshake when
12ac0 20 75 73 69 6e 67 20 74 68 65 20 63 69 70 68 65 using the ciphe
12ad0 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f r. */..md = SSL_
12ae0 43 49 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 CIPHER_get_hands
12af0 68 61 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68 hake_digest(ciph
12b00 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 er);..LAPPEND_ST
12b10 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
12b20 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 , "handshake_dig
12b30 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56 est", (char *)EV
12b40 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d P_MD_name(md), -
12b50 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 1);.../* Get Ope
12b60 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 nSSL-specific ID
12b70 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f , not IANA ID */
12b80 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
12b90 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
12ba0 69 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 ipher_id", (int)
12bb0 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
12bc0 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f id(cipher));.../
12bd0 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73 * Two-byte ID us
12be0 65 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72 ed in the TLS pr
12bf0 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 otocol of the gi
12c00 76 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c ven cipher */..L
12c10 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
12c20 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 p, objPtr, "prot
12c30 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 ocol_id", (int)
12c40 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 SSL_CIPHER_get_p
12c50 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 rotocol_id(ciphe
12c60 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 r));.../* Textua
12c70 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 l description of
12c80 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 the cipher */..
12c90 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 if (SSL_CIPHER_d
12ca0 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 escription(ciphe
12cb0 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 r, buf, sizeof(b
12cc0 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a uf)) != NULL) {.
12cd0 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
12ce0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12cf0 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 "description",
12d00 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 buf, -1);..}.
12d10 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 }.. /* Sessi
12d20 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 on info */. s
12d30 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 ession = SSL_get
12d40 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 _session(ssl);.
12d50 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21 if (session !
12d60 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 = NULL) {..const
12d70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
12d80 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 ticket;..size_t
12d90 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 len2;..unsigned
12da0 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 int ulen;..const
12db0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
12dc0 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f session_id, *pro
12dd0 74 6f 3b 0a 09 63 68 61 72 20 62 75 66 66 65 72 to;..char buffer
12de0 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f [SSL_MAX_MASTER_
12df0 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f KEY_LENGTH];.../
12e00 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c * Report the sel
12e10 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 ected protocol a
12e20 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 s a result of th
12e30 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 e ALPN negotiati
12e40 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 on */..SSL_SESSI
12e50 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c ON_get0_alpn_sel
12e60 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 ected(session, &
12e70 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 proto, &len2);..
12e80 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12e90 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 rp, objPtr, "alp
12ea0 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f n", (char *) pro
12eb0 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 3b to, (int) len2);
12ec0 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 .../* Report the
12ed0 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 selected protoc
12ee0 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f ol as a result o
12ef0 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 f the NPN negoti
12f00 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 ation */.#ifdef
12f10 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 USE_NPN..SSL_get
12f20 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 0_next_proto_neg
12f30 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 otiated(ssl, &pr
12f40 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 oto, &ulen);..LA
12f50 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12f60 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c , objPtr, "npn",
12f70 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c (char *) proto,
12f80 20 28 69 6e 74 29 20 75 6c 65 6e 29 3b 0a 23 65 (int) ulen);.#e
12f90 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 ndif.../* Resuma
12fa0 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 ble session */..
12fb0 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
12fc0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 erp, objPtr, "re
12fd0 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 sumable", SSL_SE
12fe0 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 SSION_is_resumab
12ff0 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 le(session));...
13000 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 /* Session start
13010 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 time (seconds s
13020 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 ince epoch) */..
13030 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 LAPPEND_LONG(int
13040 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 erp, objPtr, "st
13050 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 art_time", SSL_S
13060 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 ESSION_get_time(
13070 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 session));.../*
13080 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 Timeout value -
13090 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 SSL_CTX_get_time
130a0 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 out (in seconds)
130b0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e */..LAPPEND_LON
130c0 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 G(interp, objPtr
130d0 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c , "timeout", SSL
130e0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d _SESSION_get_tim
130f0 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a eout(session));.
13100 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 ../* Session id
13110 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 - TLSv1.2 and be
13120 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 low only */..ses
13130 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 sion_id = SSL_SE
13140 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 SSION_get_id(ses
13150 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c sion, &ulen);..L
13160 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e APPEND_BARRAY(in
13170 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
13180 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 ession_id", sess
13190 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c ion_id, (int) ul
131a0 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f en);.../* Sessio
131b0 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 n context */..se
131c0 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 ssion_id = SSL_S
131d0 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 ESSION_get0_id_c
131e0 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 ontext(session,
131f0 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 &ulen);..LAPPEND
13200 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
13210 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e objPtr, "session
13220 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69 _context", sessi
13230 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c 65 on_id, (int) ule
13240 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e n);.../* Session
13250 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 ticket - client
13260 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 only */..SSL_SE
13270 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 SSION_get0_ticke
13280 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b t(session, &tick
13290 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 et, &len2);..LAP
132a0 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 PEND_BARRAY(inte
132b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 rp, objPtr, "ses
132c0 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 sion_ticket", ti
132d0 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 cket, (int) len2
132e0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
132f0 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 ticket lifetime
13300 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 hint (in seconds
13310 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f ) */..LAPPEND_LO
13320 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NG(interp, objPt
13330 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 r, "lifetime", S
13340 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 SL_SESSION_get_t
13350 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 icket_lifetime_h
13360 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a int(session));..
13370 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 ./* Ticket app d
13380 61 74 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 ata */..SSL_SESS
13390 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f ION_get0_ticket_
133a0 61 70 70 64 61 74 61 28 73 65 73 73 69 6f 6e 2c appdata(session,
133b0 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 &ticket, &len2)
133c0 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 ;..LAPPEND_BARRA
133d0 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 Y(interp, objPtr
133e0 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 , "ticket_app_da
133f0 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 69 6e ta", ticket, (in
13400 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 47 t) len2);.../* G
13410 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f et master key */
13420 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 ..len2 = SSL_SES
13430 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f SION_get_master_
13440 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 key(session, buf
13450 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 fer, SSL_MAX_MAS
13460 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b TER_KEY_LENGTH);
13470 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
13480 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
13490 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 "master_key", b
134a0 75 66 66 65 72 2c 20 28 69 6e 74 29 20 6c 65 6e uffer, (int) len
134b0 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 2);.../* Compres
134c0 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 sion id */..unsi
134d0 67 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 gned int id = SS
134e0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f L_SESSION_get_co
134f0 6d 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f mpress_id(sessio
13500 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 n);..LAPPEND_STR
13510 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
13520 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 "compression_id
13530 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c ", id == 1 ? "zl
13540 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 ib" : "none", -1
13550 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
13560 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 Compression inf
13570 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c o */. if (ssl
13580 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 != NULL) {.#ifd
13590 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 ef HAVE_SSL_COMP
135a0 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 RESSION..const C
135b0 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 OMP_METHOD *comp
135c0 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d , *expn;..comp =
135d0 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 SSL_get_current
135e0 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c _compression(ssl
135f0 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 );..expn = SSL_g
13600 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e et_current_expan
13610 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 sion(ssl);...LAP
13620 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
13630 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 objPtr, "compre
13640 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 ssion", comp ? S
13650 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 SL_COMP_get_name
13660 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c (comp) : "none",
13670 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 -1);..LAPPEND_S
13680 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
13690 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 r, "expansion",
136a0 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f expn ? SSL_COMP_
136b0 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a get_name(expn) :
136c0 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 "none", -1);.#e
136d0 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 lse..LAPPEND_STR
136e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
136f0 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 "compression",
13700 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 "none", -1);..LA
13710 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
13720 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e , objPtr, "expan
13730 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d sion", "none", -
13740 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 1);.#endif. }
13750 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 .. /* Server
13760 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c info */. {..l
13770 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 ong mode = SSL_C
13780 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 TX_get_session_c
13790 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 ache_mode(stateP
137a0 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 tr->ctx);..char
137b0 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 *msg;...if (mode
137c0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
137d0 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 E_OFF) {.. ms
137e0 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c g = "off";..} el
137f0 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 se if (mode & SS
13800 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 L_SESS_CACHE_CLI
13810 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 ENT) {.. msg
13820 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 = "client";..} e
13830 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 lse if (mode & S
13840 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 SL_SESS_CACHE_SE
13850 52 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 RVER) {.. msg
13860 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 = "server";..}
13870 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 else if (mode &
13880 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 SSL_SESS_CACHE_B
13890 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 OTH) {.. msg
138a0 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 = "both";..} els
138b0 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 e {.. msg = "
138c0 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 unknown";..}..LA
138d0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
138e0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 , objPtr, "sessi
138f0 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 on_cache_mode",
13900 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a msg, -1);. }.
13910 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 . /* CA List
13920 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 */. /* IF not
13930 20 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 a server, same
13940 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 as SSL_get0_peer
13950 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 _CA_list. If ser
13960 76 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f ver same as SSL_
13970 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 CTX_get_client_C
13980 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 A_list */. li
13990 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c stPtr = Tcl_NewL
139a0 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
139b0 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 . STACK_OF(X5
139c0 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 09_NAME) *ca_lis
139d0 74 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c t;. if ((ca_l
139e0 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c ist = SSL_get_cl
139f0 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c ient_CA_list(ssl
13a00 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 )) != NULL) {..c
13a10 68 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 har buffer[BUFSI
13a20 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 Z];..for (int i
13a30 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 = 0; i < sk_X509
13a40 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 _NAME_num(ca_lis
13a50 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 t); i++) {..
13a60 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 X509_NAME *name
13a70 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 = sk_X509_NAME_v
13a80 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 alue(ca_list, i)
13a90 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 ;.. if (name)
13aa0 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f {...X509_NAME_o
13ab0 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 neline(name, buf
13ac0 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 fer, BUFSIZ);...
13ad0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
13ae0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
13af0 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 listPtr, Tcl_Ne
13b00 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 wStringObj(buffe
13b10 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a r, -1));.. }.
13b20 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 .}. }. LAP
13b30 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c PEND_OBJ(interp,
13b40 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 objPtr, "caList
13b50 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 ", listPtr);.
13b60 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 LAPPEND_INT(int
13b70 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 erp, objPtr, "ca
13b80 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 ListCount", sk_X
13b90 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 509_NAME_num(ca_
13ba0 6c 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c list));.. Tcl
13bb0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
13bc0 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 terp, objPtr);.
13bd0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
13be0 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
13bf0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
13c00 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
13c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c40 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d --------. *. * M
13c50 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 iscObjCmd -- mis
13c60 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a c commands. *. *
13c70 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
13c80 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
13c90 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
13ca0 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
13cb0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
13cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
13d00 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a atic int.MiscObj
13d10 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
13d20 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
13d30 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
13d40 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
13d50 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
13d60 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e {. static con
13d70 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 st char *command
13d80 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 s [] = { "req",
13d90 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d "strreq", NULL }
13da0 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 ;. enum comma
13db0 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 nd { C_REQ, C_ST
13dc0 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b RREQ, C_DUMMY };
13dd0 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c 20 69 73 . int cmd, is
13de0 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 Str;. char bu
13df0 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 ffer[16384];..
13e00 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
13e10 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
13e20 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 jc < 2) {..Tcl_W
13e30 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
13e40 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 rp, 1, objv, "su
13e50 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 bcommand ?args?"
13e60 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
13e70 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
13e80 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
13e90 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
13ea0 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 objv[1], command
13eb0 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c s, "command", 0,
13ec0 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b &cmd) != TCL_OK
13ed0 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
13ee0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
13ef0 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
13f00 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 r();.. isStr
13f10 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 = (cmd == C_STRR
13f20 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 EQ);. switch
13f30 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 ((enum command)
13f40 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 cmd) {..case C_R
13f50 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 EQ:..case C_STRR
13f60 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 EQ: {.. EVP_P
13f70 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a KEY *pkey=NULL;.
13f80 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d . X509 *cert=
13f90 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f NULL;.. X509_
13fa0 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b NAME *name=NULL;
13fb0 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a .. Tcl_Obj **
13fc0 6c 69 73 74 76 3b 0a 09 20 20 20 20 69 6e 74 20 listv;.. int
13fd0 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 listc,i;... B
13fe0 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 IO *out=NULL;...
13ff0 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 char *k_C=""
14000 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 ,*k_ST="",*k_L="
14010 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d ",*k_O="",*k_OU=
14020 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 "",*k_CN="",*k_E
14030 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 mail="";.. ch
14040 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f ar *keyout,*pemo
14050 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e ut,*str;.. in
14060 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c t keysize,serial
14070 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 =0,days=365;..#i
14080 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
14090 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
140a0 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 00000L.. BIGN
140b0 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a UM *bne = NULL;.
140c0 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 . RSA *rsa =
140d0 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 NULL;.#else..
140e0 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 EVP_PKEY_CTX *c
140f0 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 tx = NULL;.#endi
14100 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a f... if ((obj
14110 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 c<5) || (objc>6)
14120 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e ) {...Tcl_WrongN
14130 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 umArgs(interp, 2
14140 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 , objv, "keysize
14150 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c keyfile certfil
14160 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 e ?info?");...re
14170 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
14180 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 . }... if
14190 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
141a0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
141b0 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 2], &keysize) !=
141c0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 TCL_OK) {...ret
141d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
141e0 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 }.. keyou
141f0 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 t=Tcl_GetString(
14200 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 objv[3]);.. p
14210 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 emout=Tcl_GetStr
14220 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 ing(objv[4]);..
14230 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a if (isStr) {.
14240 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 ..Tcl_SetVar(int
14250 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 erp,keyout,"",0)
14260 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 ;...Tcl_SetVar(i
14270 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c nterp,pemout,"",
14280 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 0);.. }...
14290 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a if (objc>=6) {.
142a0 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 ..if (Tcl_ListOb
142b0 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 jGetElements(int
142c0 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 erp, objv[5],...
142d0 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 .&listc, &listv)
142e0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 != TCL_OK) {...
142f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
14300 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 RROR;...}....if
14310 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 ((listc%2) != 0)
14320 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 {... Tcl_Set
14330 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 Result(interp,"I
14340 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 nformation list
14350 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e must have even n
14360 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e umber of argumen
14370 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 ts",NULL);...
14380 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
14390 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d R;...}...for (i=
143a0 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 0; i<listc; i+=2
143b0 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 ) {... str=Tc
143c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
143d0 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 v[i]);... if
143e0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 (strcmp(str,"day
143f0 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 s")==0) {....if
14400 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
14410 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b bj(interp,listv[
14420 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c i+1],&days)!=TCL
14430 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 _OK).... retu
14440 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
14450 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
14460 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 trcmp(str,"seria
14470 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 l")==0) {....if
14480 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
14490 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b bj(interp,listv[
144a0 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 i+1],&serial)!=T
144b0 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 CL_OK).... re
144c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
144d0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
144e0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 (strcmp(str,"C")
144f0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 ==0) {....k_C=Tc
14500 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
14510 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
14520 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
14530 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b (str,"ST")==0) {
14540 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 ....k_ST=Tcl_Get
14550 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
14560 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
14570 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
14580 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "L")==0) {....k_
14590 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 L=Tcl_GetString(
145a0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
145b0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
145c0 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 rcmp(str,"O")==0
145d0 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 ) {....k_O=Tcl_G
145e0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
145f0 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
14600 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
14610 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 r,"OU")==0) {...
14620 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 .k_OU=Tcl_GetStr
14630 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
14640 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
14650 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e (strcmp(str,"CN
14660 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e ")==0) {....k_CN
14670 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
14680 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
14690 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
146a0 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 cmp(str,"Email")
146b0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 ==0) {....k_Emai
146c0 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 l=Tcl_GetString(
146d0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
146e0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 } else {....T
146f0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
14700 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 erp,"Unknown par
14710 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 ameter",NULL);..
14720 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
14730 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a OR;... }...}.
14740 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e . }..#if OPEN
14750 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
14760 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
14770 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e .. bne = BN_n
14780 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d ew();.. rsa =
14790 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 RSA_new();..
147a0 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 pkey = EVP_PKEY
147b0 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 _new();.. if
147c0 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 (bne == NULL ||
147d0 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 rsa == NULL || p
147e0 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 key == NULL || !
147f0 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c BN_set_word(bne,
14800 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 RSA_F4) ||...!RS
14810 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 A_generate_key_e
14820 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 x(rsa, keysize,
14830 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 bne, NULL) || !E
14840 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 VP_PKEY_assign_R
14850 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b SA(pkey, rsa)) {
14860 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
14870 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 (pkey);.../* RSA
14880 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 _free(rsa); free
14890 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 d by EVP_PKEY_fr
148a0 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 ee */...BN_free(
148b0 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 bne);.#else..
148c0 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f pkey = EVP_RSA_
148d0 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e gen((unsigned in
148e0 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 t) keysize);..
148f0 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 ctx = EVP_PKEY
14900 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 _CTX_new(pkey,NU
14910 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b LL);.. if (pk
14920 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 ey == NULL || ct
14930 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 x == NULL || !EV
14940 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e P_PKEY_keygen_in
14950 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 it(ctx) ||...!EV
14960 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 P_PKEY_CTX_set_r
14970 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 sa_keygen_bits(c
14980 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 tx, keysize) ||
14990 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e !EVP_PKEY_keygen
149a0 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a (ctx, &pkey)) {.
149b0 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 ..EVP_PKEY_free(
149c0 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 pkey);...EVP_PKE
149d0 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b Y_CTX_free(ctx);
149e0 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 .#endif...Tcl_Se
149f0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
14a00 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 Error generating
14a10 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 private key",NU
14a20 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 LL);...return TC
14a30 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 L_ERROR;.. }
14a40 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 else {...if (isS
14a50 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d tr) {... out=
14a60 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 BIO_new(BIO_s_me
14a70 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f m());... PEM_
14a80 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 write_bio_Privat
14a90 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 eKey(out,pkey,NU
14aa0 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e LL,NULL,0,NULL,N
14ab0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 ULL);... i=BI
14ac0 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 O_read(out,buffe
14ad0 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 r,sizeof(buffer)
14ae0 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c -1);... i=(i<
14af0 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 0) ? 0 : i;...
14b00 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 buffer[i]='\0'
14b10 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 ;... Tcl_SetV
14b20 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 ar(interp,keyout
14b30 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 ,buffer,0);...
14b40 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 BIO_flush(out)
14b50 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 ;... BIO_free
14b60 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 (out);...} else
14b70 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f {... out=BIO_
14b80 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 new(BIO_s_file()
14b90 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 );... BIO_wri
14ba0 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c te_filename(out,
14bb0 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 keyout);... P
14bc0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 EM_write_bio_Pri
14bd0 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 vateKey(out,pkey
14be0 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c ,NULL,NULL,0,NUL
14bf0 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f L,NULL);... /
14c00 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f * PEM_write_bio_
14c10 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 RSAPrivateKey(ou
14c20 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 t, rsa, NULL, NU
14c30 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c LL, 0, NULL, NUL
14c40 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f L); */... BIO
14c50 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a _free_all(out);.
14c60 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 . .}....if ((cer
14c70 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e t=X509_new())==N
14c80 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c ULL) {... Tcl
14c90 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
14ca0 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 p,"Error generat
14cb0 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20 ing certificate
14cc0 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a request",NULL);.
14cd0 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 .. EVP_PKEY_f
14ce0 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f ree(pkey);.#if O
14cf0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
14d00 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
14d10 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 00L... BN_fre
14d20 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 e(bne);.#endif..
14d30 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f . return(TCL_
14d40 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 ERROR);...}....X
14d50 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 509_set_version(
14d60 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f cert,2);...ASN1_
14d70 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 INTEGER_set(X509
14d80 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 _get_serialNumbe
14d90 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b r(cert),serial);
14da0 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 ...X509_gmtime_a
14db0 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 dj(X509_getm_not
14dc0 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b Before(cert),0);
14dd0 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 ...X509_gmtime_a
14de0 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 dj(X509_getm_not
14df0 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e After(cert),(lon
14e00 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 g)60*60*24*days)
14e10 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 ;...X509_set_pub
14e20 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a key(cert,pkey);.
14e30 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 ...name=X509_get
14e40 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 _subject_name(ce
14e50 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d rt);....X509_NAM
14e60 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
14e70 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 xt(name,"C", MBS
14e80 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
14e90 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
14ea0 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 *) k_C, -1, -1,
14eb0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
14ec0 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
14ed0 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 (name,"ST", MBST
14ee0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
14ef0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
14f00 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 ) k_ST, -1, -1,
14f10 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
14f20 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
14f30 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 (name,"L", MBSTR
14f40 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
14f50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
14f60 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_L, -1, -1, 0)
14f70 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
14f80 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
14f90 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e ame,"O", MBSTRIN
14fa0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
14fb0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
14fc0 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a _O, -1, -1, 0);.
14fd0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
14fe0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
14ff0 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 e,"OU", MBSTRING
15000 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
15010 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
15020 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a OU, -1, -1, 0);.
15030 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
15040 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
15050 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 e,"CN", MBSTRING
15060 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
15070 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
15080 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a CN, -1, -1, 0);.
15090 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
150a0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
150b0 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 e,"Email", MBSTR
150c0 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
150d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
150e0 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 k_Email, -1, -1
150f0 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 , 0);....X509_se
15100 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 t_subject_name(c
15110 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 ert,name);....if
15120 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 (!X509_sign(cer
15130 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 t,pkey,EVP_sha25
15140 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 6())) {... X5
15150 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09_free(cert);..
15160 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 . EVP_PKEY_fr
15170 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 ee(pkey);.#if OP
15180 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
15190 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
151a0 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 0L... BN_free
151b0 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 (bne);.#endif...
151c0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
151d0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
151e0 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 signing certific
151f0 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 ate",NULL);...
15200 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
15210 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 OR;...}....if (i
15220 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 sStr) {... ou
15230 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
15240 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 mem());... PE
15250 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 M_write_bio_X509
15260 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 (out,cert);...
15270 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 i=BIO_read(out
15280 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 ,buffer,sizeof(b
15290 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 uffer)-1);...
152a0 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 i=(i<0) ? 0 : i
152b0 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 ;... buffer[i
152c0 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 ]='\0';... Tc
152d0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
152e0 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 pemout,buffer,0)
152f0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 ;... BIO_flus
15300 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 h(out);... BI
15310 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d O_free(out);...}
15320 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 else {... ou
15330 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
15340 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 file());... B
15350 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d IO_write_filenam
15360 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 e(out,pemout);..
15370 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
15380 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
15390 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
153a0 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a e_all(out);...}.
153b0 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 ...X509_free(cer
153c0 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 t);...EVP_PKEY_f
153d0 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f ree(pkey);.#if O
153e0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
153f0 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
15400 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 00L...BN_free(bn
15410 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 e);.#endif..
15420 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 }..}..break;.
15430 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b default:..break
15440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
15450 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
15460 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
15470 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a ata;.}.../******
15480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
15490 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 /* Init
154a0 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a */./********
154b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f ************/../
154c0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
154d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
154e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
154f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15500 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
15510 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 s_Free --. *. *.
15520 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 This procedure c
15530 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 leans up when a
15540 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 SSL socket based
15550 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 channel. *.is c
15560 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 losed and its re
15570 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 ference count fa
15580 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 lls below 1. *.
15590 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f * Results:. *.no
155a0 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
155b0 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 fects:. *.Frees
155c0 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a all the state. *
155d0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
155e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
155f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15610 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a ------. */.void.
15620 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a 62 Tls_Free(char *b
15630 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 lockPtr) {. S
15640 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
15650 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 (State *)blockP
15660 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 tr;.. dprintf
15670 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
15680 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 Tls_Clean(state
15690 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 Ptr);. ckfree
156a0 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a (blockPtr);.}...
156b0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
156c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
156d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
156e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
156f0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
15700 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 ls_Clean --. *.
15710 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
15720 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 cleans up when
15730 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 a SSL socket bas
15740 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 ed channel. *.is
15750 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 closed and its
15760 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 reference count
15770 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 falls below 1.
15780 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 This should. *.b
15790 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f e called synchro
157a0 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c nously by the Cl
157b0 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 oseProc, not in
157c0 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c the. *.Eventuall
157d0 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a yFree callback..
157e0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
157f0 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.none. *. * Sid
15800 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 e effects:. *.Fr
15810 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 ees all the stat
15820 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
15830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 ----------. */.v
15870 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 oid Tls_Clean(St
15880 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b ate *statePtr) {
15890 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
158a0 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a lled");.. /*.
158b0 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 * we're ass
158c0 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 uming here that
158d0 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 we're single-thr
158e0 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 eaded. */.
158f0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
15900 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 timer != (Tcl_Ti
15910 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 merToken) NULL)
15920 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d {..Tcl_DeleteTim
15930 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 erHandler(stateP
15940 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 tr->timer);..sta
15950 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e tePtr->timer = N
15960 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
15970 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 if (statePtr->pr
15980 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 otos) {..ckfree(
15990 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
159a0 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 );..statePtr->pr
159b0 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 otos = NULL;.
159c0 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
159d0 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 Ptr->bio) {../*
159e0 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 This will call S
159f0 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 SL_shutdown. Bug
15a00 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 1414045 */..dpr
15a10 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 intf("BIO_free_a
15a20 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 ll(%p)", statePt
15a30 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 r->bio);..BIO_fr
15a40 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d ee_all(statePtr-
15a50 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 >bio);..statePtr
15a60 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->bio = NULL;.
15a70 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
15a80 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 ePtr->ssl) {..dp
15a90 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 rintf("SSL_free(
15aa0 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e %p)", statePtr->
15ab0 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 ssl);..SSL_free(
15ac0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
15ad0 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d .statePtr->ssl =
15ae0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
15af0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
15b00 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 tx) {..SSL_CTX_f
15b10 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ree(statePtr->ct
15b20 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 x);..statePtr->c
15b30 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d tx = NULL;. }
15b40 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
15b50 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 r->callback) {..
15b60 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
15b70 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
15b80 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ack);..statePtr-
15b90 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c >callback = NULL
15ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
15bb0 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
15bc0 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 rd) {..Tcl_DecrR
15bd0 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
15be0 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 ->password);..st
15bf0 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
15c00 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
15c10 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
15c20 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 >vcmd) {..Tcl_De
15c30 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
15c40 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 Ptr->vcmd);..sta
15c50 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 tePtr->vcmd = NU
15c60 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 LL;. }.. d
15c70 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
15c80 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d g");.}.../*. *--
15c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15cd0 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 -. *. * Tls_Init
15ce0 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 --. *. *.This i
15cf0 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 s a package init
15d00 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 ialization proce
15d10 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 dure, which is c
15d20 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 alled. *.by Tcl
15d30 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 when this packag
15d40 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 e is to be added
15d50 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 to an interpret
15d60 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
15d70 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 s: Ssl configur
15d80 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a ed and loaded. *
15d90 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
15da0 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 :. *. create the
15db0 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e ssl command, in
15dc0 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e itialize ssl con
15dd0 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d text. *. *------
15de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
15e20 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 /.DLLEXPORT int
15e30 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 Tls_Init(Tcl_Int
15e40 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 erp *interp) {.
15e50 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c const char tl
15e60 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d sTclInitScript[]
15e70 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 = {.#include "t
15e80 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a ls.tcl.h"..0x00.
15e90 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 };.. dpri
15ea0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
15eb0 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 #if TCL_MAJOR_VE
15ec0 52 53 49 4f 4e 20 3e 20 38 0a 23 69 66 64 65 66 RSION > 8.#ifdef
15ed0 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 USE_TCL_STUBS.
15ee0 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 if (Tcl_InitS
15ef0 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 39 2e tubs(interp, "9.
15f00 30 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 0", 0) == NULL)
15f10 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
15f20 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ROR;. }.#endi
15f30 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b f. if (Tcl_Pk
15f40 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c gRequire(interp,
15f50 20 22 54 63 6c 22 2c 20 22 39 2e 30 2d 22 2c 20 "Tcl", "9.0-",
15f60 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 0) == NULL) {..r
15f70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
15f80 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 23 69 66 . }.#else.#if
15f90 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 def USE_TCL_STUB
15fa0 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e S. if (Tcl_In
15fb0 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 itStubs(interp,
15fc0 22 38 2e 35 22 2c 20 30 29 20 3d 3d 20 4e 55 4c "8.5", 0) == NUL
15fd0 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
15fe0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 _ERROR;. }.#e
15ff0 6e 64 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c ndif. if (Tcl
16000 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 _PkgRequire(inte
16010 72 70 2c 20 22 54 63 6c 22 2c 20 22 38 2e 35 2d rp, "Tcl", "8.5-
16020 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b ", 0) == NULL) {
16030 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
16040 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 OR;. }.#endif
16050 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 .. if (TlsLib
16060 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f Init(0) != TCL_O
16070 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 K) {..Tcl_Append
16080 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
16090 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 could not initia
160a0 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 lize SSL library
160b0 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
160c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
160d0 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 }.. Tcl_Crea
160e0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
160f0 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 erp, "tls::conne
16100 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 ction", Connecti
16110 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 onInfoObjCmd, (C
16120 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
16130 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
16140 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
16150 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
16160 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
16170 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 ::handshake", Ha
16180 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 ndshakeObjCmd, (
16190 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
161a0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
161b0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
161c0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
161d0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
161e0 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f s::import", Impo
161f0 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e rtObjCmd, (Clien
16200 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
16210 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
16220 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
16230 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
16240 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 interp, "tls::mi
16250 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c sc", MiscObjCmd,
16260 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
16270 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
16280 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
16290 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
162a0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
162b0 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 tls::unimport",
162c0 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 UnimportObjCmd,
162d0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
162e0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
162f0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
16300 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
16310 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
16320 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 ls::status", Sta
16330 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 tusObjCmd, (Clie
16340 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
16350 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
16360 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c NULL);.. Tcl
16370 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
16380 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
16390 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 ciphers", Cipher
163a0 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 sObjCmd, (Client
163b0 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
163c0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
163d0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
163e0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
163f0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f nterp, "tls::pro
16400 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f tocols", Protoco
16410 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e lsObjCmd, (Clien
16420 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
16430 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
16440 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
16450 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
16460 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 interp, "tls::ve
16470 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f rsion", VersionO
16480 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
16490 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
164a0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
164b0 4c 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 L);.. Tcl_Cre
164c0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
164d0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 64 69 67 65 terp, "tls::dige
164e0 73 74 22 2c 20 44 69 67 65 73 74 43 6d 64 2c 20 st", DigestCmd,
164f0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
16500 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
16510 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
16520 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
16530 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
16540 6c 73 3a 3a 64 69 67 65 73 74 73 22 2c 20 44 69 ls::digests", Di
16550 67 65 73 74 4c 69 73 74 43 6d 64 2c 20 28 43 6c gestListCmd, (Cl
16560 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
16570 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
16580 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
16590 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
165a0 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
165b0 3a 6d 64 34 22 2c 20 44 69 67 65 73 74 4d 44 34 :md4", DigestMD4
165c0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
165d0 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
165e0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
165f0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
16600 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
16610 70 2c 20 22 74 6c 73 3a 3a 6d 64 35 22 2c 20 44 p, "tls::md5", D
16620 69 67 65 73 74 4d 44 35 43 6d 64 2c 20 28 43 6c igestMD5Cmd, (Cl
16630 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
16640 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
16650 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
16660 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
16670 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
16680 3a 73 68 61 31 22 2c 20 44 69 67 65 73 74 53 48 :sha1", DigestSH
16690 41 31 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 A1Cmd, (ClientDa
166a0 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
166b0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
166c0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
166d0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
166e0 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 32 35 erp, "tls::sha25
166f0 36 22 2c 20 44 69 67 65 73 74 53 48 41 32 35 36 6", DigestSHA256
16700 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
16710 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
16720 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
16730 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 ;.. if (inter
16740 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 p) {..Tcl_Eval(i
16750 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 nterp, tlsTclIni
16760 74 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a tScript);. }.
16770 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f . return Tcl_
16780 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 PkgProvide(inter
16790 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c p, PACKAGE_NAME,
167a0 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e PACKAGE_VERSION
167b0 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d );.}../*. *-----
167c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
167d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
167e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
167f0 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 -*. *. *.Tls_Saf
16800 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d eInit --. *. *.-
16810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
16840 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f . *.Standard pro
16850 63 65 64 75 72 65 20 72 65 71 75 69 72 65 64 20 cedure required
16860 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e by 'load'.. *.In
16870 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 itializes this e
16880 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 xtension for a s
16890 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e afe interpreter.
168a0 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
168b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
168c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
168d0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 ----*. *. *.Side
168e0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 effects:. *..As
168f0 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 of 'Tls_Init'.
16900 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 *. *.Result:. *.
16910 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
16920 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 error code.. *.
16930 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
16940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16960 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c -------*. */.DLL
16970 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 EXPORT int Tls_S
16980 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 afeInit(Tcl_Inte
16990 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 rp *interp) {.
169a0 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
169b0 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 d");. return(
169c0 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 Tls_Init(interp)
169d0 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d );.}../*. *-----
169e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
169f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a10 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 -*. *. *.TlsLibI
16a20 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d nit --. *. *.---
16a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
16a60 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 *.Initializes SS
16a70 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 L library once p
16a80 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 er application.
16a90 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
16aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ac0 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 --*. *. *.Side e
16ad0 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 ffects:. *..init
16ae0 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 ializes SSL libr
16af0 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 ary. *. *.Result
16b00 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a :. *..none. *. *
16b10 2d 2d 2d 2d 2d 2d 2d 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 2a 0a 20 2a 2f 0a 73 74 61 74 ------*. */.stat
16b50 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 ic int TlsLibIni
16b60 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 t(int uninitiali
16b70 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 ze) {. static
16b80 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 int initialized
16b90 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 = 0;. int st
16ba0 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 atus = TCL_OK;.#
16bb0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
16bc0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
16bd0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
16be0 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e DS). size_t n
16bf0 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 um_locks;.#endif
16c00 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 .. if (uninit
16c10 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 ialize) {..if (!
16c20 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
16c30 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b dprintf("Ask
16c40 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 ed to uninitiali
16c50 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e ze, but we are n
16c60 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 ot initialized")
16c70 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 28 54 ;... return(T
16c80 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70 72 CL_OK);..}...dpr
16c90 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 intf("Asked to u
16ca0 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a ninitialize");..
16cb0 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
16cc0 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
16cd0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
16ce0 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c ADS)..Tcl_MutexL
16cf0 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a ock(&init_mx);..
16d00 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 .if (locks) {..
16d10 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a free(locks);.
16d20 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c . locks = NUL
16d30 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 L;.. locksCou
16d40 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 nt = 0;..}.#endi
16d50 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d f..initialized =
16d60 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 0;..#if defined
16d70 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
16d80 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
16d90 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d _THREADS)..Tcl_M
16da0 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 utexUnlock(&init
16db0 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 _mx);.#endif...r
16dc0 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 eturn(TCL_OK);.
16dd0 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e }.. if (in
16de0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 itialized) {..dp
16df0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 rintf("Called, b
16e00 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 ut using cached
16e10 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e value");..return
16e20 28 73 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a (status);. }.
16e30 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
16e40 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 lled");..#if def
16e50 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 ined(OPENSSL_THR
16e60 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 EADS) && defined
16e70 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 (TCL_THREADS).
16e80 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 Tcl_MutexLock(
16e90 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 &init_mx);.#endi
16ea0 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 f. initialize
16eb0 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 d = 1;..#if defi
16ec0 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ned(OPENSSL_THRE
16ed0 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 ADS) && defined(
16ee0 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 TCL_THREADS).
16ef0 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a num_locks = 1;.
16f00 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d locksCount =
16f10 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 (int) num_locks
16f20 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 ;. locks = ma
16f30 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 lloc(sizeof(*loc
16f40 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 ks) * num_locks)
16f50 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 ;. memset(loc
16f60 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c ks, 0, sizeof(*l
16f70 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b ocks) * num_lock
16f80 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 s);.#endif..
16f90 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f /* Initialize BO
16fa0 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 TH libcrypto and
16fb0 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 libssl. */.
16fc0 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c OPENSSL_init_ssl
16fd0 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f (OPENSSL_INIT_LO
16fe0 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c AD_SSL_STRINGS |
16ff0 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f OPENSSL_INIT_LO
17000 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 AD_CRYPTO_STRING
17010 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 S..| OPENSSL_INI
17020 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 T_ADD_ALL_CIPHER
17030 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 S | OPENSSL_INIT
17040 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 _ADD_ALL_DIGESTS
17050 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 , NULL);.. BI
17060 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 O_new_tcl(NULL,
17070 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 0);..#if 0. /
17080 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 *. * XXX:TOD
17090 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 O: Remove this c
170a0 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 ode and replace
170b0 69 74 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a it with a check.
170c0 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 * for enoug
170d0 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f h entropy and do
170e0 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 not try to crea
170f0 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 te our own.
17100 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f * terrible entro
17110 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f py. */. /
17120 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 *. * Seed th
17130 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 e random number
17140 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 generator in the
17150 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 SSL library,.
17160 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 * using the d
17170 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 o/while construc
17180 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 t because of the
17190 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 bug note in the
171a0 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 . * OpenSSL
171b0 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 FAQ at http://ww
171c0 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 w.openssl.org/su
171d0 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 pport/faq.html#U
171e0 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 SER1. *.
171f0 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 * The crux of t
17200 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 he problem is th
17210 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 at Solaris 7 doe
17220 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 s not have a.
17230 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 * /dev/random
17240 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 or /dev/urandom
17250 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e device so it can
17260 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 not gather enoug
17270 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 h. * entropy
17280 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 from the RAND_s
17290 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 eed() when TLS i
172a0 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 nitializes and r
172b0 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f efuses. * to
172c0 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 go further. Ear
172d0 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 lier versions of
172e0 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 OpenSSL carried
172f0 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a on regardless..
17300 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e */. sran
17310 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 d((unsigned int)
17320 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 time((time_t *)
17330 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 NULL));. do
17340 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 {..for (i = 0; i
17350 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 < 16; i++) {..
17360 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d rnd_seed[i] =
17370 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 1 + (char) (255
17380 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e .0 * rand()/(RAN
17390 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a D_MAX+1.0));..}.
173a0 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 .RAND_seed(rnd_s
173b0 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f eed, sizeof(rnd_
173c0 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 seed));. } wh
173d0 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 ile (RAND_status
173e0 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 () != 1);.#endif
173f0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
17400 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
17410 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
17420 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 READS)..Tcl_Mute
17430 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 xUnlock(&init_mx
17440 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 );.#endif...retu
17450 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a rn(status);.}.