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 54 63 6c 5f 4c 69 alias) {..Tcl_Li
7860: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
7870: 6e 74 28 4e 55 4c 4c 2c 20 6f 62 6a 50 74 72 2c nt(NULL, objPtr,
7880: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
7890: 6a 28 6f 62 6a 2d 3e 6e 61 6d 65 2c 2d 31 29 29 j(obj->name,-1))
78a0: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6e 74 0a 44 ;. }.}..int.D
78b0: 69 67 65 73 74 4c 69 73 74 43 6d 64 28 43 6c 69 igestListCmd(Cli
78c0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
78d0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
78e0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
78f0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
7900: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
7910: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d cl_Obj *objPtr =
7920: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
7930: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 0, NULL);..#if O
7940: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
7950: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
7960: 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 00L. OpenSSL_
7970: 61 64 64 5f 61 6c 6c 5f 64 69 67 65 73 74 73 28 add_all_digests(
7980: 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 ); /* Make sure
7990: 74 68 65 79 27 72 65 20 6c 6f 61 64 65 64 20 2a they're loaded *
79a0: 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 4f 42 /.#endif.. OB
79b0: 4a 5f 4e 41 4d 45 5f 64 6f 5f 61 6c 6c 28 4f 42 J_NAME_do_all(OB
79c0: 4a 5f 4e 41 4d 45 5f 54 59 50 45 5f 4d 44 5f 4d J_NAME_TYPE_MD_M
79d0: 45 54 48 2c 20 4c 69 73 74 43 61 6c 6c 62 61 63 ETH, ListCallbac
79e0: 6b 2c 20 28 76 6f 69 64 20 2a 29 20 6f 62 6a 50 k, (void *) objP
79f0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 73 tr);. Tcl_Res
7a00: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 etResult(interp)
7a10: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a ;. Tcl_SetObj
7a20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
7a30: 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 bjPtr);.. ret
7a40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
7a50: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
7a60: 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 Data;..objc = ob
7a70: 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 jc;..objv = objv
7a80: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 56 61 6c 69 ;.}.../*. * Vali
7a90: 64 20 53 53 4c 20 61 6e 64 20 54 4c 53 20 50 72 d SSL and TLS Pr
7aa0: 6f 74 6f 63 6f 6c 20 56 65 72 73 69 6f 6e 73 0a otocol Versions.
7ab0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 */.static const
7ac0: 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 char *protocols
7ad0: 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 [] = {.."ssl2",
7ae0: 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 "ssl3", "tls1",
7af0: 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e "tls1.1", "tls1.
7b00: 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 2", "tls1.3", NU
7b10: 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f LL.};.enum proto
7b20: 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 col {. TLS_SS
7b30: 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c L2, TLS_SSL3, TL
7b40: 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 S_TLS1, TLS_TLS1
7b50: 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 _1, TLS_TLS1_2,
7b60: 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f TLS_TLS1_3, TLS_
7b70: 4e 4f 4e 45 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d NONE.};../*. *--
7b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7bc0: 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f -. *. * CiphersO
7bd0: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 bjCmd -- list av
7be0: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a ailable ciphers.
7bf0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
7c00: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
7c10: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
7c20: 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f tls::ciphers" co
7c30: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 mmand. *.to list
7c40: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 available ciphe
7c50: 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 rs, based upon p
7c60: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
7c70: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
7c80: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
7c90: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a cl result list..
7ca0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
7cb0: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 ts:. *.construct
7cc0: 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 s and destroys S
7cd0: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 SL context (CTX)
7ce0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
7cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
7d30: 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 tatic int.Cipher
7d40: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 sObjCmd(ClientDa
7d50: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
7d60: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
7d70: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
7d80: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
7d90: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
7da0: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c j *objPtr = NULL
7db0: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 ;. SSL_CTX *c
7dc0: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 tx = NULL;. S
7dd0: 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a SL *ssl = NULL;.
7de0: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c STACK_OF(SSL
7df0: 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 _CIPHER) *sk;.
7e00: 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b char *cp, buf[
7e10: 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 BUFSIZ];. int
7e20: 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20 index, verbose
7e30: 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 = 0, use_support
7e40: 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 ed = 0;. cons
7e50: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 t SSL_METHOD *me
7e60: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e thod;.. dprin
7e70: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
7e80: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 31 if ((objc < 1
7e90: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 ) || (objc > 4))
7ea0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
7eb0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
7ec0: 6f 62 6a 76 2c 20 22 3f 70 72 6f 74 6f 63 6f 6c objv, "?protocol
7ed0: 3f 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 ? ?verbose? ?sup
7ee0: 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 ported?");..retu
7ef0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7f00: 20 20 7d 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 }. if (objc
7f10: 20 3d 3d 20 31 29 20 7b 0a 09 2f 2a 20 4c 69 73 == 1) {../* Lis
7f20: 74 20 61 6c 6c 20 63 69 70 68 65 72 73 20 2a 2f t all ciphers */
7f30: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 ..Tcl_Obj *objPt
7f40: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
7f50: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 bj(0, NULL);..#i
7f60: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
7f70: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
7f80: 30 30 30 30 30 4c 0a 09 4f 70 65 6e 53 53 4c 5f 00000L..OpenSSL_
7f90: 61 64 64 5f 61 6c 6c 5f 63 69 70 68 65 72 73 28 add_all_ciphers(
7fa0: 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 ); /* Make sure
7fb0: 74 68 65 79 27 72 65 20 6c 6f 61 64 65 64 20 2a they're loaded *
7fc0: 2f 0a 23 65 6e 64 69 66 0a 0a 09 4f 42 4a 5f 4e /.#endif...OBJ_N
7fd0: 41 4d 45 5f 64 6f 5f 61 6c 6c 28 4f 42 4a 5f 4e AME_do_all(OBJ_N
7fe0: 41 4d 45 5f 54 59 50 45 5f 43 49 50 48 45 52 5f AME_TYPE_CIPHER_
7ff0: 4d 45 54 48 2c 20 4c 69 73 74 43 61 6c 6c 62 61 METH, ListCallba
8000: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 20 6f 62 6a ck, (void *) obj
8010: 50 74 72 29 3b 0a 09 54 63 6c 5f 52 65 73 65 74 Ptr);..Tcl_Reset
8020: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
8030: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
8040: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
8050: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f );..return TCL_O
8060: 4b 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 K;.. } else i
8070: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 f (Tcl_GetIndexF
8080: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
8090: 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c bjv[1], protocol
80a0: 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 s, "protocol", 0
80b0: 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c , &index) != TCL
80c0: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
80d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
80e0: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 if ((objc >
80f0: 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 2) && Tcl_GetBoo
8100: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 leanFromObj(inte
8110: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 rp, objv[2], &ve
8120: 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b rbose) != TCL_OK
8130: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
8140: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
8150: 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 if ((objc > 3)
8160: 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 && Tcl_GetBoolea
8170: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c nFromObj(interp,
8180: 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 objv[3], &use_s
8190: 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c upported) != TCL
81a0: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
81b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
81c0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
81d0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 rror();.. swi
81e0: 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f tch ((enum proto
81f0: 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 col)index) {..ca
8200: 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 se TLS_SSL2:.#if
8210: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
8220: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 _NUMBER >= 0x101
8230: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 00000L || define
8240: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 d(NO_SSL2) || de
8250: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8260: 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f _SSL2).. Tcl_
8270: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
8280: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
8290: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
82a0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
82b0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
82c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
82d0: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
82e0: 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f od = SSLv2_metho
82f0: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
8300: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c if..case TLS_SSL
8310: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 3:.#if defined(N
8320: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e O_SSL3) || defin
8330: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
8340: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f L3) || defined(O
8350: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d PENSSL_NO_SSL3_M
8360: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f ETHOD).. Tcl_
8370: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
8380: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
8390: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
83a0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
83b0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
83c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
83d0: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
83e0: 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f od = SSLv3_metho
83f0: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
8400: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 if..case TLS_TLS
8410: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 1:.#if defined(N
8420: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e O_TLS1) || defin
8430: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
8440: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f S1) || defined(O
8450: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d PENSSL_NO_TLS1_M
8460: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f ETHOD).. Tcl_
8470: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
8480: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
8490: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
84a0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
84b0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
84c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
84d0: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
84e0: 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f od = TLSv1_metho
84f0: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
8500: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 if..case TLS_TLS
8510: 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 1_1:.#if defined
8520: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 (NO_TLS1_1) || d
8530: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
8540: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 O_TLS1_1) || def
8550: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8560: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 TLS1_1_METHOD)..
8570: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
8580: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
8590: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
85a0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
85b0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
85c0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
85d0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
85e0: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 method = TLS
85f0: 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 v1_1_method(); b
8600: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 reak;.#endif..ca
8610: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 se TLS_TLS1_2:.#
8620: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
8630: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_2) || defined
8640: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
8650: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
8660: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
8670: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 _METHOD).. Tc
8680: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
8690: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
86a0: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
86b0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
86c0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
86d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
86e0: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 R;.#else.. me
86f0: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d thod = TLSv1_2_m
8700: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a ethod(); break;.
8710: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 #endif..case TLS
8720: 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 _TLS1_3:.#if def
8730: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
8740: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
8750: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 SL_NO_TLS1_3)..
8760: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
8770: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
8780: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
8790: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
87a0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
87b0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
87c0: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 _ERROR;.#else..
87d0: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f method = TLS_
87e0: 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 53 method();.. S
87f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 SL_CTX_set_min_p
8800: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
8810: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
8820: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
8830: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 set_max_proto_ve
8840: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f rsion(ctx, TLS1_
8850: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 3_VERSION);..
8860: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
8870: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65 default:.. me
8880: 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f thod = TLS_metho
8890: 64 28 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b d();.. break;
88a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 . }.. ctx
88b0: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 = SSL_CTX_new(me
88c0: 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 63 thod);. if (c
88d0: 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 tx == NULL) {..T
88e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
88f0: 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 interp, REASON()
8900: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
8910: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8920: 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c }.. ssl = SSL
8930: 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 _new(ctx);. i
8940: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 f (ssl == NULL)
8950: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
8960: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 ult(interp, REAS
8970: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53 ON(), NULL);..SS
8980: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
8990: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
89a0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
89b0: 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f * Use list and o
89c0: 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 rder as would be
89d0: 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e sent in a Clien
89e0: 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 tHello or all av
89f0: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 ailable ciphers
8a00: 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 */. if (use_s
8a10: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 upported) {..sk
8a20: 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f = SSL_get1_suppo
8a30: 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c rted_ciphers(ssl
8a40: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
8a50: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 .sk = SSL_get_ci
8a60: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 phers(ssl);.
8a70: 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d }.. if (sk !=
8a80: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 NULL) {..if (!v
8a90: 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f erbose) {.. o
8aa0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
8ab0: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
8ac0: 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 .. for (int i
8ad0: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c = 0; i < sk_SSL
8ae0: 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b _CIPHER_num(sk);
8af0: 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 i++) {...const
8b00: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 SSL_CIPHER *c =
8b10: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 sk_SSL_CIPHER_va
8b20: 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 lue(sk, i);...if
8b30: 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e (c == NULL) con
8b40: 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 tinue;..../* cip
8b50: 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e her name or (NON
8b60: 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c E) */...cp = SSL
8b70: 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 _CIPHER_get_name
8b80: 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d (c);...if (cp ==
8b90: 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 NULL) break;...
8ba0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
8bb0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
8bc0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
8bd0: 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 StringObj(cp, -1
8be0: 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 ));.. }...} e
8bf0: 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 lse {.. objPt
8c00: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e r = Tcl_NewStrin
8c10: 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 gObj("",0);..
8c20: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b for (int i = 0;
8c30: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 i < sk_SSL_CIPH
8c40: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 ER_num(sk); i++)
8c50: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 {...const SSL_C
8c60: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 IPHER *c = sk_SS
8c70: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 L_CIPHER_value(s
8c80: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d k, i);...if (c =
8c90: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 = NULL) continue
8ca0: 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 ;..../* textual
8cb0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 description of t
8cc0: 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 he cipher */...i
8cd0: 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 f (SSL_CIPHER_de
8ce0: 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 scription(c, buf
8cf0: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 , sizeof(buf)) !
8d00: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 = NULL) {...
8d10: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 Tcl_AppendToObj(
8d20: 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 54 63 objPtr, buf, (Tc
8d30: 6c 5f 53 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 l_Size) strlen(b
8d40: 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b uf));...} else {
8d50: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ... Tcl_Appen
8d60: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 dToObj(objPtr, "
8d70: 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a UNKNOWN\n", 8);.
8d80: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 ..}.. }..}..i
8d90: 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 f (use_supported
8da0: 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f ) {.. sk_SSL_
8db0: 43 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b CIPHER_free(sk);
8dc0: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 ..}. }. SS
8dd0: 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 L_free(ssl);.
8de0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
8df0: 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 73 x);.. Tcl_Res
8e00: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 etResult(interp)
8e10: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a ;. Tcl_SetObj
8e20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
8e30: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
8e40: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
8e50: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
8e60: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8eb0: 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c -. *. * Protocol
8ec0: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 sObjCmd -- list
8ed0: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 available protoc
8ee0: 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 ols. *. *.This p
8ef0: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
8f00: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 ked to process t
8f10: 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f he "tls::protoco
8f20: 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 ls" command. *.t
8f30: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 o list available
8f40: 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 protocols.. *.
8f50: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
8f60: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
8f70: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 ult list.. *. *
8f80: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
8f90: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .none. *. *-----
8fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
8fe0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 */.static int.Pr
8ff0: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c otocolsObjCmd(Cl
9000: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
9010: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
9020: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
9030: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
9040: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
9050: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
9060: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
9070: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
9080: 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 (objc != 1) {..
9090: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
90a0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
90b0: 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 , "");..return T
90c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
90d0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
90e0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a rror();.. obj
90f0: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
9100: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a tObj(0, NULL);..
9110: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
9120: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
9130: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
9140: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 ined(NO_SSL2) &&
9150: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
9160: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 L_NO_SSL2). T
9170: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
9180: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
9190: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
91a0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
91b0: 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 ls[TLS_SSL2], -1
91c0: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
91d0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
91e0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
91f0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 NSSL_NO_SSL3) &&
9200: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
9210: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 L_NO_SSL3_METHOD
9220: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
9230: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
9240: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
9250: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
9260: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 protocols[TLS_SS
9270: 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 L3], -1));.#endi
9280: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
9290: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
92a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
92b0: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
92c0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
92d0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c _METHOD). Tcl
92e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
92f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
9300: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
9310: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
9320: 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 [TLS_TLS1], -1))
9330: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
9340: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
9350: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
9360: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 NSSL_NO_TLS1_1)
9370: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
9380: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 SSL_NO_TLS1_1_ME
9390: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 THOD). Tcl_Li
93a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
93b0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
93c0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
93d0: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
93e0: 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b S_TLS1_1], -1));
93f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
9400: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
9410: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
9420: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 SSL_NO_TLS1_2) &
9430: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
9440: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 SL_NO_TLS1_2_MET
9450: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 HOD). Tcl_Lis
9460: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
9470: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
9480: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
9490: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
94a0: 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a _TLS1_2], -1));.
94b0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
94c0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
94d0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
94e0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
94f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
9500: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
9510: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
9520: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
9530: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 ocols[TLS_TLS1_3
9540: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
9550: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
9560: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
9570: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
9580: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e n TCL_OK;..clien
9590: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
95a0: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ta;.}.../*. *---
95b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95f0: 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 . *. * VersionOb
9600: 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 jCmd -- return v
9610: 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 ersion string fr
9620: 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 om OpenSSL.. *.
9630: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
9640: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
9650: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
9660: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
9670: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
9680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
96a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
96b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
96c0: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f tatic int.Versio
96d0: 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 nObjCmd(ClientDa
96e0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
96f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
9700: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
9710: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
9720: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
9730: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 j *objPtr;..
9740: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
9750: 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d );.. objPtr =
9760: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
9770: 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f j(OPENSSL_VERSIO
9780: 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 N_TEXT, -1);.
9790: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
97a0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
97b0: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
97c0: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
97d0: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
97e0: 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 ..objc = objc;..
97f0: 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c objv = objv;.}..
9800: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
9810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
9850: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 HandshakeObjCmd
9860: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f --. *. *.This co
9870: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f mmand is used to
9880: 20 76 65 72 69 66 79 20 77 68 65 74 68 65 72 20 verify whether
9890: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 the handshake is
98a0: 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 complete. *.or
98b0: 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c not.. *. * Resul
98c0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
98d0: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 d Tcl result. 1
98e0: 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 means handshake
98f0: 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e complete, 0 mean
9900: 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a s pending.. *. *
9910: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
9920: 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 *.May force SSL
9930: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 negotiation to t
9940: 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a ake place.. *. *
9950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9990: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
99a0: 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 nt HandshakeObjC
99b0: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
99c0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
99d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
99e0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
99f0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
9a00: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
9a10: 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a chan; /*
9a20: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
9a30: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
9a40: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 /. State *sta
9a50: 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a tePtr; /*
9a60: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f client state fo
9a70: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a r ssl socket */.
9a80: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
9a90: 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 errStr = NULL;.
9aa0: 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a int ret = 1;.
9ab0: 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b int err = 0;
9ac0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
9ad0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
9ae0: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
9af0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
9b00: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
9b10: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
9b20: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
9b30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
9b40: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
9b50: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
9b60: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
9b70: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
9b80: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
9b90: 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 NULL), NULL);.
9ba0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
9bb0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
9bc0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c L) {..return(TCL
9bd0: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a _ERROR);. }..
9be0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
9bf0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
9c00: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
9c10: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
9c20: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
9c30: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 el(chan);. if
9c40: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
9c50: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
9c60: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
9c70: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
9c80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
9c90: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
9ca0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
9cb0: 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c e(chan),.. "\
9cc0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
9cd0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 nnel", NULL);..T
9ce0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
9cf0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
9d00: 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 43 48 41 HANDSHAKE", "CHA
9d10: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 NNEL", "INVALID"
9d20: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9d30: 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 ;..return(TCL_ER
9d40: 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ROR);. }.
9d50: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
9d60: 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e e *)Tcl_GetChann
9d70: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 elInstanceData(c
9d80: 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e han);.. dprin
9d90: 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f tf("Calling Tls_
9da0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 WaitForConnect")
9db0: 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73 5f ;. ret = Tls_
9dc0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 WaitForConnect(s
9dd0: 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20 31 tatePtr, &err, 1
9de0: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 );. dprintf("
9df0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
9e00: 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69 22 ct returned: %i"
9e10: 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 , ret);.. if
9e20: 28 72 65 74 20 3c 20 30 20 26 26 20 28 28 73 74 (ret < 0 && ((st
9e30: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 atePtr->flags &
9e40: 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 TLS_TCL_ASYNC) &
9e50: 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49 4e & (err == EAGAIN
9e60: 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 ))) {..dprintf("
9e70: 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72 Async set and er
9e80: 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 r = EAGAIN");..r
9e90: 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c et = 0;. } el
9ea0: 73 65 20 69 66 20 28 72 65 74 20 3c 20 30 29 20 se if (ret < 0)
9eb0: 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 6c 74 3b 0a {..long result;.
9ec0: 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 65 50 .errStr = stateP
9ed0: 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 tr->err;..Tcl_Re
9ee0: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 setResult(interp
9ef0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f );..Tcl_SetErrno
9f00: 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 (err);...if (!er
9f10: 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 rStr || (*errStr
9f20: 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 65 == 0)) {.. e
9f30: 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 rrStr = Tcl_Posi
9f40: 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a xError(interp);.
9f50: 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 .}...Tcl_AppendR
9f60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 esult(interp, "h
9f70: 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a andshake failed:
9f80: 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68 61 ", errStr, (cha
9f90: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 r *) NULL);..if
9fa0: 28 28 72 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67 ((result = SSL_g
9fb0: 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 et_verify_result
9fc0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 (statePtr->ssl))
9fd0: 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b != X509_V_OK) {
9fe0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
9ff0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
a000: 20 64 75 65 20 74 6f 3a 20 22 2c 20 58 35 30 39 due to: ", X509
a010: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 _verify_cert_err
a020: 6f 72 5f 73 74 72 69 6e 67 28 72 65 73 75 6c 74 or_string(result
a030: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
a040: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 );..}..Tcl_SetEr
a050: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
a060: 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b "TLS", "HANDSHAK
a070: 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 E", "FAILED", (c
a080: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 har *) NULL);..d
a090: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
a0a0: 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 g TCL_ERROR with
a0b0: 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 handshake faile
a0c0: 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b d: %s", errStr);
a0d0: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
a0e0: 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 OR);. } else
a0f0: 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 {..if (err != 0)
a100: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
a110: 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 "Got an error wi
a120: 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 th a completed h
a130: 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 andshake: err =
a140: 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 %i", err);..}..r
a150: 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 et = 1;. }..
a160: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
a170: 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 rning TCL_OK wit
a180: 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 h data \"%i\"",
a190: 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ret);. Tcl_Se
a1a0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
a1b0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a p, Tcl_NewIntObj
a1c0: 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75 (ret));. retu
a1d0: 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 rn(TCL_OK);..cli
a1e0: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
a1f0: 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d Data;.}../*. *--
a200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a240: 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 -. *. * ImportOb
a250: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
a260: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
a270: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
a280: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d ss the "ssl" com
a290: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 mand. *. *.The s
a2a0: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 sl command pushe
a2b0: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 s SSL over a (ne
a2c0: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 wly connected) t
a2d0: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 cp socket. *. *
a2e0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
a2f0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
a300: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
a310: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f fects:. *.May mo
a320: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f dify the behavio
a330: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e r of an IO chann
a340: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d el.. *. *-------
a350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
a390: 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f .static int.Impo
a3a0: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 rtObjCmd(ClientD
a3b0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
a3c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
a3d0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
a3e0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
a3f0: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
a400: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
a410: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
a420: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
a430: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 /. State *sta
a440: 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e tePtr;../* clien
a450: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
a460: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 socket */. SS
a470: 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 20 20 20 L_CTX *ctx.
a480: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 = NULL;. T
a490: 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 20 cl_Obj *script.
a4a0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a4b0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 Tcl_Obj *pass
a4c0: 77 6f 72 64 09 20 20 20 20 20 20 20 20 3d 20 4e word. = N
a4d0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
a4e0: 20 2a 76 63 6d 64 09 20 20 20 20 20 20 20 20 3d *vcmd. =
a4f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 NULL;. Tcl_D
a500: 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e String upperChan
a510: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 nelTranslation,
a520: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
a530: 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e king, upperChann
a540: 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 elEncoding, uppe
a550: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b rChannelEOFChar;
a560: 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c 65 . int idx, le
a570: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 n;. int flags
a580: 09 09 20 20 20 20 20 20 20 20 3d 20 54 4c 53 5f .. = TLS_
a590: 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e TCL_INIT;. in
a5a0: 74 20 73 65 72 76 65 72 09 09 20 20 20 20 20 20 t server..
a5b0: 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e = 0;./* is con
a5c0: 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 nection incoming
a5d0: 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f or outgoing? */
a5e0: 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66 69 . char *keyfi
a5f0: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c le. = NUL
a600: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 L;. char *cer
a610: 74 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 tfile. =
a620: 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e NULL;. unsign
a630: 65 64 20 63 68 61 72 20 2a 6b 65 79 20 20 09 3d ed char *key .=
a640: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6b NULL;. int k
a650: 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 ey_len
a660: 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 = 0;.
a670: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 unsigned char *c
a680: 65 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e 55 ert = NU
a690: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 63 65 72 74 LL;. int cert
a6a0: 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 _len
a6b0: 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 = 0;. cha
a6c0: 72 20 2a 63 69 70 68 65 72 73 09 20 20 20 20 20 r *ciphers.
a6d0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 = NULL;. c
a6e0: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 har *ciphersuite
a6f0: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c s. = NULL
a700: 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 ;. char *CAfi
a710: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c le. = NUL
a720: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 64 L;. char *CAd
a730: 69 72 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ir.. = NU
a740: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 LL;. char *DH
a750: 70 61 72 61 6d 73 09 20 20 20 20 20 20 20 20 3d params. =
a760: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
a770: 2a 6d 6f 64 65 6c 09 09 20 20 20 20 20 20 20 20 *model..
a780: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
a790: 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 20 20 20 *servername.
a7a0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 = NULL;./*
a7b0: 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 hostname for Ser
a7c0: 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 ver Name Indicat
a7d0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 ion */. const
a7e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
a7f0: 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c session_id = NUL
a800: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a L;. Tcl_Obj *
a810: 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 alpn..= NULL;.
a820: 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 int ssl2 = 0,
a830: 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e ssl3 = 0;. in
a840: 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 t tls1 = 1, tls1
a850: 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d _1 = 1, tls1_2 =
a860: 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 1, tls1_3 = 1;.
a870: 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 int proto =
a880: 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 0, level = -1;.
a890: 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 int verify =
a8a0: 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 0, require = 0,
a8b0: 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 request = 1, pos
a8c0: 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b t_handshake = 0;
a8d0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
a8e0: 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 alled");..#if de
a8f0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c fined(NO_TLS1) |
a900: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
a910: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 L_NO_TLS1). t
a920: 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a ls1 = 0;.#endif.
a930: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
a940: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_1) || define
a950: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
a960: 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 1_1). tls1_1
a970: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 0;.#endif.#if
a980: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
a990: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
a9a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
a9b0: 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b . tls1_2 = 0;
a9c0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
a9d0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c ned(NO_TLS1_3) |
a9e0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
a9f0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
aa00: 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e tls1_3 = 0;.#en
aa10: 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a dif.. if (obj
aa20: 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 c < 2) {..Tcl_Wr
aa30: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
aa40: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
aa50: 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 nnel ?options?")
aa60: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
aa70: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
aa80: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
aa90: 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 );.. chan = T
aaa0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
aab0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
aac0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
aad0: 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 1], NULL), NULL)
aae0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
aaf0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
ab00: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
ab10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
ab20: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
ab30: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
ab40: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
ab50: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
ab60: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
ab70: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 nnel(chan);..
ab80: 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 for (idx = 2; i
ab90: 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b dx < objc; idx++
aba0: 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d ) {..char *opt =
abb0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
abc0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c omObj(objv[idx],
abd0: 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 NULL);...if (op
abe0: 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 t[0] != '-')..
abf0: 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 break;...OPTOB
ac00: 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 J("-alpn", alpn)
ac10: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64 69 ;..OPTSTR("-cadi
ac20: 72 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 r", CAdir);..OPT
ac30: 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 STR("-cafile", C
ac40: 41 66 69 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 Afile);..OPTBYTE
ac50: 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c 20 ("-cert", cert,
ac60: 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 cert_len);..OPTS
ac70: 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 TR("-certfile",
ac80: 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 certfile);..OPTS
ac90: 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 TR("-cipher", ci
aca0: 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 phers);..OPTSTR(
acb0: 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70 68 "-ciphers", ciph
acc0: 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ers);..OPTSTR("-
acd0: 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 20 63 ciphersuites", c
ace0: 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09 4f iphersuites);..O
acf0: 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 PTOBJ("-command"
ad00: 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 , script);..OPTS
ad10: 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 TR("-dhparams",
ad20: 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 DHparams);..OPTB
ad30: 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c YTE("-key", key,
ad40: 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 key_len);..OPTS
ad50: 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b TR("-keyfile", k
ad60: 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 eyfile);..OPTSTR
ad70: 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c ("-model", model
ad80: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 );..OPTOBJ("-pas
ad90: 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64 sword", password
ada0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f );..OPTBOOL("-po
adb0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 st_handshake", p
adc0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a ost_handshake);.
add0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 .OPTBOOL("-reque
ade0: 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 st", request);..
adf0: 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 OPTBOOL("-requir
ae00: 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f e", require);..O
ae10: 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 PTINT("-security
ae20: 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a level", level);.
ae30: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 .OPTBOOL("-serve
ae40: 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 r", server);..OP
ae50: 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d TSTR("-servernam
ae60: 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b e", servername);
ae70: 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 ..OPTSTR("-sessi
ae80: 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f on_id", session_
ae90: 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d id);..OPTBOOL("-
aea0: 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f ssl2", ssl2);..O
aeb0: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 PTBOOL("-ssl3",
aec0: 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 ssl3);..OPTBOOL(
aed0: 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a "-tls1", tls1);.
aee0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e .OPTBOOL("-tls1.
aef0: 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 1", tls1_1);..OP
af00: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c TBOOL("-tls1.2",
af10: 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f tls1_2);..OPTBO
af20: 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c OL("-tls1.3", tl
af30: 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 s1_3);..OPTOBJ("
af40: 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 -validatecommand
af50: 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 ", vcmd);..OPTOB
af60: 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 J("-vcmd", vcmd)
af70: 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 ;...OPTBAD("opti
af80: 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 on", "-alpn, -ca
af90: 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 dir, -cafile, -c
afa0: 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 ert, -certfile,
afb0: 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 -cipher, -cipher
afc0: 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 suites, -command
afd0: 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 , -dhparams, -ke
afe0: 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f y, -keyfile, -mo
aff0: 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 del, -password,
b000: 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c -post_handshake,
b010: 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75 -request, -requ
b020: 69 72 65 2c 20 2d 73 65 63 75 72 69 74 79 6c 65 ire, -securityle
b030: 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 vel, -server, -s
b040: 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 ervername, -sess
b050: 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d ion_id, -ssl2, -
b060: 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c ssl3, -tls1, -tl
b070: 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d s1.1, -tls1.2, -
b080: 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 tls1.3, or -vali
b090: 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a datecommand");..
b0a0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
b0b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
b0c0: 28 72 65 71 75 65 73 74 29 09 09 76 65 72 69 66 (request)..verif
b0d0: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
b0e0: 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 CLIENT_ONCE | SS
b0f0: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 L_VERIFY_PEER;.
b100: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 if (request &
b110: 26 20 72 65 71 75 69 72 65 29 09 76 65 72 69 66 & require).verif
b120: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
b130: 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f FAIL_IF_NO_PEER_
b140: 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 CERT;. if (re
b150: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 quest && post_ha
b160: 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 ndshake).verify
b170: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f |= SSL_VERIFY_PO
b180: 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 ST_HANDSHAKE;.
b190: 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 if (verify ==
b1a0: 30 29 09 09 76 65 72 69 66 79 20 3d 20 53 53 4c 0)..verify = SSL
b1b0: 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 _VERIFY_NONE;..
b1c0: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c proto |= (ssl
b1d0: 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 2 ? TLS_PROTO_SS
b1e0: 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f L2 : 0);. pro
b1f0: 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c to |= (ssl3 ? TL
b200: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 S_PROTO_SSL3 : 0
b210: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 );. proto |=
b220: 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 (tls1 ? TLS_PROT
b230: 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 O_TLS1 : 0);.
b240: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f proto |= (tls1_
b250: 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 1 ? TLS_PROTO_TL
b260: 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 S1_1 : 0);. p
b270: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 roto |= (tls1_2
b280: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 ? TLS_PROTO_TLS1
b290: 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f _2 : 0);. pro
b2a0: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 to |= (tls1_3 ?
b2b0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
b2c0: 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 : 0);.. /* r
b2d0: 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 eset to NULL if
b2e0: 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f blank string pro
b2f0: 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 vided */. if
b300: 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 (cert && !*cert)
b310: 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20 .. cert.
b320: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
b330: 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a if (key && !*
b340: 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 key).. ke
b350: 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c y. = NULL
b360: 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 ;. if (certfi
b370: 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 le && !*certfile
b380: 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69 ) certfi
b390: 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 le.= NULL;. i
b3a0: 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a f (keyfile && !*
b3b0: 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c keyfile)..keyfil
b3c0: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c e. = NULL
b3d0: 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 ;. if (cipher
b3e0: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 s && !*ciphers).
b3f0: 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09 ciphers.
b400: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
b410: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75 if (ciphersu
b420: 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 ites && !*cipher
b430: 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75 suites) ciphersu
b440: 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a ites = NULL;.
b450: 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 if (CAfile &
b460: 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 & !*CAfile).
b470: 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 CAfile.
b480: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
b490: 66 20 28 43 41 64 69 72 20 26 26 20 21 2a 43 41 f (CAdir && !*CA
b4a0: 64 69 72 29 09 20 20 20 20 20 20 20 20 43 41 64 dir). CAd
b4b0: 69 72 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c ir. = NUL
b4c0: 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 L;. if (DHpar
b4d0: 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d ams && !*DHparam
b4e0: 73 29 09 20 20 20 20 20 20 20 20 44 48 70 61 72 s). DHpar
b4f0: 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c ams = NUL
b500: 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 L;.. /* new S
b510: 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 SL state */.
b520: 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 statePtr..= (Sta
b530: 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 te *) ckalloc((u
b540: 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 nsigned) sizeof(
b550: 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d State));. mem
b560: 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c set(statePtr, 0,
b570: 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b sizeof(State));
b580: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
b590: 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 flags.= flags;.
b5a0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 statePtr->int
b5b0: 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 erp.= interp;.
b5c0: 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 statePtr->vfla
b5d0: 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 gs.= verify;.
b5e0: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d statePtr->err.=
b5f0: 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c "";.. /* all
b600: 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a ocate script */.
b610: 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29 20 if (script)
b620: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 {..(void) Tcl_Ge
b630: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 tStringFromObj(s
b640: 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 cript, &len);..i
b650: 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 f (len) {.. s
b660: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
b670: 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20 k = script;..
b680: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
b690: 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c t(statePtr->call
b6a0: 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a back);..}. }.
b6b0: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 . /* allocate
b6c0: 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 password */.
b6d0: 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b if (password) {
b6e0: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 ..(void) Tcl_Get
b6f0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 StringFromObj(pa
b700: 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 ssword, &len);..
b710: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 if (len) {..
b720: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
b730: 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 rd = password;..
b740: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
b750: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 ount(statePtr->p
b760: 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 assword);..}.
b770: 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 }.. /* alloc
b780: 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 6f 6d ate validate com
b790: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 mand */. if (
b7a0: 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 vcmd) {..(void)
b7b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
b7c0: 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 mObj(vcmd, &len)
b7d0: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 ;..if (len) {..
b7e0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d statePtr->vcm
b7f0: 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 d = vcmd;.. T
b800: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
b810: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
b820: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 ..}. }.. i
b830: 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c f (model != NULL
b840: 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 ) {..int mode;..
b850: 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 /* Get the "mode
b860: 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 l" context */..c
b870: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
b880: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 nnel(interp, mod
b890: 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 el, &mode);..if
b8a0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
b8b0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
b8c0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
b8d0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
b8e0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
b8f0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a _ERROR;..}.../*.
b900: 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f . * Make sure to
b910: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
b920: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a topmost channel.
b930: 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c . */..chan = Tcl
b940: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
b950: 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 han);..if (Tcl_G
b960: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
b970: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
b980: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20 elType()) {..
b990: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
b9a0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
b9b0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
b9c0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
b9d0: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 han),..."\": not
b9e0: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c a TLS channel",
b9f0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c NULL);.. Tcl
ba00: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
ba10: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
ba20: 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 PORT", "CHANNEL"
ba30: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
ba40: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
ba50: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
ba60: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
ba70: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
ba80: 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 RROR;..}..ctx =
ba90: 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 ((State *)Tcl_Ge
baa0: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 tChannelInstance
bab0: 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 Data(chan))->ctx
bac0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
bad0: 69 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f 49 if ((ctx = CTX_I
bae0: 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20 73 65 nit(statePtr, se
baf0: 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 rver, proto, key
bb00: 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 file, certfile,
bb10: 6b 65 79 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c key, cert, key_l
bb20: 65 6e 2c 0a 09 20 20 20 20 63 65 72 74 5f 6c 65 en,.. cert_le
bb30: 6e 2c 20 43 41 64 69 72 2c 20 43 41 66 69 6c 65 n, CAdir, CAfile
bb40: 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 , ciphers, ciphe
bb50: 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 rsuites, level,
bb60: 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 DHparams)) == NU
bb70: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 LL) {.. Tls_F
bb80: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
bb90: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
bba0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
bbb0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 }. }.. sta
bbc0: 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 tePtr->ctx = ctx
bbd0: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
bbe0: 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 We need to make
bbf0: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 sure that the c
bc00: 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 hannel works in
bc10: 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a binary (for the.
bc20: 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f * encryptio
bc30: 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f n not to get goo
bc40: 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 fed up).. *
bc50: 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 We only want to
bc60: 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66 65 adjust the buffe
bc70: 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 63 ring in pre-v2 c
bc80: 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 hannels, where.
bc90: 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e 6e * each chann
bca0: 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 el in the stack
bcb0: 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20 6f maintained its o
bcc0: 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20 20 wn buffers..
bcd0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 */. Tcl_DStr
bce0: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
bcf0: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
bd00: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
bd10: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
bd20: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 nnelBlocking);.
bd30: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
bd40: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
bd50: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 EOFChar);. Tc
bd60: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
bd70: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
bd80: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 ing);. Tcl_Ge
bd90: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
bda0: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 nterp, chan, "-e
bdb0: 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 ofchar", &upperC
bdc0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a hannelEOFChar);.
bdd0: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e Tcl_GetChann
bde0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
bdf0: 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e chan, "-encodin
be00: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 g", &upperChanne
be10: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 lEncoding);.
be20: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
be30: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
be40: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
be50: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
be60: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 Translation);.
be70: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
be80: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
be90: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 han, "-blocking"
bea0: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 , &upperChannelB
beb0: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 locking);. Tc
bec0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
bed0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
bee0: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c "-translation",
bef0: 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 "binary");.
bf00: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
bf10: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
bf20: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 n, "-blocking",
bf30: 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72 "true");. dpr
bf40: 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 intf("Consuming
bf50: 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c Tcl channel %s",
bf60: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
bf70: 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 ame(chan));.
bf80: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
bf90: 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 Tcl_StackChanne
bfa0: 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 l(interp, Tls_Ch
bfb0: 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 6c annelType(), (Cl
bfc0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
bfd0: 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 4c tr, (TCL_READABL
bfe0: 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 E | TCL_WRITABLE
bff0: 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 ), chan);. dp
c000: 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 63 rintf("Created c
c010: 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 hannel named %s"
c020: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
c030: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
c040: 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 73 elf));. if (s
c050: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d tatePtr->self ==
c060: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
c070: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e ULL) {../*.. * N
c080: 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 o use of Tcl_Eve
c090: 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61 ntuallyFree beca
c0a0: 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 use no possible
c0b0: 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 Tcl_Preserve...
c0c0: 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 */..Tls_Free((ch
c0d0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
c0e0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
c0f0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
c100: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
c110: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ion(interp, stat
c120: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 ePtr->self, "-tr
c130: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f anslation", Tcl_
c140: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
c150: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
c160: 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c ation));. Tcl
c170: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
c180: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
c190: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f tr->self, "-enco
c1a0: 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 ding", Tcl_DStri
c1b0: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
c1c0: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b annelEncoding));
c1d0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
c1e0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
c1f0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
c200: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 , "-eofchar", Tc
c210: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
c220: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
c230: 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 har));. Tcl_S
c240: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
c250: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
c260: 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 ->self, "-blocki
c270: 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 ng", Tcl_DString
c280: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
c290: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a nelBlocking));..
c2a0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 /*. * SS
c2b0: 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e L Initialization
c2c0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 . */. sta
c2d0: 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c tePtr->ssl = SSL
c2e0: 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 _new(statePtr->c
c2f0: 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 tx);. if (!st
c300: 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 atePtr->ssl) {..
c310: 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 /* SSL library e
c320: 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 rror */..Tcl_App
c330: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
c340: 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 , "couldn't cons
c350: 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f truct ssl sessio
c360: 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 n: ", REASON(),
c370: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
c380: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f . Tcl_SetErro
c390: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
c3a0: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 LS", "IMPORT", "
c3b0: 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22 2c INIT", "FAILED",
c3c0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
c3d0: 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 ..Tls_Free((char
c3e0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
c3f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
c400: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
c410: 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 Set host server
c420: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 name */. if (
c430: 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f servername) {../
c440: 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65 * Sets the serve
c450: 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f r name indicatio
c460: 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e n (SNI) in Clien
c470: 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e tHello extension
c480: 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 */../* Per RFC
c490: 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 6066, hostname i
c4a0: 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 s a ASCII encode
c4b0: 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 d string, though
c4c0: 20 52 46 43 20 34 33 36 36 20 73 61 79 73 20 55 RFC 4366 says U
c4d0: 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 TF-8. */..if (!S
c4e0: 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f SL_set_tlsext_ho
c4f0: 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 st_name(statePtr
c500: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d ->ssl, servernam
c510: 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b e) && require) {
c520: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
c530: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
c540: 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f 73 74 setting TLS host
c550: 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20 name extension
c560: 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a failed", (char *
c570: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 ) NULL);.. Tc
c580: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
c590: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
c5a0: 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 MPORT", "SNI", "
c5b0: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
c5c0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c ) NULL);.. Tl
c5d0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
c5e0: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
c5f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
c600: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f ;..}.../* Set ho
c610: 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 stname for peer
c620: 63 65 72 74 69 66 69 63 61 74 65 20 68 6f 73 74 certificate host
c630: 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f name verificatio
c640: 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 n in clients...
c650: 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f Don't use SSL_
c660: 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 set1_host since
c670: 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f it has limitatio
c680: 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c ns. */..if (!SSL
c690: 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 _add1_host(state
c6a0: 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 Ptr->ssl, server
c6b0: 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 name)) {.. Tc
c6c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
c6d0: 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 nterp, "setting
c6e0: 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66 61 DNS host name fa
c6f0: 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 iled", (char *)
c700: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
c710: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
c720: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
c730: 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 ORT", "HOSTNAME"
c740: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
c750: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
c760: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
c770: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
c780: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
c790: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ROR;..}. }..
c7a0: 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 /* Resume ses
c7b0: 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 sion id */. i
c7c0: 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 f (session_id &&
c7d0: 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f strlen(session_
c7e0: 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 id) <= SSL_MAX_S
c7f0: 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b ID_CTX_LENGTH) {
c800: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 ../* SSL_set_ses
c810: 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 sion() */..if (!
c820: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 SSL_SESSION_set1
c830: 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f _id_context(SSL_
c840: 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 get_session(stat
c850: 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73 ePtr->ssl), sess
c860: 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 ion_id, (unsigne
c870: 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 d int) strlen(se
c880: 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 ssion_id))) {..
c890: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
c8a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 ult(interp, "Res
c8b0: 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 22 ume session id "
c8c0: 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 22 20 , session_id, "
c8d0: 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a failed", (char *
c8e0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 ) NULL);.. Tc
c8f0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
c900: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
c910: 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e MPORT", "SESSION
c920: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
c930: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
c940: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
c950: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
c960: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
c970: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a RROR;..}. }..
c980: 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70 /* Enable Ap
c990: 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20 plication-Layer
c9a0: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 Protocol Negotia
c9b0: 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61 tion. Examples a
c9c0: 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68 re: http/1.0,..h
c9d0: 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c ttp/1.1, h2, h3,
c9e0: 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33 ftp, imap, pop3
c9f0: 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78 , xmpp-client, x
ca00: 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74 74 mpp-server, mqtt
ca10: 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20 , irc, etc. */.
ca20: 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 if (alpn) {..
ca30: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c /* Convert a TCL
ca40: 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f list into a pro
ca50: 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 tocol-list in wi
ca60: 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e re-format */..un
ca70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f signed char *pro
ca80: 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e tos, *p;..unsign
ca90: 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 ed int protos_le
caa0: 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c n = 0;..int i, l
cab0: 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 en, cnt;..Tcl_Ob
cac0: 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 j **list;...if (
cad0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c Tcl_ListObjGetEl
cae0: 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 ements(interp, a
caf0: 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 lpn, &cnt, &list
cb00: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
cb10: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
cb20: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
cb30: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
cb40: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
cb50: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 Determine the me
cb60: 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f mory required fo
cb70: 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c r the protocol-l
cb80: 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d ist */..for (i =
cb90: 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 0; i < cnt; i++
cba0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 ) {.. Tcl_Get
cbb0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 StringFromObj(li
cbc0: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 st[i], &len);..
cbd0: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 if (len > 255
cbe0: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
cbf0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
cc00: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 ALPN protocol na
cc10: 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 me too long", (c
cc20: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
cc30: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
cc40: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
cc50: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 "IMPORT", "ALPN"
cc60: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
cc70: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c r *) NULL);...Tl
cc80: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
cc90: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 statePtr);...ret
cca0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
ccb0: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f }.. proto
ccc0: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e s_len += 1 + len
ccd0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 ;..}.../* Build
cce0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f the complete pro
ccf0: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 tocol-list */..p
cd00: 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 rotos = ckalloc(
cd10: 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a protos_len);../*
cd20: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 protocol-lists
cd30: 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 consist of 8-bit
cd40: 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 length-prefixed
cd50: 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a , byte strings *
cd60: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 70 /..for (i = 0, p
cd70: 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20 63 = protos; i < c
cd80: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 nt; i++) {..
cd90: 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f char *str = Tcl_
cda0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
cdb0: 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b (list[i], &len);
cdc0: 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e .. *p++ = len
cdd0: 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c ;.. memcpy(p,
cde0: 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 20 str, len);..
cdf0: 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 p += len;..}...
ce00: 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f /* SSL_set_alpn_
ce10: 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 protos makes a c
ce20: 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f opy of the proto
ce30: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 col-list */../*
ce40: 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 Note: This funct
ce50: 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68 ions reverses th
ce60: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 e return value c
ce70: 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 onvention */..if
ce80: 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 (SSL_set_alpn_p
ce90: 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e rotos(statePtr->
cea0: 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f ssl, protos, pro
ceb0: 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 tos_len)) {..
cec0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
ced0: 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65 t(interp, "faile
cee0: 64 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 70 72 d to set ALPN pr
cef0: 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 20 otocols", (char
cf00: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
cf10: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
cf20: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
cf30: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c IMPORT", "ALPN",
cf40: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
cf50: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
cf60: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a Tls_Free((char *
cf70: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
cf80: 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 ckfree(protos)
cf90: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
cfa0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
cfb0: 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 Store protocols
cfc0: 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 list */..stateP
cfd0: 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f tr->protos = pro
cfe0: 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e tos;..statePtr->
cff0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f protos_len = pro
d000: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 tos_len;. } e
d010: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d lse {..statePtr-
d020: 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a >protos = NULL;.
d030: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
d040: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d s_len = 0;. }
d050: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
d060: 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 SSL Callbacks.
d070: 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 */. SSL_se
d080: 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 t_app_data(state
d090: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 Ptr->ssl, (void
d0a0: 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 *)statePtr);./*
d0b0: 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 point back to us
d0c0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f */. SSL_set_
d0d0: 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d verify(statePtr-
d0e0: 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 >ssl, verify, Ve
d0f0: 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 rifyCallback);.
d100: 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f SSL_set_info_
d110: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 callback(statePt
d120: 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c r->ssl, InfoCall
d130: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 back);.. /* C
d140: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 allback for obse
d150: 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d rving protocol m
d160: 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 essages */.#ifnd
d170: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ef OPENSSL_NO_SS
d180: 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 L_TRACE. /* v
d190: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f oid SSL_CTX_set_
d1a0: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 msg_callback_arg
d1b0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
d1c0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
d1d0: 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f );. void SSL_
d1e0: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c CTX_set_msg_call
d1f0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 back(statePtr->c
d200: 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 tx, MessageCallb
d210: 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c ack); */. SSL
d220: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 _set_msg_callbac
d230: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e k_arg(statePtr->
d240: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ssl, (void *)sta
d250: 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f tePtr);. SSL_
d260: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
d270: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
d280: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 MessageCallback)
d290: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a ;.#endif.. /*
d2a0: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e Create Tcl_Chan
d2b0: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 nel BIO Handler
d2c0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
d2d0: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 >p_bio.= BIO_new
d2e0: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 _tcl(statePtr, B
d2f0: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 IO_NOCLOSE);.
d300: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d statePtr->bio.=
d310: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 BIO_new(BIO_f_s
d320: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 sl());.. if (
d330: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 server) {../* Se
d340: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a rver callbacks *
d350: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 /..SSL_CTX_set_t
d360: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 lsext_servername
d370: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 _arg(statePtr->c
d380: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 tx, (void *)stat
d390: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f ePtr);..SSL_CTX_
d3a0: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 set_tlsext_serve
d3b0: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 rname_callback(s
d3c0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e tatePtr->ctx, SN
d3d0: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c ICallback);..SSL
d3e0: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
d3f0: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 hello_cb(statePt
d400: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c r->ctx, HelloCal
d410: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 lback, (void *)s
d420: 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 tatePtr);..if (s
d430: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
d440: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
d450: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e SSL_CTX_set_alpn
d460: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 _select_cb(state
d470: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 Ptr->ctx, ALPNCa
d480: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
d490: 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 statePtr);.#ifde
d4a0: 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 f USE_NPN.. i
d4b0: 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 f (tls1_2 == 0 &
d4c0: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b & tls1_3 == 0) {
d4d0: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e ...SSL_CTX_set_n
d4e0: 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 ext_protos_adver
d4f0: 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 tised_cb(statePt
d500: 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 r->ctx, NPNCallb
d510: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ack, (void *)sta
d520: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 tePtr);.. }.#
d530: 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e endif..}.../* En
d540: 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 able server to s
d550: 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74 end cert request
d560: 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 after handshake
d570: 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 (TLS 1.3 only)
d580: 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f */../* A write o
d590: 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 peration must ta
d5a0: 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 ke place for the
d5b0: 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71 Certificate Req
d5c0: 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 uest to be.. s
d5d0: 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e ent to the clien
d5e0: 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 t, this can be d
d5f0: 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f one with SSL_do_
d600: 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a handshake(). */.
d610: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 .if (request &&
d620: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 post_handshake &
d630: 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 & tls1_3) {..
d640: 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 SSL_verify_clie
d650: 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b nt_post_handshak
d660: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
d670: 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 ;..}.../* set au
d680: 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 tomatic curve se
d690: 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f lection */..SSL_
d6a0: 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 set_ecdh_auto(st
d6b0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b atePtr->ssl, 1);
d6c0: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 .../* Set server
d6d0: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 mode */..stateP
d6e0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 tr->flags |= TLS
d6f0: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 _TCL_SERVER;..SS
d700: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 L_set_accept_sta
d710: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
d720: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
d730: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 ./* Client callb
d740: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 acks */.#ifdef U
d750: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 SE_NPN..if (stat
d760: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
d770: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d NULL && tls1_2 =
d780: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d = 0 && tls1_3 ==
d790: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 0) {.. SSL_C
d7a0: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 TX_set_next_prot
d7b0: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 o_select_cb(stat
d7c0: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 ePtr->ctx, ALPNC
d7d0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
d7e0: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 )statePtr);..}.#
d7f0: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 endif.../* Sessi
d800: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 on caching */..S
d810: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 SL_CTX_set_sessi
d820: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 on_cache_mode(st
d830: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c atePtr->ctx, SSL
d840: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 _SESS_CACHE_CLIE
d850: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 NT | SSL_SESS_CA
d860: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f CHE_NO_INTERNAL_
d870: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 STORE);..SSL_CTX
d880: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 _sess_set_new_cb
d890: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
d8a0: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 SessionCallback)
d8b0: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f ;.../* Enable po
d8c0: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 st handshake Aut
d8d0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 hentication exte
d8e0: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f nsion. TLS 1.3 o
d8f0: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e nly, not http/2.
d900: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 */..if (request
d910: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 && post_handsha
d920: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 ke) {.. SSL_s
d930: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b et_post_handshak
d940: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d e_auth(statePtr-
d950: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f >ssl, 1);..}.../
d960: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 * Set client mod
d970: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f e */..SSL_set_co
d980: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 nnect_state(stat
d990: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
d9a0: 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 }. SSL_set_bi
d9b0: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c o(statePtr->ssl,
d9c0: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
d9d0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 , statePtr->p_bi
d9e0: 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f o);. BIO_set_
d9f0: 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 ssl(statePtr->bi
da00: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c o, statePtr->ssl
da10: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a , BIO_NOCLOSE);.
da20: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 . /*. * E
da30: 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 nd of SSL Init.
da40: 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e */. dprin
da50: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 tf("Returning %s
da60: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
da70: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
da80: 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f self));. Tcl_
da90: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
daa0: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 , (char *) Tcl_G
dab0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
dac0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 atePtr->self), T
dad0: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 CL_VOLATILE);..
dae0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
daf0: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
db00: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
db10: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
db20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 --------. *. * U
db60: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d nimportObjCmd --
db70: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
db80: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
db90: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 to remove the t
dba0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 opmost channel f
dbb0: 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 ilter.. *. * Res
dbc0: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
dbd0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
dbe0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
dbf0: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 ts:. *.May modif
dc00: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f y the behavior o
dc10: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e f an IO channel.
dc20: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
dc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
dc70: 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 atic int.Unimpor
dc80: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 tObjCmd(ClientDa
dc90: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
dca0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
dcb0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
dcc0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
dcd0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
dce0: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 annel chan;../*
dcf0: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
dd00: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f et a mode on. */
dd10: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
dd20: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
dd30: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
dd40: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
dd50: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
dd60: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
dd70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
dd80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e . }.. chan
dd90: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
dda0: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
ddb0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 tString(objv[1])
ddc0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 , NULL);. if
ddd0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
dde0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
ddf0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
de00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
de10: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
de20: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
de30: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
de40: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
de50: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
de60: 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f );.. if (Tcl_
de70: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
de80: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
de90: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 nelType()) {..Tc
dea0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
deb0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
dec0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
ded0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
dee0: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
def0: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
df00: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
df10: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
df20: 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 p, "TLS", "UNIMP
df30: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c ORT", "CHANNEL",
df40: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
df50: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
df60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
df70: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 }.. if (Tc
df80: 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c l_UnstackChannel
df90: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d (interp, chan) =
dfa0: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 = TCL_ERROR) {..
dfb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
dfc0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 ;. }.. ret
dfd0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
dfe0: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
dff0: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
e000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e040: 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 --. *. * CTX_Ini
e050: 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 t -- construct a
e060: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 SSL_CTX instanc
e070: 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a e. *. * Results:
e080: 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f . *.A valid SSL_
e090: 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 CTX instance or
e0a0: 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 NULL.. *. * Side
e0b0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e effects:. *.con
e0c0: 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 structs SSL cont
e0d0: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d ext (CTX). *. *-
e0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e120: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 --. */.static SS
e130: 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 L_CTX *.CTX_Init
e140: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 (State *statePtr
e150: 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 , int isServer,
e160: 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 int proto, char
e170: 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a *keyfile, char *
e180: 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e certfile,. un
e190: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 signed char *key
e1a0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
e1b0: 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c *cert, int key_l
e1c0: 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e en, int cert_len
e1d0: 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 , char *CAdir,.
e1e0: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c char *CAfile,
e1f0: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 char *ciphers,
e200: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 char *ciphersuit
e210: 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 es, int level, c
e220: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b har *DHparams) {
e230: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
e240: 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 *interp = stateP
e250: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
e260: 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e SSL_CTX *ctx = N
e270: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ULL;. Tcl_DSt
e280: 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c ring ds;. Tcl
e290: 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 _DString ds1;.
e2a0: 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 int off = 0;.
e2b0: 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 int load_priv
e2c0: 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e ate_key;. con
e2d0: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d st SSL_METHOD *m
e2e0: 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 ethod;.. dpri
e2f0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
e300: 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 if (!proto)
e310: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
e320: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 ult(interp, "no
e330: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 valid protocol s
e340: 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b elected", NULL);
e350: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
e360: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 }.. /* cre
e370: 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 ate SSL context
e380: 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 */.#if OPENSSL_V
e390: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d ERSION_NUMBER >=
e3a0: 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 0x10100000L ||
e3b0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
e3c0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
e3d0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
e3e0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
e3f0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 to, TLS_PROTO_SS
e400: 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 L2)) {..Tcl_Appe
e410: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
e420: 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 "SSL2 protocol
e430: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
e440: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
e450: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
e460: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
e470: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
e480: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
e490: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 3). if (ENABL
e4a0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
e4b0: 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 OTO_SSL3)) {..Tc
e4c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
e4d0: 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f nterp, "SSL3 pro
e4e0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
e4f0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ted", NULL);..re
e500: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
e510: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
e520: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 ned(NO_TLS1) ||
e530: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e540: 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 NO_TLS1). if
e550: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
e560: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 TLS_PROTO_TLS1))
e570: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
e580: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
e590: 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.0 protocol n
e5a0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
e5b0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
e5c0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
e5d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
e5e0: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
e5f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e600: 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e S1_1). if (EN
e610: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
e620: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 _PROTO_TLS1_1))
e630: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
e640: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ult(interp, "TLS
e650: 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 1.1 protocol no
e660: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
e670: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
e680: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
e690: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
e6a0: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
e6b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
e6c0: 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 1_2). if (ENA
e6d0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
e6e0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b PROTO_TLS1_2)) {
e6f0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
e700: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 lt(interp, "TLS
e710: 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 1.2 protocol not
e720: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
e730: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
e740: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
e750: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
e760: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_3) || defined
e770: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
e780: 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 _3). if (ENAB
e790: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
e7a0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a ROTO_TLS1_3)) {.
e7b0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
e7c0: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
e7d0: 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .3 protocol not
e7e0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
e7f0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
e800: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 . }.#endif.
e810: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 if (proto == 0
e820: 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c ) {../* Use full
e830: 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 range */..SSL_C
e840: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f TX_set_min_proto
e850: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 _version(ctx, 0)
e860: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d ;..SSL_CTX_set_m
e870: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e ax_proto_version
e880: 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a (ctx, 0);. }.
e890: 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f . switch (pro
e8a0: 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 to) {.#if OPENSS
e8b0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
e8c0: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 < 0x10100000L &
e8d0: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 & !defined(NO_SS
e8e0: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L2) && !defined(
e8f0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
e900: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
e910: 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f OTO_SSL2:..metho
e920: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 d = isServer ? S
e930: 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 SLv2_server_meth
e940: 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 od() : SSLv2_cli
e950: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
e960: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
e970: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
e980: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
e990: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 PENSSL_NO_SSL3)
e9a0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e9b0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 SSL_NO_SSL3_METH
e9c0: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 OD). case TLS
e9d0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 _PROTO_SSL3:..me
e9e0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
e9f0: 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d ? SSLv3_server_m
ea00: 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f ethod() : SSLv3_
ea10: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
ea20: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
ea30: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
ea40: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 TLS1) && !define
ea50: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
ea60: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
ea70: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d PENSSL_NO_TLS1_M
ea80: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 ETHOD). case
ea90: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a TLS_PROTO_TLS1:.
eaa0: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
eab0: 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 er ? TLSv1_serve
eac0: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 r_method() : TLS
ead0: 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 v1_client_method
eae0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
eaf0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
eb00: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
eb10: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
eb20: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
eb30: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
eb40: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a _TLS1_1_METHOD).
eb50: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
eb60: 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 TO_TLS1_1:..meth
eb70: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
eb80: 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d TLSv1_1_server_m
eb90: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f ethod() : TLSv1_
eba0: 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 1_client_method(
ebb0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
ebc0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
ebd0: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 O_TLS1_2) && !de
ebe0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
ebf0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
ec00: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
ec10: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 TLS1_2_METHOD).
ec20: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
ec30: 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f O_TLS1_2:..metho
ec40: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
ec50: 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 LSv1_2_server_me
ec60: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 thod() : TLSv1_2
ec70: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
ec80: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
ec90: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
eca0: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 _TLS1_3) && !def
ecb0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
ecc0: 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 TLS1_3). case
ecd0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
ece0: 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 3:../* Use the g
ecf0: 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e eneric method an
ed00: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e d constraint ran
ed10: 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 ge after context
ed20: 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 is created */..
ed30: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
ed40: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d r ? TLS_server_m
ed50: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c ethod() : TLS_cl
ed60: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
ed70: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 break;.#endif.
ed80: 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e default:../* N
ed90: 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 egotiate highest
eda0: 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 available SSL/T
edb0: 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d LS version */..m
edc0: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
edd0: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 ? TLS_server_me
ede0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 thod() : TLS_cli
edf0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 ent_method();.#i
ee00: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
ee10: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
ee20: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 00000L && !defin
ee30: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 ed(NO_SSL2) && !
ee40: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
ee50: 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d NO_SSL2)..off |=
ee60: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
ee70: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 TLS_PROTO_SSL2)
ee80: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f ? 0 : SSL_OP_
ee90: 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 NO_SSLv2);.#endi
eea0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
eeb0: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
eec0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
eed0: 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e SL3)..off |= (EN
eee0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
eef0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f _PROTO_SSL3) ?
ef00: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 0 : SSL_OP_NO_S
ef10: 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 SLv3);.#endif.#i
ef20: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
ef30: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
ef40: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
ef50: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
ef60: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
ef70: 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a TO_TLS1) ? 0 :
ef80: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
ef90: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
efa0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
efb0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
efc0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
efd0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
efe0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
eff0: 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a TO_TLS1_1) ? 0 :
f000: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
f010: 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 _1);.#endif.#if
f020: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
f030: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
f040: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
f050: 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 2)..off |= (ENAB
f060: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
f070: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 ROTO_TLS1_2) ? 0
f080: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 : SSL_OP_NO_TLS
f090: 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 v1_2);.#endif.#i
f0a0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
f0b0: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
f0c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
f0d0: 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 1_3)..off |= (EN
f0e0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
f0f0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f _PROTO_TLS1_3) ?
f100: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
f110: 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a LSv1_3);.#endif.
f120: 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 .break;. }..
f130: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 ERR_clear_err
f140: 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d or();.. ctx =
f150: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 SSL_CTX_new(met
f160: 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 hod);. if (!c
f170: 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 tx) {..return(NU
f180: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 LL);. }..
f190: 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 if (getenv(SSLKE
f1a0: 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 YLOGFILE)) {..SS
f1b0: 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 L_CTX_set_keylog
f1c0: 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b _callback(ctx, K
f1d0: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a eyLogCallback);.
f1e0: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 }..#if !defi
f1f0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
f200: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
f210: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
f220: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 if (proto == T
f230: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
f240: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
f250: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f min_proto_versio
f260: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
f270: 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 RSION);..SSL_CTX
f280: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 _set_max_proto_v
f290: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
f2a0: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 _3_VERSION);.
f2b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f }.#endif.. /
f2c0: 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 * Force cipher s
f2d0: 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 election order b
f2e0: 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 y server */.
f2f0: 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b if (!isServer) {
f300: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 ..SSL_CTX_set_op
f310: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
f320: 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f P_CIPHER_SERVER_
f330: 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 PREFERENCE);.
f340: 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f }..#if OPENSSL_
f350: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
f360: 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 0x10100000L.
f370: 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c OpenSSL_add_all
f380: 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f _algorithms(); /
f390: 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 * Load ciphers a
f3a0: 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 nd digests */.#e
f3b0: 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 ndif.. SSL_CT
f3c0: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 X_set_app_data(c
f3d0: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 tx, (void*)inter
f3e0: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 p);./* remember
f3f0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
f400: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
f410: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
f420: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 SSL_OP_ALL);./*
f430: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b all SSL bug work
f440: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 arounds */. S
f450: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
f460: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e ns(ctx, SSL_OP_N
f470: 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 O_COMPRESSION);.
f480: 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 /* disable compr
f490: 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 ession even if s
f4a0: 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 upported */.
f4b0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
f4c0: 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 ons(ctx, off);..
f4d0: 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f /* disable proto
f4e0: 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a col versions */.
f4f0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
f500: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
f510: 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 0101000L. SSL
f520: 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 _CTX_set_mode(ct
f530: 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f x, SSL_MODE_AUTO
f540: 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 _RETRY);./* hand
f550: 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 le new handshake
f560: 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e s in background.
f570: 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 On by default i
f580: 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e n OpenSSL 1.1.1.
f590: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 */.#endif. S
f5a0: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f SL_CTX_sess_set_
f5b0: 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 cache_size(ctx,
f5c0: 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 128);.. /* Se
f5d0: 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 t user defined c
f5e0: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 iphers, cipher s
f5f0: 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 uites, and secur
f600: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 ity level */.
f610: 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d if ((ciphers !=
f620: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 NULL) && !SSL_C
f630: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 TX_set_cipher_li
f640: 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 st(ctx, ciphers)
f650: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
f660: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
f670: 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 et ciphers faile
f680: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 d: No valid ciph
f690: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ers", (char *) N
f6a0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
f6b0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
f6c0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 n NULL;. }.
f6d0: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69 if ((ciphersui
f6e0: 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 tes != NULL) &&
f6f0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 !SSL_CTX_set_cip
f700: 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 hersuites(ctx, c
f710: 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a iphersuites)) {.
f720: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
f730: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 t(interp, "Set c
f740: 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69 ipher suites fai
f750: 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 led: No valid ci
f760: 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 phers", (char *)
f770: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
f780: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
f790: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
f7a0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 . /* Set secu
f7b0: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 rity level */.
f7c0: 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 if (level > -1
f7d0: 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b && level < 6) {
f7e0: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 ../* SSL_set_sec
f7f0: 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 urity_level */..
f800: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 SSL_CTX_set_secu
f810: 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 rity_level(ctx,
f820: 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 level);. }..
f830: 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 /* set some c
f840: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 allbacks */.
f850: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 SSL_CTX_set_defa
f860: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 ult_passwd_cb(ct
f870: 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 x, PasswordCallb
f880: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 ack);. SSL_CT
f890: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 X_set_default_pa
f8a0: 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 sswd_cb_userdata
f8b0: 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 (ctx, (void *)st
f8c0: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a atePtr);.. /*
f8d0: 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 read a Diffie-H
f8e0: 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 ellman parameter
f8f0: 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 s file, or use t
f900: 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 he built-in one
f910: 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 */.#ifdef OPENSS
f920: 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 L_NO_DH. if (
f930: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c DHparams != NULL
f940: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
f950: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 esult(interp, "D
f960: 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 H parameter supp
f970: 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c ort not availabl
f980: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c e", (char *) NUL
f990: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
f9a0: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
f9b0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 NULL;. }.#els
f9c0: 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b e. {..DH* dh;
f9d0: 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 ..if (DHparams !
f9e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 = NULL) {.. B
f9f0: 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 IO *bio;.. Tc
fa00: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 l_DStringInit(&d
fa10: 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 s);.. bio = B
fa20: 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 IO_new_file(F2N(
fa30: 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 DHparams, &ds),
fa40: 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 "r");.. if (!
fa50: 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 bio) {...Tcl_DSt
fa60: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
fa70: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
fa80: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 t(interp, "Could
fa90: 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 not find DH par
faa0: 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 ameters file", (
fab0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
fac0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
fad0: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c x);...return NUL
fae0: 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 L;.. }...
faf0: 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 dh = PEM_read_bi
fb00: 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 o_DHparams(bio,
fb10: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c NULL, NULL, NULL
fb20: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 );.. BIO_free
fb30: 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f (bio);.. Tcl_
fb40: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
fb50: 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20 ;.. if (!dh)
fb60: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {...Tcl_AppendRe
fb70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f sult(interp, "Co
fb80: 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 uld not read DH
fb90: 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 parameters from
fba0: 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 file", (char *)
fbb0: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
fbc0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
fbd0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
fbe0: 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 }..} else {..
fbf0: 20 64 68 20 3d 20 67 65 74 5f 64 68 50 61 72 61 dh = get_dhPara
fc00: 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 ms();..}..SSL_CT
fc10: 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 X_set_tmp_dh(ctx
fc20: 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 65 28 , dh);..DH_free(
fc30: 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 dh);. }.#endi
fc40: 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 f.. /* set ou
fc50: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f r certificate */
fc60: 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 . load_privat
fc70: 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 e_key = 0;. i
fc80: 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e f (certfile != N
fc90: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 ULL) {..load_pri
fca0: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 vate_key = 1;...
fcb0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
fcc0: 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f &ds);...if (SSL_
fcd0: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
fce0: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 ate_file(ctx, F2
fcf0: 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 N(certfile, &ds)
fd00: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 , SSL_FILETYPE_P
fd10: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 EM) <= 0) {..
fd20: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
fd30: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f (&ds);.. Tcl_
fd40: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
fd50: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
fd60: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 set certificate
fd70: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 file ", certfile
fd80: 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 , ": ",....
fd90: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
fda0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
fdb0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
fdc0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
fdd0: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 LL;..}. } els
fde0: 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 e if (cert != NU
fdf0: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 LL) {..load_priv
fe00: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 ate_key = 1;..if
fe10: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 (SSL_CTX_use_ce
fe20: 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 rtificate_ASN1(c
fe30: 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 tx, cert_len, ce
fe40: 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 rt) <= 0) {..
fe50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
fe60: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f (&ds);.. Tcl_
fe70: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
fe80: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
fe90: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a set certificate:
fea0: 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 ",.... REAS
feb0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
fec0: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
fed0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
fee0: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
fef0: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a .}. } else {.
ff00: 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 .certfile = (cha
ff10: 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 r*)X509_get_defa
ff20: 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b ult_cert_file();
ff30: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 ...if (SSL_CTX_u
ff40: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 se_certificate_f
ff50: 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c ile(ctx, certfil
ff60: 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f e, SSL_FILETYPE_
ff70: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 PEM) <= 0) {.#if
ff80: 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 0.. Tcl_DStr
ff90: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
ffa0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
ffb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
ffc0: 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 ble to use defau
ffd0: 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 lt certificate f
ffe0: 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c ile ", certfile,
fff0: 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 ": ",.... R
10000 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
10010 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 ) NULL);.. SS
10020 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
10030 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
10040 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 L;.#endif..}.
10050 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f }.. /* set o
10060 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a ur private key *
10070 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 /. if (load_p
10080 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 rivate_key) {..i
10090 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 f (keyfile == NU
100a0 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c LL && key == NUL
100b0 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c L) {.. keyfil
100c0 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d e = certfile;..}
100d0 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 ...if (keyfile !
100e0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f = NULL) {.. /
100f0 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 * get the privat
10100 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 e key associated
10110 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 with this certi
10120 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 ficate */.. i
10130 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 f (keyfile == NU
10140 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 LL) {...keyfile
10150 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 = certfile;..
10160 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c }... if (SSL
10170 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 _CTX_use_Private
10180 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 Key_file(ctx, F2
10190 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c N(keyfile, &ds),
101a0 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 SSL_FILETYPE_PE
101b0 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c M) <= 0) {...Tcl
101c0 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
101d0 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 );.../* flush th
101e0 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 e passphrase whi
101f0 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 ch might be left
10200 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a in the result *
10210 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c /...Tcl_SetResul
10220 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 t(interp, NULL,
10230 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 TCL_STATIC);...T
10240 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
10250 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
10260 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 to set public ke
10270 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c y file ", keyfil
10280 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20 e, " ",....
10290 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 REASON(), (c
102a0 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
102b0 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
102c0 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
102d0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 ;.. }.. Tc
102e0 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
102f0 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 s);...} else if
10300 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (key != NULL) {.
10310 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 . if (SSL_CTX
10320 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f _use_PrivateKey_
10330 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 ASN1(EVP_PKEY_RS
10340 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f A, ctx, key,key_
10350 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 len) <= 0) {...T
10360 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
10370 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 ds);.../* flush
10380 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 the passphrase w
10390 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 hich might be le
103a0 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 ft in the result
103b0 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 */...Tcl_SetRes
103c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c ult(interp, NULL
103d0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 , TCL_STATIC);..
103e0 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
103f0 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
10400 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 e to set public
10410 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 key: ", REASON()
10420 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
10430 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
10440 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
10450 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a NULL;.. }..}.
10460 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 ./* Now we know
10470 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 that a key and c
10480 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 ert have been se
10490 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 t against.. * th
104a0 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f e SSL context */
104b0 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 ..if (!SSL_CTX_c
104c0 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 heck_private_key
104d0 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 (ctx)) {.. Tc
104e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
104f0 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 nterp, "private
10500 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 key does not mat
10510 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 ch the certifica
10520 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a te public key",.
10530 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 ... (char *)
10540 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c NULL);.. SSL
10550 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
10560 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c . return NULL
10570 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
10580 2f 2a 20 53 65 74 20 76 65 72 69 66 69 63 61 74 /* Set verificat
10590 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 54 ion CAs */. T
105a0 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
105b0 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ds);. Tcl_DSt
105c0 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a ringInit(&ds1);.
105d0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 /* There is
105e0 6f 6e 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 one default dire
105f0 63 74 6f 72 79 2c 20 6f 6e 65 20 64 65 66 61 75 ctory, one defau
10600 6c 74 20 66 69 6c 65 2c 20 61 6e 64 20 6f 6e 65 lt file, and one
10610 20 64 65 66 61 75 6c 74 20 73 74 6f 72 65 2e 0a default store..
10620 09 54 68 65 20 64 65 66 61 75 6c 74 20 43 41 20 .The default CA
10630 63 65 72 74 69 66 69 63 61 74 65 73 20 64 69 72 certificates dir
10640 65 63 74 6f 72 79 20 28 61 6e 64 20 64 65 66 61 ectory (and defa
10650 75 6c 74 20 73 74 6f 72 65 29 20 69 73 20 69 6e ult store) is in
10660 20 74 68 65 20 4f 70 65 6e 53 53 4c 0a 09 63 65 the OpenSSL..ce
10670 72 74 73 20 64 69 72 65 63 74 6f 72 79 2e 20 49 rts directory. I
10680 74 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 t can be overrid
10690 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 den by the SSL_C
106a0 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e ERT_DIR env var.
106b0 20 54 68 65 0a 09 64 65 66 61 75 6c 74 20 43 41 The..default CA
106c0 20 63 65 72 74 69 66 69 63 61 74 65 73 20 66 69 certificates fi
106d0 6c 65 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72 le is called cer
106e0 74 2e 70 65 6d 20 69 6e 20 74 68 65 20 64 65 66 t.pem in the def
106f0 61 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 09 64 69 ault OpenSSL..di
10700 72 65 63 74 6f 72 79 2e 20 49 74 20 63 61 6e 20 rectory. It can
10710 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 be overridden by
10720 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 the SSL_CERT_FI
10730 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 09 LE env var. */..
10740 2f 2a 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 /* int SSL_CTX_s
10750 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 et_default_verif
10760 79 5f 64 69 72 28 53 53 4c 5f 43 54 58 20 2a 63 y_dir(SSL_CTX *c
10770 74 78 29 20 61 6e 64 20 69 6e 74 20 53 53 4c 5f tx) and int SSL_
10780 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
10790 76 65 72 69 66 79 5f 66 69 6c 65 28 53 53 4c 5f verify_file(SSL_
107a0 43 54 58 20 2a 63 74 78 29 20 2a 2f 0a 20 20 20 CTX *ctx) */.
107b0 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f if (!SSL_CTX_lo
107c0 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 ad_verify_locati
107d0 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 ons(ctx, F2N(CAf
107e0 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 ile, &ds), F2N(C
107f0 41 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a Adir, &ds1)) ||.
10800 09 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 .!SSL_CTX_set_de
10810 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 fault_verify_pat
10820 68 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 hs(ctx)) {.#if 0
10830 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
10840 65 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 e(&ds);..Tcl_DSt
10850 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a ringFree(&ds1);.
10860 09 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e ./* Don't curren
10870 74 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73 tly care if this
10880 20 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 fails */..Tcl_A
10890 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
108a0 72 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 rp, "SSL default
108b0 20 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 verify paths: "
108c0 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 , REASON(), (cha
108d0 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c r *) NULL);..SSL
108e0 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
108f0 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 .return NULL;.#e
10900 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ndif. }..
10910 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 /* https://sourc
10920 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 eforge.net/p/tls
10930 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 /bugs/57/ */.
10940 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 /* XXX:TODO: Le
10950 74 20 74 68 65 20 75 73 65 72 20 73 75 70 70 6c t the user suppl
10960 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e y values here in
10970 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 stead of somethi
10980 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 20 6f ng that exists o
10990 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d n the filesystem
109a0 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 66 69 */. if (CAfi
109b0 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53 le != NULL) {..S
109c0 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d TACK_OF(X509_NAM
109d0 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 E) *certNames =
109e0 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f SSL_load_client_
109f0 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 CA_file(F2N(CAfi
10a00 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 20 28 le, &ds));..if (
10a10 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c certNames != NUL
10a20 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 L) {.. SSL_CT
10a30 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f X_set_client_CA_
10a40 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 list(ctx, certNa
10a50 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a mes);..}. }..
10a60 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
10a70 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 54 63 ree(&ds);. Tc
10a80 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
10a90 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 s1);. return
10aa0 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ctx;.}.../*. *--
10ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10af0 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 -. *. * StatusOb
10b00 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 jCmd -- return c
10b10 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 63 ertificate for c
10b20 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a 20 onnected peer..
10b30 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
10b40 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
10b50 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
10b60 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
10b70 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
10b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
10bc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61 /.static int.Sta
10bd0 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 tusObjCmd(Client
10be0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
10bf0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
10c00 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
10c10 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
10c20 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 jv[]) {. Stat
10c30 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 e *statePtr;.
10c40 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 X509 *peer;.
10c50 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
10c60 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 ;. Tcl_Channe
10c70 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 l chan;. char
10c80 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a *channelName, *
10c90 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 ciphers;. int
10ca0 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 mode;. const
10cb0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
10cc0 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 proto;. unsig
10cd0 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 ned int len;.
10ce0 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a 0a int nid, res;..
10cf0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
10d00 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
10d10 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 objc < 2 || objc
10d20 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d > 3 || (objc ==
10d30 20 33 20 26 26 20 21 73 74 72 63 6d 70 28 54 63 3 && !strcmp(Tc
10d40 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
10d50 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 [1]), "-local"))
10d60 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
10d70 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
10d80 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f objv, "?-local?
10d90 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 channel");..ret
10da0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
10db0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 }.. /* Get
10dc0 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 channel Id */.
10dd0 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d channelName =
10de0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
10df0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 28 6f 62 6a 63 omObj(objv[(objc
10e00 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d 2c == 2 ? 1 : 2)],
10e10 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 63 68 61 6e NULL);. chan
10e20 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
10e30 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 l(interp, channe
10e40 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 lName, &mode);.
10e50 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
10e60 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
10e70 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
10e80 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
10e90 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
10ea0 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
10eb0 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
10ec0 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
10ed0 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
10ee0 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 l(chan);. if
10ef0 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
10f00 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
10f10 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
10f20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
10f30 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
10f40 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
10f50 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
10f60 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e (chan),..."\": n
10f70 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
10f80 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 ", NULL);..Tcl_S
10f90 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
10fa0 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 rp, "TLS", "STAT
10fb0 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 US", "CHANNEL",
10fc0 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 "INVALID", (char
10fd0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
10fe0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
10ff0 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 }. statePtr
11000 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c = (State *) Tcl
11010 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
11020 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a nceData(chan);..
11030 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 /* Get certi
11040 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 ficate for peer
11050 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 or self */. i
11060 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a f (objc == 2) {.
11070 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f .peer = SSL_get_
11080 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 peer_certificate
11090 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
110a0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 . } else {..p
110b0 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 eer = SSL_get_ce
110c0 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 rtificate(stateP
110d0 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a tr->ssl);. }.
110e0 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 /* Get X509
110f0 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f certificate info
11100 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 */. if (peer
11110 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c ) {..objPtr = Tl
11120 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 s_NewX509Obj(int
11130 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 erp, peer);..if
11140 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 (objc == 2) {..
11150 20 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 X509_free(pee
11160 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20 r);.. peer =
11170 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 NULL;..}. } e
11180 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 lse {..objPtr =
11190 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
111a0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a , NULL);. }..
111b0 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 /* Peer name
111c0 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f */. LAPPEND_
111d0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
111e0 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 tr, "peername",
111f0 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d SSL_get0_peernam
11200 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
11210 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 , -1);. LAPPE
11220 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
11230 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22 2c 20 bjPtr, "sbits",
11240 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 SSL_get_cipher_b
11250 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 its(statePtr->ss
11260 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 l, NULL));..
11270 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a ciphers = (char*
11280 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 )SSL_get_cipher(
11290 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
112a0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
112b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
112c0 22 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 "cipher", cipher
112d0 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 s, -1);.. /*
112e0 56 65 72 69 66 79 20 74 68 65 20 58 35 30 39 20 Verify the X509
112f0 63 65 72 74 69 66 69 63 61 74 65 20 70 72 65 73 certificate pres
11300 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 65 ented by the pee
11310 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 r */. LAPPEND
11320 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11330 50 74 72 2c 20 22 76 65 72 69 66 79 52 65 73 75 Ptr, "verifyResu
11340 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 lt",..X509_verif
11350 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 y_cert_error_str
11360 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 ing(SSL_get_veri
11370 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 fy_result(stateP
11380 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a tr->ssl)), -1);.
11390 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d . /* Verify m
113a0 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 ode */. mode
113b0 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 = SSL_get_verify
113c0 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e _mode(statePtr->
113d0 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f ssl);. if (mo
113e0 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 de && SSL_VERIFY
113f0 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e _NONE) {..LAPPEN
11400 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11410 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 jPtr, "verifyMod
11420 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b e", "none", -1);
11430 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 . } else {..T
11440 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 cl_Obj *listObjP
11450 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 tr = Tcl_NewList
11460 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 Obj(0, NULL);..i
11470 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 f (mode && SSL_V
11480 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 ERIFY_PEER) {..
11490 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
114a0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
114b0 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 rp, listObjPtr,
114c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
114d0 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 ("peer", -1));..
114e0 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 }..if (mode && S
114f0 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 SL_VERIFY_FAIL_I
11500 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 F_NO_PEER_CERT)
11510 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
11520 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
11530 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 interp, listObjP
11540 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
11550 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f gObj("fail if no
11560 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29 peer cert", -1)
11570 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 );..}..if (mode
11580 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c && SSL_VERIFY_CL
11590 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 IENT_ONCE) {..
115a0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
115b0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
115c0 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 p, listObjPtr, T
115d0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
115e0 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d "client once", -
115f0 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 1));..}..if (mod
11600 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f e && SSL_VERIFY_
11610 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 POST_HANDSHAKE)
11620 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
11630 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
11640 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 interp, listObjP
11650 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
11660 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 gObj("post hands
11670 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a hake", -1));..}.
11680 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 .LAPPEND_OBJ(int
11690 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 erp, objPtr, "ve
116a0 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f rifyMode", listO
116b0 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 bjPtr). }..
116c0 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 /* Verify mode
116d0 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 depth */. LA
116e0 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
116f0 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 , objPtr, "verif
11700 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 yDepth", SSL_get
11710 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 73 74 _verify_depth(st
11720 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a atePtr->ssl));..
11730 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 /* Report th
11740 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
11750 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
11760 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 of the negotiati
11770 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 on */. SSL_ge
11780 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 t0_alpn_selected
11790 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
117a0 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 &proto, &len);.
117b0 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
117c0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
117d0 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 alpn", (char *)p
117e0 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 29 roto, (int) len)
117f0 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 ;. LAPPEND_ST
11800 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11810 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 , "protocol", SS
11820 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 L_get_version(st
11830 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 atePtr->ssl), -1
11840 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 );.. /* Valid
11850 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 for non-RSA sig
11860 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 nature and TLS 1
11870 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 .3 */. if (ob
11880 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 jc == 2) {..res
11890 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 = SSL_get_peer_s
118a0 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 ignature_nid(sta
118b0 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
118c0 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
118d0 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 .res = SSL_get_s
118e0 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 ignature_nid(sta
118f0 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
11900 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 );. }. if
11910 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b (!res) {nid = 0;
11920 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 }. LAPPEND_ST
11930 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11940 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 , "signatureHash
11950 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f Algorithm", OBJ_
11960 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 nid2ln(nid), -1)
11970 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
11980 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 2) {..res = S
11990 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e SL_get_peer_sign
119a0 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 ature_type_nid(s
119b0 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e tatePtr->ssl, &n
119c0 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 id);. } else
119d0 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 {..res = SSL_get
119e0 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f _signature_type_
119f0 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
11a00 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a l, &nid);. }.
11a10 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e if (!res) {n
11a20 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 id = 0;}. LAP
11a30 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11a40 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 objPtr, "signat
11a50 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 ureType", OBJ_ni
11a60 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a d2ln(nid), -1);.
11a70 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
11a80 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
11a90 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
11aa0 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e n TCL_OK;..clien
11ab0 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
11ac0 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ta;.}.../*. *---
11ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b10 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f . *. * Connectio
11b20 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 nInfoObjCmd -- r
11b30 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e eturn connection
11b40 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 info from OpenS
11b50 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 SL.. *. * Result
11b60 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 s:. *.A list of
11b70 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a connection info.
11b80 20 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
11bd0 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 tatic int Connec
11be0 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 tionInfoObjCmd(C
11bf0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
11c00 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
11c10 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
11c20 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
11c30 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
11c40 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
11c50 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
11c60 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
11c70 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 on */. State
11c80 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 *statePtr;../*
11c90 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 client state for
11ca0 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 ssl socket */.
11cb0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
11cc0 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 tr, *listPtr;.
11cd0 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c const SSL *ssl
11ce0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f ;. const SSL_
11cf0 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a CIPHER *cipher;.
11d00 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 const SSL_SE
11d10 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a SSION *session;.
11d20 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 const EVP_MD
11d30 20 2a 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28 6f *md;.. if (o
11d40 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
11d50 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
11d60 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
11d70 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
11d80 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
11d90 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d }.. chan =
11da0 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
11db0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
11dc0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
11dd0 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c v[1], NULL), NUL
11de0 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e L);. if (chan
11df0 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
11e00 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
11e10 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
11e20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
11e30 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
11e40 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
11e50 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
11e60 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
11e70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 Channel(chan);.
11e80 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
11e90 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
11ea0 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
11eb0 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
11ec0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
11ed0 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
11ee0 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
11ef0 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 elName(chan),..
11f00 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c "\": not a TL
11f10 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c S channel", NULL
11f20 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
11f30 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
11f40 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 S", "CONNECTION"
11f50 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e , "CHANNEL", "IN
11f60 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 VALID", (char *)
11f70 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 NULL);..return(
11f80 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
11f90 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 }.. objPtr =
11fa0 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
11fb0 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a , NULL);.. /*
11fc0 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f Connection info
11fd0 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
11fe0 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f = (State *)Tcl_
11ff0 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
12000 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 ceData(chan);.
12010 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 72 ssl = statePtr
12020 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 ->ssl;. if (s
12030 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f sl != NULL) {../
12040 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 * connection sta
12050 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 te */..LAPPEND_S
12060 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12070 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53 4c 5f r, "state", SSL_
12080 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e state_string_lon
12090 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f g(ssl), -1);.../
120a0 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 65 73 * Get SNI reques
120b0 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 ted server name
120c0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
120d0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
120e0 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 "servername", SS
120f0 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 L_get_servername
12100 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d (ssl, TLSEXT_NAM
12110 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 ETYPE_host_name)
12120 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 , -1);.../* Get
12130 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 protocol */..LAP
12140 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
12150 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 objPtr, "protoc
12160 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 ol", SSL_get_ver
12170 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a sion(ssl), -1);.
12180 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 ../* Renegotiati
12190 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c on allowed */..L
121a0 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
121b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e rp, objPtr, "ren
121c0 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 egotiation_allow
121d0 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 ed", SSL_get_sec
121e0 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f ure_renegotiatio
121f0 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 29 3b n_support(ssl));
12200 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 .../* Get securi
12210 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 ty level */..LAP
12220 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
12230 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69 objPtr, "securi
12240 74 79 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 tylevel", SSL_ge
12250 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c t_security_level
12260 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 (ssl));.../* Ses
12270 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 sion info */..LA
12280 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
12290 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 p, objPtr, "sess
122a0 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c ion_reused", SSL
122b0 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 _session_reused(
122c0 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 ssl));.../* Is s
122d0 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c erver info */..L
122e0 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
122f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f rp, objPtr, "is_
12300 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f server", SSL_is_
12310 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 server(ssl));...
12320 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c /* Is DTLS */..L
12330 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
12340 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f rp, objPtr, "is_
12350 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 dtls", SSL_is_dt
12360 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a ls(ssl));. }.
12370 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 . /* Cipher i
12380 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 nfo */. ciphe
12390 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 r = SSL_get_curr
123a0 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b ent_cipher(ssl);
123b0 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20 . if (cipher
123c0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 != NULL) {..char
123d0 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b buf[BUFSIZ] = {
123e0 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 0};..int bits, a
123f0 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 lg_bits;.../* Ci
12400 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 pher name */..LA
12410 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12420 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 , objPtr, "ciphe
12430 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 r", SSL_CIPHER_g
12440 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c et_name(cipher),
12450 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e -1);.../* RFC n
12460 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f ame of cipher */
12470 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
12480 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
12490 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 tandard_name", S
124a0 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 SL_CIPHER_standa
124b0 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c rd_name(cipher),
124c0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 -1);.../* OpenS
124d0 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 SL name of ciphe
124e0 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 r */..LAPPEND_ST
124f0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
12500 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 , "openssl_name"
12510 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 , OPENSSL_cipher
12520 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 _name(SSL_CIPHER
12530 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 _standard_name(c
12540 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 ipher)), -1);...
12550 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 /* number of sec
12560 72 65 74 20 62 69 74 73 20 75 73 65 64 20 66 6f ret bits used fo
12570 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 r cipher */..bit
12580 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 s = SSL_CIPHER_g
12590 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 et_bits(cipher,
125a0 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 &alg_bits);..LAP
125b0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
125c0 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74 objPtr, "secret
125d0 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 _bits", bits);..
125e0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
125f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 rp, objPtr, "alg
12600 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c orithm_bits", al
12610 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 g_bits);../* alg
12620 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 _bits is actual
12630 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e key secret bits.
12640 20 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 If use bits and
12650 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 secret (algorit
12660 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c hm) bits differ,
12670 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 .. the rest of
12680 20 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69 the bits are fi
12690 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 xed, i.e. for li
126a0 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 mited export cip
126b0 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 hers (bits < 56)
126c0 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 */.../* Indicat
126d0 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 es which SSL/TLS
126e0 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f protocol versio
126f0 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 n first defined
12700 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c the cipher */..L
12710 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
12720 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f p, objPtr, "min_
12730 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 version", SSL_CI
12740 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e PHER_get_version
12750 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a (cipher), -1);..
12760 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a ./* Cipher NID *
12770 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
12780 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12790 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61 cipherNID", (cha
127a0 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 r *)OBJ_nid2ln(S
127b0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69 SL_CIPHER_get_ci
127c0 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29 pher_nid(cipher)
127d0 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ), -1);..LAPPEND
127e0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
127f0 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22 Ptr, "digestNID"
12800 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 , (char *)OBJ_ni
12810 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f d2ln(SSL_CIPHER_
12820 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 get_digest_nid(c
12830 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c ipher)), -1);..L
12840 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
12850 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 p, objPtr, "keyE
12860 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 xchangeNID", (ch
12870 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 ar *)OBJ_nid2ln(
12880 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b SSL_CIPHER_get_k
12890 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 x_nid(cipher)),
128a0 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 -1);..LAPPEND_ST
128b0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
128c0 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f , "authenticatio
128d0 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f nNID", (char *)O
128e0 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
128f0 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 PHER_get_auth_ni
12900 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b d(cipher)), -1);
12910 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 .../* message au
12920 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 thentication cod
12930 65 20 2d 20 43 69 70 68 65 72 20 69 73 20 41 45 e - Cipher is AE
12940 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 AD (e.g. GCM or
12950 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 ChaCha20/Poly130
12960 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 5) or not */../*
12970 20 41 75 74 68 65 6e 74 69 63 61 74 65 64 20 45 Authenticated E
12980 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61 ncryption with a
12990 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 20 28 ssociated data (
129a0 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 AEAD) check */..
129b0 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
129c0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 erp, objPtr, "ci
129d0 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 pher_is_aead", S
129e0 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61 SL_CIPHER_is_aea
129f0 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a d(cipher));.../*
12a00 20 44 69 67 65 73 74 20 75 73 65 64 20 64 75 72 Digest used dur
12a10 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 ing the SSL/TLS
12a20 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 handshake when u
12a30 73 69 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e sing the cipher.
12a40 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 */..md = SSL_CI
12a50 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 PHER_get_handsha
12a60 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 ke_digest(cipher
12a70 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
12a80 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12a90 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 "handshake_diges
12aa0 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f t", (char *)EVP_
12ab0 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 MD_name(md), -1)
12ac0 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 ;.../* Get OpenS
12ad0 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 SL-specific ID,
12ae0 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 not IANA ID */..
12af0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
12b00 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
12b10 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 her_id", (int) S
12b20 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 SL_CIPHER_get_id
12b30 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 (cipher));.../*
12b40 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64 Two-byte ID used
12b50 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74 in the TLS prot
12b60 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65 ocol of the give
12b70 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 n cipher */..LAP
12b80 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
12b90 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 objPtr, "protoc
12ba0 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 ol_id", (int) SS
12bb0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f L_CIPHER_get_pro
12bc0 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 tocol_id(cipher)
12bd0 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 );.../* Textual
12be0 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 description of t
12bf0 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 he cipher */..if
12c00 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 (SSL_CIPHER_des
12c10 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c cription(cipher,
12c20 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 buf, sizeof(buf
12c30 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 )) != NULL) {..
12c40 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
12c50 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12c60 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 description", bu
12c70 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d f, -1);..}. }
12c80 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e .. /* Session
12c90 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 info */. ses
12ca0 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 sion = SSL_get_s
12cb0 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 ession(ssl);.
12cc0 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 if (session !=
12cd0 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 NULL) {..const u
12ce0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 nsigned char *ti
12cf0 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 cket;..size_t le
12d00 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e n2;..unsigned in
12d10 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 t ulen;..const u
12d20 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 nsigned char *se
12d30 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f ssion_id, *proto
12d40 3b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 53 ;..char buffer[S
12d50 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 SL_MAX_MASTER_KE
12d60 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 Y_LENGTH];.../*
12d70 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 Report the selec
12d80 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 ted protocol as
12d90 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 a result of the
12da0 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e ALPN negotiation
12db0 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e */..SSL_SESSION
12dc0 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 _get0_alpn_selec
12dd0 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 ted(session, &pr
12de0 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 oto, &len2);..LA
12df0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12e00 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 , objPtr, "alpn"
12e10 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f , (char *) proto
12e20 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a , (int) len2);..
12e30 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 ./* Report the s
12e40 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
12e50 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 as a result of
12e60 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 the NPN negotiat
12e70 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 ion */.#ifdef US
12e80 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f E_NPN..SSL_get0_
12e90 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 next_proto_negot
12ea0 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 iated(ssl, &prot
12eb0 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 o, &ulen);..LAPP
12ec0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
12ed0 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 objPtr, "npn", (
12ee0 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 char *) proto, (
12ef0 69 6e 74 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 int) ulen);.#end
12f00 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c if.../* Resumabl
12f10 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 e session */..LA
12f20 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
12f30 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 p, objPtr, "resu
12f40 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 mable", SSL_SESS
12f50 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 ION_is_resumable
12f60 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a (session));.../*
12f70 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 Session start t
12f80 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e ime (seconds sin
12f90 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 ce epoch) */..LA
12fa0 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 PPEND_LONG(inter
12fb0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 p, objPtr, "star
12fc0 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 t_time", SSL_SES
12fd0 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 SION_get_time(se
12fe0 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 ssion));.../* Ti
12ff0 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 meout value - SS
13000 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 L_CTX_get_timeou
13010 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a t (in seconds) *
13020 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 /..LAPPEND_LONG(
13030 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
13040 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 "timeout", SSL_S
13050 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f ESSION_get_timeo
13060 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 ut(session));...
13070 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 /* Session id -
13080 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f TLSv1.2 and belo
13090 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 w only */..sessi
130a0 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 on_id = SSL_SESS
130b0 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 ION_get_id(sessi
130c0 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 on, &ulen);..LAP
130d0 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 PEND_BARRAY(inte
130e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 rp, objPtr, "ses
130f0 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f sion_id", sessio
13100 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e n_id, (int) ulen
13110 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
13120 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 context */..sess
13130 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 ion_id = SSL_SES
13140 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e SION_get0_id_con
13150 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 text(session, &u
13160 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 len);..LAPPEND_B
13170 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 ARRAY(interp, ob
13180 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 jPtr, "session_c
13190 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69 6f 6e ontext", session
131a0 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 _id, (int) ulen)
131b0 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 ;.../* Session t
131c0 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f icket - client o
131d0 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 nly */..SSL_SESS
131e0 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 ION_get0_ticket(
131f0 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 session, &ticket
13200 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 , &len2);..LAPPE
13210 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 ND_BARRAY(interp
13220 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 , objPtr, "sessi
13230 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 6b on_ticket", tick
13240 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 3b et, (int) len2);
13250 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 .../* Session ti
13260 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69 cket lifetime hi
13270 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 nt (in seconds)
13280 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 */..LAPPEND_LONG
13290 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
132a0 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 4c "lifetime", SSL
132b0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 _SESSION_get_tic
132c0 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e ket_lifetime_hin
132d0 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f t(session));.../
132e0 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74 * Ticket app dat
132f0 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f a */..SSL_SESSIO
13300 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 N_get0_ticket_ap
13310 70 64 61 74 61 28 73 65 73 73 69 6f 6e 2c 20 26 pdata(session, &
13320 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a ticket, &len2);.
13330 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
13340 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
13350 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 "ticket_app_data
13360 22 2c 20 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 ", ticket, (int)
13370 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 47 65 74 len2);.../* Get
13380 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 master key */..
13390 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 len2 = SSL_SESSI
133a0 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 ON_get_master_ke
133b0 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 y(session, buffe
133c0 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 r, SSL_MAX_MASTE
133d0 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 R_KEY_LENGTH);..
133e0 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 LAPPEND_BARRAY(i
133f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
13400 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 66 master_key", buf
13410 66 65 72 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 fer, (int) len2)
13420 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 ;.../* Compressi
13430 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e on id */..unsign
13440 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f ed int id = SSL_
13450 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 SESSION_get_comp
13460 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 ress_id(session)
13470 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
13480 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
13490 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c compression_id",
134a0 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 id == 1 ? "zlib
134b0 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b " : "none", -1);
134c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
134d0 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 ompression info
134e0 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 */. if (ssl !
134f0 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 = NULL) {.#ifdef
13500 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 HAVE_SSL_COMPRE
13510 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d SSION..const COM
13520 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 P_METHOD *comp,
13530 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 *expn;..comp = S
13540 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 SL_get_current_c
13550 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b ompression(ssl);
13560 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 ..expn = SSL_get
13570 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 _current_expansi
13580 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 on(ssl);...LAPPE
13590 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
135a0 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 bjPtr, "compress
135b0 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c ion", comp ? SSL
135c0 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 _COMP_get_name(c
135d0 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d omp) : "none", -
135e0 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 1);..LAPPEND_STR
135f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
13600 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 "expansion", ex
13610 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 pn ? SSL_COMP_ge
13620 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 t_name(expn) : "
13630 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 none", -1);.#els
13640 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 e..LAPPEND_STR(i
13650 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
13660 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e compression", "n
13670 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 one", -1);..LAPP
13680 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
13690 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 objPtr, "expansi
136a0 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 on", "none", -1)
136b0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a ;.#endif. }..
136c0 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e /* Server in
136d0 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e fo */. {..lon
136e0 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 g mode = SSL_CTX
136f0 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 _get_session_cac
13700 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 he_mode(statePtr
13710 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d ->ctx);..char *m
13720 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 sg;...if (mode &
13730 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
13740 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 OFF) {.. msg
13750 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 = "off";..} else
13760 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f if (mode & SSL_
13770 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e SESS_CACHE_CLIEN
13780 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 T) {.. msg =
13790 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 "client";..} els
137a0 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c e if (mode & SSL
137b0 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 _SESS_CACHE_SERV
137c0 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d ER) {.. msg =
137d0 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c "server";..} el
137e0 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 se if (mode & SS
137f0 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 L_SESS_CACHE_BOT
13800 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 H) {.. msg =
13810 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 "both";..} else
13820 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e {.. msg = "un
13830 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 known";..}..LAPP
13840 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
13850 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e objPtr, "session
13860 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 _cache_mode", ms
13870 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 g, -1);. }..
13880 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f /* CA List */
13890 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 . /* IF not a
138a0 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73 server, same as
138b0 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 SSL_get0_peer_C
138c0 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65 A_list. If serve
138d0 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 r same as SSL_CT
138e0 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f X_get_client_CA_
138f0 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 list */. list
13900 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
13910 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 tObj(0, NULL);.
13920 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 STACK_OF(X509
13930 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b _NAME) *ca_list;
13940 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73 . if ((ca_lis
13950 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 t = SSL_get_clie
13960 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 nt_CA_list(ssl))
13970 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 != NULL) {..cha
13980 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d r buffer[BUFSIZ]
13990 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 ;..for (int i =
139a0 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 0; i < sk_X509_N
139b0 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 AME_num(ca_list)
139c0 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 ; i++) {.. X5
139d0 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 09_NAME *name =
139e0 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c sk_X509_NAME_val
139f0 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a ue(ca_list, i);.
13a00 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b . if (name) {
13a10 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 ...X509_NAME_one
13a20 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 line(name, buffe
13a30 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 r, BUFSIZ);...Tc
13a40 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
13a50 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
13a60 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 istPtr, Tcl_NewS
13a70 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c tringObj(buffer,
13a80 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d -1));.. }..}
13a90 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 . }. LAPPE
13aa0 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f ND_OBJ(interp, o
13ab0 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c bjPtr, "caList",
13ac0 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c listPtr);. L
13ad0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
13ae0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 p, objPtr, "caLi
13af0 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 stCount", sk_X50
13b00 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 9_NAME_num(ca_li
13b10 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 st));.. Tcl_S
13b20 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
13b30 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
13b40 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
13b50 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
13b60 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
13b70 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
13b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13bb0 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 ------. *. * Mis
13bc0 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 cObjCmd -- misc
13bd0 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 commands. *. * R
13be0 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
13bf0 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
13c00 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
13c10 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
13c20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c60 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
13c70 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d ic int.MiscObjCm
13c80 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
13c90 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
13ca0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
13cb0 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
13cc0 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
13cd0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 static const
13ce0 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 char *commands
13cf0 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 [] = { "req", "s
13d00 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a trreq", NULL };.
13d10 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 enum command
13d20 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 { C_REQ, C_STRR
13d30 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 EQ, C_DUMMY };.
13d40 20 20 20 69 6e 74 20 63 6d 64 2c 20 69 73 53 74 int cmd, isSt
13d50 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 r;. char buff
13d60 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20 er[16384];..
13d70 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
13d80 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
13d90 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f < 2) {..Tcl_Wro
13da0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
13db0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 , 1, objv, "subc
13dc0 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b ommand ?args?");
13dd0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
13de0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
13df0 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 (Tcl_GetIndexFr
13e00 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
13e10 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c jv[1], commands,
13e20 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 "command", 0, &
13e30 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 cmd) != TCL_OK)
13e40 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
13e50 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
13e60 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
13e70 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20 );.. isStr =
13e80 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 (cmd == C_STRREQ
13e90 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 );. switch ((
13ea0 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d enum command) cm
13eb0 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 d) {..case C_REQ
13ec0 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51 :..case C_STRREQ
13ed0 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 : {.. EVP_PKE
13ee0 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 Y *pkey=NULL;..
13ef0 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 X509 *cert=NU
13f00 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 LL;.. X509_NA
13f10 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 ME *name=NULL;..
13f20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 Tcl_Obj **li
13f30 73 74 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69 stv;.. int li
13f40 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f stc,i;... BIO
13f50 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 *out=NULL;...
13f60 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a char *k_C="",*
13f70 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c k_ST="",*k_L="",
13f80 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 *k_O="",*k_OU=""
13f90 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 ,*k_CN="",*k_Ema
13fa0 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 il="";.. char
13fb0 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 *keyout,*pemout
13fc0 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 ,*str;.. int
13fd0 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 keysize,serial=0
13fe0 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 ,days=365;..#if
13ff0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
14000 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
14010 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 000L.. BIGNUM
14020 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 *bne = NULL;..
14030 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 RSA *rsa = NU
14040 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 LL;.#else.. E
14050 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 VP_PKEY_CTX *ctx
14060 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a = NULL;.#endif.
14070 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c .. if ((objc<
14080 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 5) || (objc>6))
14090 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {...Tcl_WrongNum
140a0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 Args(interp, 2,
140b0 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b objv, "keysize k
140c0 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 eyfile certfile
140d0 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 ?info?");...retu
140e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
140f0 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 }... if (T
14100 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
14110 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d (interp, objv[2]
14120 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 , &keysize) != T
14130 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 CL_OK) {...retur
14140 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
14150 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d }.. keyout=
14160 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
14170 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d jv[3]);.. pem
14180 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e out=Tcl_GetStrin
14190 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 g(objv[4]);..
141a0 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 if (isStr) {...
141b0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 Tcl_SetVar(inter
141c0 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a p,keyout,"",0);.
141d0 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 ..Tcl_SetVar(int
141e0 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 erp,pemout,"",0)
141f0 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 ;.. }... i
14200 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 f (objc>=6) {...
14210 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 if (Tcl_ListObjG
14220 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 etElements(inter
14230 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 p, objv[5],....&
14240 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 listc, &listv) !
14250 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 = TCL_OK) {...
14260 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
14270 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 OR;...}....if ((
14280 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b listc%2) != 0) {
14290 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 ... Tcl_SetRe
142a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 sult(interp,"Inf
142b0 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 ormation list mu
142c0 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d st have even num
142d0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
142e0 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 ",NULL);... r
142f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
14300 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b ...}...for (i=0;
14310 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 i<listc; i+=2)
14320 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f {... str=Tcl_
14330 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
14340 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 i]);... if (s
14350 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 trcmp(str,"days"
14360 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 )==0) {....if (T
14370 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
14380 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b (interp,listv[i+
14390 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 1],&days)!=TCL_O
143a0 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e K).... return
143b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 TCL_ERROR;...
143c0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
143d0 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 cmp(str,"serial"
143e0 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 )==0) {....if (T
143f0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
14400 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b (interp,listv[i+
14410 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 1],&serial)!=TCL
14420 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 _OK).... retu
14430 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
14440 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
14450 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d trcmp(str,"C")==
14460 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 0) {....k_C=Tcl_
14470 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
14480 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
14490 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
144a0 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 tr,"ST")==0) {..
144b0 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 ..k_ST=Tcl_GetSt
144c0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
144d0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
144e0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c f (strcmp(str,"L
144f0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d ")==0) {....k_L=
14500 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
14510 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
14520 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
14530 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 mp(str,"O")==0)
14540 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 {....k_O=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 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b "OU")==0) {....k
14590 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e _OU=Tcl_GetStrin
145a0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
145b0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
145c0 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 strcmp(str,"CN")
145d0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 ==0) {....k_CN=T
145e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
145f0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
14600 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
14610 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d p(str,"Email")==
14620 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 0) {....k_Email=
14630 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
14640 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
14650 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c } else {....Tcl
14660 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
14670 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d p,"Unknown param
14680 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 eter",NULL);....
14690 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
146a0 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 ;... }...}..
146b0 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 }..#if OPENSS
146c0 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
146d0 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
146e0 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 bne = BN_new
146f0 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 ();.. rsa = R
14700 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 SA_new();.. p
14710 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e key = EVP_PKEY_n
14720 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 ew();.. if (b
14730 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 ne == NULL || rs
14740 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 a == NULL || pke
14750 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e y == NULL || !BN
14760 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 _set_word(bne,RS
14770 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f A_F4) ||...!RSA_
14780 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 generate_key_ex(
14790 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e rsa, keysize, bn
147a0 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 e, NULL) || !EVP
147b0 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 _PKEY_assign_RSA
147c0 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 (pkey, rsa)) {..
147d0 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 .EVP_PKEY_free(p
147e0 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 key);.../* RSA_f
147f0 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 ree(rsa); freed
14800 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 by EVP_PKEY_free
14810 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e */...BN_free(bn
14820 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 e);.#else.. p
14830 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 key = EVP_RSA_ge
14840 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 n((unsigned int)
14850 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 keysize);..
14860 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 ctx = EVP_PKEY_C
14870 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c TX_new(pkey,NULL
14880 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 );.. if (pkey
14890 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 == NULL || ctx
148a0 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f == NULL || !EVP_
148b0 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 PKEY_keygen_init
148c0 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f (ctx) ||...!EVP_
148d0 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 PKEY_CTX_set_rsa
148e0 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 _keygen_bits(ctx
148f0 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 , keysize) || !E
14900 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 VP_PKEY_keygen(c
14910 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 tx, &pkey)) {...
14920 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
14930 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f ey);...EVP_PKEY_
14940 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 CTX_free(ctx);.#
14950 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 endif...Tcl_SetR
14960 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 esult(interp,"Er
14970 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 ror generating p
14980 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c rivate key",NULL
14990 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
149a0 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c ERROR;.. } el
149b0 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 se {...if (isStr
149c0 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 ) {... out=BI
149d0 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 O_new(BIO_s_mem(
149e0 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 ));... PEM_wr
149f0 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b ite_bio_PrivateK
14a00 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c ey(out,pkey,NULL
14a10 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c ,NULL,0,NULL,NUL
14a20 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f L);... i=BIO_
14a30 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c read(out,buffer,
14a40 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 sizeof(buffer)-1
14a50 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 );... i=(i<0)
14a60 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 ? 0 : i;...
14a70 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a buffer[i]='\0';.
14a80 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 .. Tcl_SetVar
14a90 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 (interp,keyout,b
14aa0 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 uffer,0);...
14ab0 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a BIO_flush(out);.
14ac0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f .. BIO_free(o
14ad0 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a ut);...} else {.
14ae0 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 .. out=BIO_ne
14af0 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b w(BIO_s_file());
14b00 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 ... BIO_write
14b10 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 _filename(out,ke
14b20 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d yout);... PEM
14b30 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 _write_bio_Priva
14b40 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e teKey(out,pkey,N
14b50 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c ULL,NULL,0,NULL,
14b60 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 NULL);... /*
14b70 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 PEM_write_bio_RS
14b80 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c APrivateKey(out,
14b90 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c rsa, NULL, NULL
14ba0 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 , 0, NULL, NULL)
14bb0 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 ; */... BIO_f
14bc0 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 ree_all(out);..
14bd0 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d .}....if ((cert=
14be0 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c X509_new())==NUL
14bf0 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 L) {... Tcl_S
14c00 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
14c10 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e "Error generatin
14c20 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65 g certificate re
14c30 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 quest",NULL);...
14c40 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 EVP_PKEY_fre
14c50 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 e(pkey);.#if OPE
14c60 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
14c70 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
14c80 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 L... BN_free(
14c90 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 bne);.#endif...
14ca0 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 return(TCL_ER
14cb0 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 ROR);...}....X50
14cc0 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 9_set_version(ce
14cd0 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e rt,2);...ASN1_IN
14ce0 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 TEGER_set(X509_g
14cf0 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 et_serialNumber(
14d00 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 cert),serial);..
14d10 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a .X509_gmtime_adj
14d20 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 (X509_getm_notBe
14d30 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 fore(cert),0);..
14d40 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a .X509_gmtime_adj
14d50 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 (X509_getm_notAf
14d60 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 ter(cert),(long)
14d70 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 60*60*24*days);.
14d80 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 ..X509_set_pubke
14d90 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 y(cert,pkey);...
14da0 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 .name=X509_get_s
14db0 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 ubject_name(cert
14dc0 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f );....X509_NAME_
14dd0 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
14de0 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 (name,"C", MBSTR
14df0 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
14e00 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
14e10 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_C, -1, -1, 0)
14e20 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
14e30 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
14e40 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 ame,"ST", MBSTRI
14e50 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
14e60 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
14e70 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_ST, -1, -1, 0)
14e80 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
14e90 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
14ea0 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e ame,"L", MBSTRIN
14eb0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
14ec0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
14ed0 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a _L, -1, -1, 0);.
14ee0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
14ef0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
14f00 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f e,"O", MBSTRING_
14f10 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
14f20 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f gned char *) k_O
14f30 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
14f40 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
14f50 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
14f60 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 "OU", MBSTRING_A
14f70 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
14f80 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 ned char *) k_OU
14f90 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
14fa0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
14fb0 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
14fc0 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 "CN", MBSTRING_A
14fd0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
14fe0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e ned char *) k_CN
14ff0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
15000 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
15010 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
15020 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e "Email", MBSTRIN
15030 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
15040 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
15050 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 _Email, -1, -1,
15060 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 0);....X509_set_
15070 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 subject_name(cer
15080 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 t,name);....if (
15090 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c !X509_sign(cert,
150a0 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 pkey,EVP_sha256(
150b0 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 ))) {... X509
150c0 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 _free(cert);...
150d0 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 EVP_PKEY_free
150e0 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e (pkey);.#if OPEN
150f0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
15100 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
15110 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 ... BN_free(b
15120 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 ne);.#endif...
15130 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 Tcl_SetResult(
15140 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 interp,"Error si
15150 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 gning certificat
15160 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 e",NULL);...
15170 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
15180 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 ;...}....if (isS
15190 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d tr) {... out=
151a0 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 BIO_new(BIO_s_me
151b0 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f m());... PEM_
151c0 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f write_bio_X509(o
151d0 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 ut,cert);...
151e0 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 i=BIO_read(out,b
151f0 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 uffer,sizeof(buf
15200 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 fer)-1);... i
15210 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a =(i<0) ? 0 : i;.
15220 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d .. buffer[i]=
15230 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f '\0';... Tcl_
15240 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 SetVar(interp,pe
15250 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a mout,buffer,0);.
15260 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 .. BIO_flush(
15270 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f out);... BIO_
15280 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 free(out);...} e
15290 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d lse {... out=
152a0 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 BIO_new(BIO_s_fi
152b0 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f le());... BIO
152c0 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 _write_filename(
152d0 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 out,pemout);...
152e0 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
152f0 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b _X509(out,cert);
15300 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f ... BIO_free_
15310 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 all(out);...}...
15320 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 .X509_free(cert)
15330 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 ;...EVP_PKEY_fre
15340 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 e(pkey);.#if OPE
15350 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
15360 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
15370 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 L...BN_free(bne)
15380 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a ;.#endif.. }.
15390 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 .}..break;. d
153a0 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a efault:..break;.
153b0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
153c0 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
153d0 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
153e0 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a a;.}.../********
153f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a ************/./*
15400 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 Init
15410 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./**********
15420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a **********/../*.
15430 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
15440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15470 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
15480 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Free --. *. *.Th
15490 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 is procedure cle
154a0 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 ans up when a SS
154b0 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 L socket based c
154c0 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f hannel. *.is clo
154d0 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 sed and its refe
154e0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c rence count fall
154f0 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 s below 1. *. *
15500 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 Results:. *.none
15510 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
15520 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c cts:. *.Frees al
15530 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 l the state. *.
15540 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
15550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15580 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c ----. */.void.Tl
15590 73 5f 46 72 65 65 28 63 68 61 72 20 2a 62 6c 6f s_Free(char *blo
155a0 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 ckPtr) {. Sta
155b0 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
155c0 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 State *)blockPtr
155d0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
155e0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 Called");.. T
155f0 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 ls_Clean(statePt
15600 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 r);. ckfree(b
15610 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a lockPtr);.}.../*
15620 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
15630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15660 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
15670 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 _Clean --. *. *.
15680 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 This procedure c
15690 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 leans up when a
156a0 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 SSL socket based
156b0 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 channel. *.is c
156c0 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 losed and its re
156d0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 ference count fa
156e0 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 lls below 1. Th
156f0 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 is should. *.be
15700 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f called synchrono
15710 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 usly by the Clos
15720 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 eProc, not in th
15730 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 e. *.EventuallyF
15740 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a ree callback.. *
15750 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
15760 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 none. *. * Side
15770 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 effects:. *.Free
15780 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a s all the state.
15790 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
157a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157d0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 --------. */.voi
157e0 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 d Tls_Clean(Stat
157f0 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 e *statePtr) {.
15800 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
15810 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 ed");.. /*.
15820 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d * we're assum
15830 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65 ing here that we
15840 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 're single-threa
15850 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 ded. */.
15860 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 if (statePtr->ti
15870 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 mer != (Tcl_Time
15880 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a rToken) NULL) {.
15890 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 .Tcl_DeleteTimer
158a0 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 Handler(statePtr
158b0 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 ->timer);..state
158c0 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c Ptr->timer = NUL
158d0 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 L;. }.. if
158e0 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 (statePtr->prot
158f0 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 os) {..ckfree(st
15900 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b atePtr->protos);
15910 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
15920 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d os = NULL;. }
15930 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
15940 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 r->bio) {../* Th
15950 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c is will call SSL
15960 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 _shutdown. Bug 1
15970 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 414045 */..dprin
15980 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c tf("BIO_free_all
15990 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d (%p)", statePtr-
159a0 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 >bio);..BIO_free
159b0 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 _all(statePtr->b
159c0 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e io);..statePtr->
159d0 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 bio = NULL;.
159e0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
159f0 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 tr->ssl) {..dpri
15a00 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 ntf("SSL_free(%p
15a10 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 )", statePtr->ss
15a20 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 l);..SSL_free(st
15a30 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 atePtr->ssl);..s
15a40 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e tatePtr->ssl = N
15a50 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
15a60 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 f (statePtr->ctx
15a70 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 ) {..SSL_CTX_fre
15a80 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 e(statePtr->ctx)
15a90 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ;..statePtr->ctx
15aa0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
15ab0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
15ac0 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 >callback) {..Tc
15ad0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
15ae0 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
15af0 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 k);..statePtr->c
15b00 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a allback = NULL;.
15b10 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
15b20 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
15b30 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 ) {..Tcl_DecrRef
15b40 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
15b50 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 password);..stat
15b60 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d ePtr->password =
15b70 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
15b80 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
15b90 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 cmd) {..Tcl_Decr
15ba0 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
15bb0 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 r->vcmd);..state
15bc0 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c Ptr->vcmd = NULL
15bd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
15be0 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 intf("Returning"
15bf0 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
15c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
15c40 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d *. * Tls_Init -
15c50 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 -. *. *.This is
15c60 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 a package initia
15c70 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 lization procedu
15c80 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c re, which is cal
15c90 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 led. *.by Tcl wh
15ca0 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 en this package
15cb0 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 is to be added t
15cc0 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 o an interpreter
15cd0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
15ce0 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 Ssl configured
15cf0 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 and loaded. *.
15d00 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
15d10 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73 *. create the s
15d20 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 sl command, init
15d30 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 ialize ssl conte
15d40 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d xt. *. *--------
15d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
15d90 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c DLLEXPORT int Tl
15da0 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 s_Init(Tcl_Inter
15db0 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 p *interp) {.
15dc0 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 const char tlsT
15dd0 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d clInitScript[] =
15de0 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 {.#include "tls
15df0 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 .tcl.h"..0x00.
15e00 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 };.. dprint
15e10 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 f("Called");..#i
15e20 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 f TCL_MAJOR_VERS
15e30 49 4f 4e 20 3e 20 38 0a 23 69 66 64 65 66 20 55 ION > 8.#ifdef U
15e40 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 SE_TCL_STUBS.
15e50 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 if (Tcl_InitStu
15e60 62 73 28 69 6e 74 65 72 70 2c 20 22 39 2e 30 22 bs(interp, "9.0"
15e70 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a , 0) == NULL) {.
15e80 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
15e90 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a R;. }.#endif.
15ea0 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 if (Tcl_PkgR
15eb0 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 equire(interp, "
15ec0 54 63 6c 22 2c 20 22 39 2e 30 2d 22 2c 20 30 29 Tcl", "9.0-", 0)
15ed0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
15ee0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
15ef0 20 20 20 7d 0a 23 65 6c 73 65 0a 23 69 66 64 65 }.#else.#ifde
15f00 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a f USE_TCL_STUBS.
15f10 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 if (Tcl_Init
15f20 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 Stubs(interp, "8
15f30 2e 35 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 .5", 0) == NULL)
15f40 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
15f50 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 RROR;. }.#end
15f60 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50 if. if (Tcl_P
15f70 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 kgRequire(interp
15f80 2c 20 22 54 63 6c 22 2c 20 22 38 2e 35 2d 22 2c , "Tcl", "8.5-",
15f90 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 0) == NULL) {..
15fa0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
15fb0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a ;. }.#endif..
15fc0 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e if (TlsLibIn
15fd0 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 it(0) != TCL_OK)
15fe0 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
15ff0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f sult(interp, "co
16000 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 uld not initiali
16010 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c ze SSL library",
16020 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
16030 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
16040 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 .. Tcl_Create
16050 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
16060 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 p, "tls::connect
16070 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e ion", Connection
16080 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 InfoObjCmd, (Cli
16090 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
160a0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
160b0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
160c0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
160d0 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
160e0 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 handshake", Hand
160f0 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c shakeObjCmd, (Cl
16100 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
16110 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
16120 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
16130 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
16140 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
16150 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 :import", Import
16160 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
16170 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
16180 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
16190 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
161a0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
161b0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 terp, "tls::misc
161c0 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 ", MiscObjCmd, (
161d0 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
161e0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
161f0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
16200 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
16210 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
16220 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e s::unimport", Un
16230 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 importObjCmd, (C
16240 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
16250 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
16260 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
16270 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
16280 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
16290 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 ::status", Statu
162a0 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 sObjCmd, (Client
162b0 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
162c0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
162d0 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 ULL);.. Tcl_C
162e0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
162f0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 interp, "tls::ci
16300 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f phers", CiphersO
16310 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
16320 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
16330 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
16340 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
16350 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
16360 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f erp, "tls::proto
16370 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 cols", Protocols
16380 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
16390 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
163a0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
163b0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
163c0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
163d0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 terp, "tls::vers
163e0 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a ion", VersionObj
163f0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
16400 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
16410 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
16420 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 ;.. Tcl_Creat
16430 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
16440 72 70 2c 20 22 74 6c 73 3a 3a 64 69 67 65 73 74 rp, "tls::digest
16450 22 2c 20 44 69 67 65 73 74 43 6d 64 2c 20 28 43 ", DigestCmd, (C
16460 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
16470 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
16480 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
16490 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
164a0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
164b0 3a 3a 64 69 67 65 73 74 73 22 2c 20 44 69 67 65 ::digests", Dige
164c0 73 74 4c 69 73 74 43 6d 64 2c 20 28 43 6c 69 65 stListCmd, (Clie
164d0 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
164e0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
164f0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
16500 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
16510 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d (interp, "tls::m
16520 64 34 22 2c 20 44 69 67 65 73 74 4d 44 34 43 6d d4", DigestMD4Cm
16530 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
16540 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
16550 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
16560 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
16570 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
16580 20 22 74 6c 73 3a 3a 6d 64 35 22 2c 20 44 69 67 "tls::md5", Dig
16590 65 73 74 4d 44 35 43 6d 64 2c 20 28 43 6c 69 65 estMD5Cmd, (Clie
165a0 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
165b0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
165c0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
165d0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
165e0 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 (interp, "tls::s
165f0 68 61 31 22 2c 20 44 69 67 65 73 74 53 48 41 31 ha1", DigestSHA1
16600 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
16610 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
16620 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
16630 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
16640 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
16650 70 2c 20 22 74 6c 73 3a 3a 73 68 61 32 35 36 22 p, "tls::sha256"
16660 2c 20 44 69 67 65 73 74 53 48 41 32 35 36 43 6d , DigestSHA256Cm
16670 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
16680 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
16690 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
166a0 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 29 . if (interp)
166b0 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74 {..Tcl_Eval(int
166c0 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 erp, tlsTclInitS
166d0 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 cript);. }..
166e0 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b return Tcl_Pk
166f0 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c gProvide(interp,
16700 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 PACKAGE_NAME, P
16710 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b ACKAGE_VERSION);
16720 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
16730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
16760 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 . *. *.Tls_SafeI
16770 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d nit --. *. *.---
16780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
167a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
167b0 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 *.Standard proce
167c0 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79 dure required by
167d0 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 'load'.. *.Init
167e0 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 ializes this ext
167f0 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 ension for a saf
16800 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 e interpreter..
16810 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
16820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16840 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 --*. *. *.Side e
16850 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f ffects:. *..As o
16860 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a f 'Tls_Init'. *.
16870 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 *.Result:. *..A
16880 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 standard Tcl er
16890 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d ror code.. *. *-
168a0 2d 2d 2d 2d 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 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 -----*. */.DLLEX
168e0 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 PORT int Tls_Saf
168f0 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 eInit(Tcl_Interp
16900 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
16910 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
16920 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 6c );. return(Tl
16930 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29 3b s_Init(interp));
16940 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
16980 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 . *. *.TlsLibIni
16990 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d t --. *. *.-----
169a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
169b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
169c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 -----------*. *.
169d0 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 Initializes SSL
169e0 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 library once per
169f0 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 application. *.
16a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a30 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 *. *. *.Side eff
16a40 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 ects:. *..initia
16a50 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 lizes SSL librar
16a60 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a y. *. *.Result:.
16a70 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d *..none. *. *--
16a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a90 2d 2d 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 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 ----*. */.static
16ac0 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 int TlsLibInit(
16ad0 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 int uninitialize
16ae0 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 ) {. static i
16af0 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d nt initialized =
16b00 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 0;. int stat
16b10 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 us = TCL_OK;.#if
16b20 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
16b30 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
16b40 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
16b50 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d ). size_t num
16b60 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a _locks;.#endif..
16b70 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 if (uninitia
16b80 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e lize) {..if (!in
16b90 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 itialized) {..
16ba0 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 dprintf("Asked
16bb0 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 to uninitialize
16bc0 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 , but we are not
16bd0 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a initialized");.
16be0 0a 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c .. return(TCL
16bf0 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e _OK);..}...dprin
16c00 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 tf("Asked to uni
16c10 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 nitialize");..#i
16c20 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
16c30 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
16c40 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
16c50 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 S)..Tcl_MutexLoc
16c60 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 k(&init_mx);...i
16c70 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 f (locks) {..
16c80 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 free(locks);..
16c90 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b locks = NULL;
16ca0 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 .. locksCount
16cb0 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a = 0;..}.#endif.
16cc0 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 .initialized = 0
16cd0 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
16ce0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
16cf0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
16d00 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 HREADS)..Tcl_Mut
16d10 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d exUnlock(&init_m
16d20 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 x);.#endif...ret
16d30 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 urn(TCL_OK);.
16d40 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 }.. if (init
16d50 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 ialized) {..dpri
16d60 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 ntf("Called, but
16d70 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 using cached va
16d80 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 28 73 lue");..return(s
16d90 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 tatus);. }..
16da0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
16db0 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e ed");..#if defin
16dc0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
16dd0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
16de0 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 CL_THREADS).
16df0 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 Tcl_MutexLock(&i
16e00 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a nit_mx);.#endif.
16e10 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 initialized
16e20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 = 1;..#if define
16e30 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
16e40 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
16e50 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e L_THREADS). n
16e60 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 um_locks = 1;.
16e70 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 locksCount = (
16e80 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a int) num_locks;.
16e90 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c locks = mall
16ea0 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 oc(sizeof(*locks
16eb0 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a ) * num_locks);.
16ec0 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 memset(locks
16ed0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 , 0, sizeof(*loc
16ee0 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 ks) * num_locks)
16ef0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a ;.#endif.. /*
16f00 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 Initialize BOTH
16f10 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c libcrypto and l
16f20 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 ibssl. */. OP
16f30 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f ENSSL_init_ssl(O
16f40 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 PENSSL_INIT_LOAD
16f50 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f _SSL_STRINGS | O
16f60 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 PENSSL_INIT_LOAD
16f70 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a _CRYPTO_STRINGS.
16f80 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f .| OPENSSL_INIT_
16f90 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 ADD_ALL_CIPHERS
16fa0 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 | OPENSSL_INIT_A
16fb0 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 DD_ALL_DIGESTS,
16fc0 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f NULL);.. BIO_
16fd0 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 new_tcl(NULL, 0)
16fe0 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a ;..#if 0. /*.
16ff0 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a * XXX:TODO:
17000 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 Remove this cod
17010 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 e and replace it
17020 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20 with a check.
17030 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 * for enough
17040 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e entropy and do n
17050 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 ot try to create
17060 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 our own. *
17070 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 terrible entropy
17080 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a . */. /*.
17090 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 * Seed the
170a0 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 random number ge
170b0 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 nerator in the S
170c0 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 SL library,.
170d0 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f * using the do/
170e0 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 while construct
170f0 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 because of the b
17100 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 ug note in the.
17110 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 * OpenSSL FA
17120 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e Q at http://www.
17130 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 openssl.org/supp
17140 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 ort/faq.html#USE
17150 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a R1. *. *
17160 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 The crux of the
17170 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 problem is that
17180 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 Solaris 7 does
17190 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 not have a.
171a0 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 * /dev/random or
171b0 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 /dev/urandom de
171c0 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f vice so it canno
171d0 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a t gather enough.
171e0 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 * entropy f
171f0 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 rom the RAND_see
17200 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 d() when TLS ini
17210 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 tializes and ref
17220 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 uses. * to g
17230 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 o further. Earli
17240 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f er versions of O
17250 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f penSSL carried o
17260 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 n regardless..
17270 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 */. srand(
17280 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 (unsigned int) t
17290 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e ime((time_t *) N
172a0 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a ULL));. do {.
172b0 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c .for (i = 0; i <
172c0 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 16; i++) {..
172d0 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 rnd_seed[i] = 1
172e0 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 + (char) (255.0
172f0 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f * rand()/(RAND_
17300 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 MAX+1.0));..}..R
17310 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 AND_seed(rnd_see
17320 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 d, sizeof(rnd_se
17330 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c ed));. } whil
17340 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 e (RAND_status()
17350 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a != 1);.#endif..
17360 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
17370 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
17380 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
17390 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 ADS)..Tcl_MutexU
173a0 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b nlock(&init_mx);
173b0 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e .#endif...return
173c0 28 73 74 61 74 75 73 29 3b 0a 7d 0a (status);.}.