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 0a 73 74 61 74 ), (dsp)))..stat
0550: 69 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f ic SSL_CTX *CTX_
0560: 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 Init(State *stat
0570: 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 ePtr, int isServ
0580: 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 er, int proto, c
0590: 68 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 har *key,...char
05a0: 20 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 *certfile, unsi
05b0: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 gned char *key_a
05c0: 73 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 sn1, unsigned ch
05d0: 61 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 ar *cert_asn1,..
05e0: 09 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 .int key_asn1_le
05f0: 6e 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 n, int cert_asn1
0600: 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 _len, char *CAdi
0610: 72 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c r, char *CAfile,
0620: 0a 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 ...char *ciphers
0630: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 , char *ciphersu
0640: 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c ites, int level,
0650: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 char *DHparams)
0660: 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c ;..static int.Tl
0670: 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 sLibInit(int uni
0680: 6e 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 nitialize);..#de
0690: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 fine TLS_PROTO_S
06a0: 53 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e SL2..0x01.#defin
06b0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 e TLS_PROTO_SSL3
06c0: 09 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 ..0x02.#define T
06d0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 LS_PROTO_TLS1..0
06e0: 78 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f x04.#define TLS_
06f0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 PROTO_TLS1_1.0x0
0700: 38 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 8.#define TLS_PR
0710: 4f 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a OTO_TLS1_2.0x10.
0720: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 #define TLS_PROT
0730: 4f 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 O_TLS1_3.0x20.#d
0740: 65 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c efine ENABLED(fl
0750: 61 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 ag, mask).(((fla
0760: 67 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 g) & (mask)) ==
0770: 28 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 (mask))..#define
0780: 20 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 SSLKEYLOGFILE..
0790: 22 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a "SSLKEYLOGFILE".
07a0: 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 2d 53 61 ./*. * Thread-Sa
07b0: 66 65 20 54 4c 53 20 43 6f 64 65 0a 20 2a 2f 0a fe TLS Code. */.
07c0: 0a 23 69 66 64 65 66 20 54 43 4c 5f 54 48 52 45 .#ifdef TCL_THRE
07d0: 41 44 53 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e ADS.#define OPEN
07e0: 53 53 4c 5f 54 48 52 45 41 44 5f 44 45 46 49 4e SSL_THREAD_DEFIN
07f0: 45 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 ES.#include <ope
0800: 6e 73 73 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e 66 nssl/opensslconf
0810: 2e 68 3e 0a 0a 23 69 66 64 65 66 20 4f 50 45 4e .h>..#ifdef OPEN
0820: 53 53 4c 5f 54 48 52 45 41 44 53 0a 23 69 6e 63 SSL_THREADS.#inc
0830: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72 lude <openssl/cr
0840: 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 ypto.h>.#include
0850: 20 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 3e <openssl/ssl.h>
0860: 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 65 64 ../*. * Threaded
0870: 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 75 69 operation requi
0880: 72 65 73 20 6c 6f 63 6b 69 6e 67 20 63 61 6c 6c res locking call
0890: 62 61 63 6b 73 0a 20 2a 20 42 61 73 65 64 20 66 backs. * Based f
08a0: 72 6f 6d 20 2f 63 72 79 70 74 6f 2f 63 72 79 70 rom /crypto/cryp
08b0: 74 6c 69 62 2e 63 20 6f 66 20 4f 70 65 6e 53 53 tlib.c of OpenSS
08c0: 4c 20 61 6e 64 20 4e 53 4f 70 65 6e 53 53 4c 2e L and NSOpenSSL.
08d0: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c . */..static Tcl
08e0: 5f 4d 75 74 65 78 20 2a 6c 6f 63 6b 73 20 3d 20 _Mutex *locks =
08f0: 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e 74 NULL;.static int
0900: 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b locksCount = 0;
0910: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 .static Tcl_Mute
0920: 78 20 69 6e 69 74 5f 6d 78 3b 0a 23 65 6e 64 69 x init_mx;.#endi
0930: 66 20 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 48 52 f /* OPENSSL_THR
0940: 45 41 44 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f EADS */.#endif /
0950: 2a 20 54 43 4c 5f 54 48 52 45 41 44 53 20 2a 2f * TCL_THREADS */
0960: 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ..../***********
0970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 61 *********/./* Ca
0980: 6c 6c 62 61 63 6b 73 20 20 20 20 20 20 20 20 2a llbacks *
0990: 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /./*************
09a0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d *******/../*. *-
09b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09f0: 2d 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20 43 61 --. *. * Eval Ca
0a00: 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64 20 2d llback Command -
0a10: 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63 61 6c -. *. *.Eval cal
0a20: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 61 6e lback command an
0a30: 64 20 63 61 74 63 68 20 61 6e 79 20 65 72 72 6f d catch any erro
0a40: 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 rs. *. * Results
0a50: 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e 64 :. *.0 = Command
0a60: 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 20 6f returned fail o
0a70: 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64 20 r eval returned
0a80: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31 20 3d TCL_ERROR. *.1 =
0a90: 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 Command returne
0aa0: 64 20 73 75 63 63 65 73 73 20 6f 72 20 65 76 61 d success or eva
0ab0: 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c 5f 4f l returned TCL_O
0ac0: 4b 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 K. *. * Side eff
0ad0: 65 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75 61 74 ects:. *.Evaluat
0ae0: 65 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d es callback comm
0af0: 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d and. *. *-------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
0b40: 0a 73 74 61 74 69 63 20 69 6e 74 0a 45 76 61 6c .static int.Eval
0b50: 43 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49 6e 74 Callback(Tcl_Int
0b60: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 53 74 61 erp *interp, Sta
0b70: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 54 63 te *statePtr, Tc
0b80: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29 20 7b l_Obj *cmdPtr) {
0b90: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 6f . int code, o
0ba0: 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 k = 0;.. dpri
0bb0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
0bc0: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
0bd0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
0be0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 terp);. Tcl_P
0bf0: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
0c00: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
0c10: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
0c20: 6c 62 61 63 6b 20 77 69 74 68 20 73 75 63 63 65 lback with succe
0c30: 73 73 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 ss for ok or ret
0c40: 75 72 6e 20 76 61 6c 75 65 20 31 2c 20 66 61 69 urn value 1, fai
0c50: 6c 20 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 l for error or r
0c60: 65 74 75 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f eturn value 0 */
0c70: 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 . Tcl_ResetRe
0c80: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 sult(interp);.
0c90: 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 code = Tcl_Eva
0ca0: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 lObjEx(interp, c
0cb0: 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f mdPtr, TCL_EVAL_
0cc0: 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 64 70 72 GLOBAL);. dpr
0cd0: 69 6e 74 66 28 22 45 76 61 6c 43 61 6c 6c 62 61 intf("EvalCallba
0ce0: 63 6b 3a 20 25 64 22 2c 20 63 6f 64 65 29 3b 0a ck: %d", code);.
0cf0: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 if (code ==
0d00: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 43 68 TCL_OK) {../* Ch
0d10: 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72 20 72 eck result for r
0d20: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 eturn value */..
0d30: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 20 Tcl_Obj *result
0d40: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 = Tcl_GetObjResu
0d50: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 66 20 lt(interp);..if
0d60: 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 20 (result == NULL
0d70: 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f || Tcl_GetIntFro
0d80: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 mObj(interp, res
0d90: 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c ult, &ok) != TCL
0da0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b 20 3d _OK) {.. ok =
0db0: 20 31 3b 0a 09 7d 0a 09 64 70 72 69 6e 74 66 28 1;..}..dprintf(
0dc0: 22 52 65 73 75 6c 74 3a 20 25 64 22 2c 20 6f 6b "Result: %d", ok
0dd0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
0de0: 09 2f 2a 20 45 72 72 6f 72 20 2d 20 72 65 6a 65 ./* Error - reje
0df0: 63 74 20 74 68 65 20 63 65 72 74 69 66 69 63 61 ct the certifica
0e00: 74 65 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 te */..dprintf("
0e10: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 Tcl_BackgroundEr
0e20: 72 6f 72 22 29 3b 0a 23 69 66 20 28 54 43 4c 5f ror");.#if (TCL_
0e30: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d MAJOR_VERSION ==
0e40: 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 8) && (TCL_MINO
0e50: 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 R_VERSION < 6)..
0e60: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 Tcl_BackgroundEr
0e70: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c ror(interp);.#el
0e80: 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 se..Tcl_Backgrou
0e90: 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 ndException(inte
0ea0: 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 rp, code);.#endi
0eb0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c f. }.. Tcl
0ec0: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
0ed0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
0ee0: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 . Tcl_Release
0ef0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
0f00: 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 terp);. retur
0f10: 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d n ok;.}.../*. *-
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f30: 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c --. *. * InfoCal
0f70: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d lback --. *. *.M
0f80: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f 6e 6e onitors SSL conn
0f90: 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20 ection process.
0fa0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
0fb0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
0fc0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
0fd0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
0fe0: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d defined). *. *--
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1000: 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 -. */.static voi
1040: 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 63 d.InfoCallback(c
1050: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 onst SSL *ssl, i
1060: 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20 72 65 nt where, int re
1070: 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a t) {. State *
1080: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
1090: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 e*)SSL_get_app_d
10a0: 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b ata((SSL *)ssl);
10b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
10c0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
10d0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
10e0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
10f0: 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 6a 6f 72 . char *major
1100: 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 3b 0a 0a ; char *minor;..
1110: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
1120: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
1130: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
1140: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 ck == (Tcl_Obj*)
1150: 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a NULL)..return;..
1160: 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20 if (where &
1170: 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 SSL_CB_HANDSHAKE
1180: 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 _START) {..major
1190: 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a = "handshake";.
11a0: 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 22 .minor = "start"
11b0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
11c0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
11d0: 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20 HANDSHAKE_DONE)
11e0: 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 {..major = "hand
11f0: 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d shake";..minor =
1200: 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65 "done";. } e
1210: 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 72 65 lse {..if (where
1220: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 & SSL_CB_ALERT)
1230: 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74 ..major = "alert
1240: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 ";..else if (whe
1250: 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e re & SSL_ST_CONN
1260: 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f ECT).major = "co
1270: 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 66 nnect";..else if
1280: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 (where & SSL_ST
1290: 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 20 _ACCEPT)..major
12a0: 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 6c 73 = "accept";..els
12b0: 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75 e.....major = "u
12c0: 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77 nknown";...if (w
12d0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 45 here & SSL_CB_RE
12e0: 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65 AD)..minor = "re
12f0: 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 ad";..else if (w
1300: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 52 here & SSL_CB_WR
1310: 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77 ITE)..minor = "w
1320: 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 20 rite";..else if
1330: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1340: 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22 LOOP)..minor = "
1350: 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 20 loop";..else if
1360: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1370: 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22 EXIT)..minor = "
1380: 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 exit";..else....
1390: 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 .minor = "unknow
13a0: 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f n";. }.. /
13b0: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 * Create command
13c0: 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 to eval */.
13d0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
13e0: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
13f0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 tr->callback);.
1400: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
1410: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
1420: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
1430: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e NewStringObj("in
1440: 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 fo", -1));. T
1450: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1460: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
1470: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
1480: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
1490: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
14a0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
14b0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
14c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
14d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
14e0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
14f0: 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 ngObj(major, -1)
1500: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
1510: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1520: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
1530: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1540: 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 (minor, -1));..
1550: 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 if (where & S
1560: 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 SL_CB_ALERT) {..
1570: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1580: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1590: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
15a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 l_NewStringObj(S
15b0: 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 SL_alert_desc_st
15c0: 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 ring_long(ret),
15d0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
15e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
15f0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
1600: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
1610: 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f ngObj(SSL_alert_
1620: 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 type_string_long
1630: 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 (ret), -1));.
1640: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c } else {..Tcl_L
1650: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1660: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1670: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
1680: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 StringObj(SSL_st
1690: 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 ate_string_long(
16a0: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c ssl), -1));..Tcl
16b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
16c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
16d0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
16e0: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d ingObj("info", -
16f0: 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 1));. }..
1700: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
1710: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
1720: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
1730: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 (cmdPtr);. Ev
1740: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 alCallback(inter
1750: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 p, statePtr, cmd
1760: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 Ptr);. Tcl_De
1770: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
1780: 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d r);.}.../*. *---
1790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17a0: 2d 2d 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: 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 . *. * MessageCa
17e0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 llback --. *. *.
17f0: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70 72 6f Monitors SSL pro
1800: 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 tocol messages.
1810: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
1820: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
1830: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
1840: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
1850: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d defined). *. *--
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1870: 2d 2d 2d 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 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 -. */.#ifndef OP
18b0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 ENSSL_NO_SSL_TRA
18c0: 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 4d CE.static void.M
18d0: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 essageCallback(i
18e0: 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 nt write_p, int
18f0: 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e version, int con
1900: 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 tent_type, const
1910: 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 void *buf, size
1920: 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c _t len, SSL *ssl
1930: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 , void *arg) {.
1940: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
1950: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 tr = (State*)arg
1960: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
1970: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
1980: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
1990: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
19a0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 65 72 2c ;. char *ver,
19b0: 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 *type;. BIO
19c0: 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 *bio;. char b
19d0: 75 66 66 65 72 5b 33 30 30 30 30 5d 3b 0a 20 20 uffer[30000];.
19e0: 20 20 62 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b buffer[0] = 0;
19f0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
1a00: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
1a10: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
1a20: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
1a30: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b *)NULL)..return;
1a40: 0a 0a 20 20 20 20 73 77 69 74 63 68 28 76 65 72 .. switch(ver
1a50: 73 69 6f 6e 29 20 7b 0a 23 69 66 20 4f 50 45 4e sion) {.#if OPEN
1a60: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
1a70: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c ER < 0x10100000L
1a80: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f && !defined(NO_
1a90: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 SSL2) && !define
1aa0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
1ab0: 32 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c 32 2). case SSL2
1ac0: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d _VERSION:..ver =
1ad0: 20 22 53 53 4c 76 32 22 3b 0a 09 62 72 65 61 6b "SSLv2";..break
1ae0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
1af0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
1b00: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
1b10: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 SL_NO_SSL3).
1b20: 63 61 73 65 20 53 53 4c 33 5f 56 45 52 53 49 4f case SSL3_VERSIO
1b30: 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 33 N:..ver = "SSLv3
1b40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 ";..break;.#endi
1b50: 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f f. case TLS1_
1b60: 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 VERSION:..ver =
1b70: 22 54 4c 53 76 31 22 3b 0a 09 62 72 65 61 6b 3b "TLSv1";..break;
1b80: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 31 . case TLS1_1
1b90: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d _VERSION:..ver =
1ba0: 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09 62 72 65 "TLSv1.1";..bre
1bb0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 ak;. case TLS
1bc0: 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 1_2_VERSION:..ve
1bd0: 72 20 3d 20 22 54 4c 53 76 31 2e 32 22 3b 0a 09 r = "TLSv1.2";..
1be0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1bf0: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 3a 0a TLS1_3_VERSION:.
1c00: 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 33 22 .ver = "TLSv1.3"
1c10: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ;..break;. ca
1c20: 73 65 20 30 3a 0a 09 76 65 72 20 3d 20 22 6e 6f se 0:..ver = "no
1c30: 6e 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 ne";..break;.
1c40: 20 64 65 66 61 75 6c 74 3a 0a 09 76 65 72 20 3d default:..ver =
1c50: 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72 65 "unknown";..bre
1c60: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 ak;. }.. s
1c70: 77 69 74 63 68 20 28 63 6f 6e 74 65 6e 74 5f 74 witch (content_t
1c80: 79 70 65 29 20 7b 0a 20 20 20 20 63 61 73 65 20 ype) {. case
1c90: 53 53 4c 33 5f 52 54 5f 48 45 41 44 45 52 3a 0a SSL3_RT_HEADER:.
1ca0: 09 74 79 70 65 20 3d 20 22 48 65 61 64 65 72 22 .type = "Header"
1cb0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ;..break;. ca
1cc0: 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52 se SSL3_RT_INNER
1cd0: 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09 _CONTENT_TYPE:..
1ce0: 74 79 70 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f type = "Inner Co
1cf0: 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a 09 62 72 ntent Type";..br
1d00: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 eak;. case SS
1d10: 4c 33 5f 52 54 5f 43 48 41 4e 47 45 5f 43 49 50 L3_RT_CHANGE_CIP
1d20: 48 45 52 5f 53 50 45 43 3a 0a 09 74 79 70 65 20 HER_SPEC:..type
1d30: 3d 20 22 43 68 61 6e 67 65 20 43 69 70 68 65 72 = "Change Cipher
1d40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 ";..break;. c
1d50: 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 ase SSL3_RT_ALER
1d60: 54 3a 0a 09 74 79 70 65 20 3d 20 22 41 6c 65 72 T:..type = "Aler
1d70: 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 t";..break;.
1d80: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e case SSL3_RT_HAN
1d90: 44 53 48 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20 DSHAKE:..type =
1da0: 22 48 61 6e 64 73 68 61 6b 65 22 3b 0a 09 62 72 "Handshake";..br
1db0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 eak;. case SS
1dc0: 4c 33 5f 52 54 5f 41 50 50 4c 49 43 41 54 49 4f L3_RT_APPLICATIO
1dd0: 4e 5f 44 41 54 41 3a 0a 09 74 79 70 65 20 3d 20 N_DATA:..type =
1de0: 22 41 70 70 20 44 61 74 61 22 3b 0a 09 62 72 65 "App Data";..bre
1df0: 61 6b 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f ak;.#if OPENSSL_
1e00: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
1e10: 20 30 78 33 30 30 30 30 30 30 30 4c 0a 20 20 20 0x30000000L.
1e20: 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54 5f 48 case DTLS1_RT_H
1e30: 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70 65 20 EARTBEAT:..type
1e40: 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b 0a 09 = "Heartbeat";..
1e50: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 break;.#endif.
1e60: 20 20 64 65 66 61 75 6c 74 3a 0a 09 74 79 70 65 default:..type
1e70: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 = "unknown";.
1e80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 65 65 64 }.. /* Need
1e90: 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6f s compile time o
1ea0: 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65 2d 73 73 ption "enable-ss
1eb0: 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a 20 20 20 l-trace". */.
1ec0: 20 69 66 20 28 28 62 69 6f 20 3d 20 42 49 4f 5f if ((bio = BIO_
1ed0: 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 new(BIO_s_mem())
1ee0: 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e ) != NULL) {..in
1ef0: 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61 63 65 28 t n;..SSL_trace(
1f00: 77 72 69 74 65 5f 70 2c 20 76 65 72 73 69 6f 6e write_p, version
1f10: 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 , content_type,
1f20: 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c 2c 20 28 buf, len, ssl, (
1f30: 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a 09 6e 20 void *)bio);..n
1f40: 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 = BIO_read(bio,
1f50: 62 75 66 66 65 72 2c 20 42 49 4f 5f 70 65 6e 64 buffer, BIO_pend
1f60: 69 6e 67 28 62 69 6f 29 20 3c 20 31 35 30 30 30 ing(bio) < 15000
1f70: 20 3f 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 ? BIO_pending(b
1f80: 69 6f 29 20 3a 20 31 34 39 39 39 29 3b 0a 09 6e io) : 14999);..n
1f90: 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e = (n<0) ? 0 : n
1fa0: 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 ;..buffer[n] = 0
1fb0: 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 ;..(void)BIO_flu
1fc0: 73 68 28 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 sh(bio);..BIO_fr
1fd0: 65 65 28 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 ee(bio);. }..
1fe0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
1ff0: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a mand to eval */.
2000: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
2010: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
2020: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
2030: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2040: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2050: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2060: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2070: 28 22 6d 65 73 73 61 67 65 22 2c 20 2d 31 29 29 ("message", -1))
2080: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
2090: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
20a0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
20b0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
20c0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
20d0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
20e0: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 ->self), -1));.
20f0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2100: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2110: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
2120: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 77 72 69 NewStringObj(wri
2130: 74 65 5f 70 20 3f 20 22 53 65 6e 74 22 20 3a 20 te_p ? "Sent" :
2140: 22 52 65 63 65 69 76 65 64 22 2c 20 2d 31 29 29 "Received", -1))
2150: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
2160: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2170: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
2180: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2190: 76 65 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 ver, -1));. T
21a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
21b0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
21c0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
21d0: 74 72 69 6e 67 4f 62 6a 28 74 79 70 65 2c 20 2d tringObj(type, -
21e0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
21f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2200: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2210: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
2220: 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b bj(buffer, -1));
2230: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
2240: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
2250: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
2260: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
2270: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b EvalCallback
2280: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
2290: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 r, cmdPtr);.
22a0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
22b0: 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 (cmdPtr);.}.#end
22c0: 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d if.../*. *------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
2310: 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 . * VerifyCallba
2320: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 ck --. *. *.Moni
2330: 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 tors SSL certifi
2340: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 cate validation
2350: 70 72 6f 63 65 73 73 2e 20 55 73 65 64 20 74 6f process. Used to
2360: 20 63 6f 6e 74 72 6f 6c 20 74 68 65 0a 20 2a 09 control the. *.
2370: 62 65 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68 behavior when th
2380: 65 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 e SSL_VERIFY_PEE
2390: 52 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 R flag is set. T
23a0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a his is called. *
23b0: 09 77 68 65 6e 65 76 65 72 20 61 20 63 65 72 74 .whenever a cert
23c0: 69 66 69 63 61 74 65 20 69 73 20 69 6e 73 70 65 ificate is inspe
23d0: 63 74 65 64 20 6f 72 20 64 65 63 69 64 65 64 20 cted or decided
23e0: 69 6e 76 61 6c 69 64 2e 20 43 61 6c 6c 65 64 20 invalid. Called
23f0: 66 6f 72 0a 20 2a 09 65 61 63 68 20 63 65 72 74 for. *.each cert
2400: 69 66 69 63 61 74 65 20 69 6e 20 74 68 65 20 63 ificate in the c
2410: 65 72 74 20 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a ert chain.. *. *
2420: 20 43 68 65 63 6b 73 3a 0a 20 2a 09 63 65 72 74 Checks:. *.cert
2430: 69 66 69 63 61 74 65 20 63 68 61 69 6e 20 69 73 ificate chain is
2440: 20 63 68 65 63 6b 65 64 20 73 74 61 72 74 69 6e checked startin
2450: 67 20 77 69 74 68 20 74 68 65 20 64 65 65 70 65 g with the deepe
2460: 73 74 20 6e 65 73 74 69 6e 67 20 6c 65 76 65 6c st nesting level
2470: 0a 20 2a 09 20 20 28 74 68 65 20 72 6f 6f 74 20 . *. (the root
2480: 43 41 20 63 65 72 74 69 66 69 63 61 74 65 29 20 CA certificate)
2490: 61 6e 64 20 77 6f 72 6b 65 64 20 75 70 77 61 72 and worked upwar
24a0: 64 20 74 6f 20 74 68 65 20 70 65 65 72 27 73 20 d to the peer's
24b0: 63 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 certificate.. *.
24c0: 41 6c 6c 20 73 69 67 6e 61 74 75 72 65 73 20 61 All signatures a
24d0: 72 65 20 76 61 6c 69 64 2c 20 63 75 72 72 65 6e re valid, curren
24e0: 74 20 74 69 6d 65 20 69 73 20 77 69 74 68 69 6e t time is within
24f0: 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 first and last
2500: 76 61 6c 69 64 69 74 79 20 74 69 6d 65 2e 0a 20 validity time..
2510: 2a 09 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 *.Check that the
2520: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 certificate is
2530: 69 73 73 75 65 64 20 62 79 20 74 68 65 20 69 73 issued by the is
2540: 73 75 65 72 20 63 65 72 74 69 66 69 63 61 74 65 suer certificate
2550: 20 69 73 73 75 65 72 2e 0a 20 2a 09 43 68 65 63 issuer.. *.Chec
2560: 6b 20 74 68 65 20 72 65 76 6f 63 61 74 69 6f 6e k the revocation
2570: 20 73 74 61 74 75 73 20 66 6f 72 20 65 61 63 68 status for each
2580: 20 63 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a certificate.. *
2590: 09 43 68 65 63 6b 20 74 68 65 20 76 61 6c 69 64 .Check the valid
25a0: 69 74 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e ity of the given
25b0: 20 43 52 4c 20 61 6e 64 20 74 68 65 20 63 65 72 CRL and the cer
25c0: 74 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 t revocation sta
25d0: 74 75 73 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 tus.. *.Check th
25e0: 65 20 70 6f 6c 69 63 69 65 73 20 6f 66 20 61 6c e policies of al
25f0: 6c 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 l the certificat
2600: 65 73 0a 20 2a 0a 20 2a 20 41 72 67 73 0a 20 2a es. *. * Args. *
2610: 09 70 72 65 76 65 72 69 66 79 5f 6f 6b 20 69 6e .preverify_ok in
2620: 64 69 63 61 74 65 73 20 77 68 65 74 68 65 72 20 dicates whether
2630: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
2640: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 70 61 73 verification pas
2650: 73 65 64 20 28 31 29 20 6f 72 20 6e 6f 74 20 28 sed (1) or not (
2660: 30 29 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 0). *. * Results
2670: 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20 :. *.A callback
2680: 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 73 6f 63 bound to the soc
2690: 6b 65 74 20 6d 61 79 20 72 65 74 75 72 6e 20 6f ket may return o
26a0: 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09 ne of:. *. 0.
26b0: 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 ..- the certific
26c0: 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 69 6e ate is deemed in
26d0: 76 61 6c 69 64 2c 20 73 65 6e 64 20 76 65 72 69 valid, send veri
26e0: 66 69 63 61 74 69 6f 6e 0a 20 2a 09 09 09 09 20 fication. *....
26f0: 20 66 61 69 6c 75 72 65 20 61 6c 65 72 74 20 74 failure alert t
2700: 6f 20 70 65 65 72 2c 20 61 6e 64 20 74 65 72 6d o peer, and term
2710: 69 6e 61 74 65 20 68 61 6e 64 73 68 61 6b 65 2e inate handshake.
2720: 0a 20 2a 09 20 20 20 20 31 09 09 09 2d 20 74 68 . *. 1...- th
2730: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 e certificate is
2740: 20 64 65 65 6d 65 64 20 76 61 6c 69 64 2c 20 63 deemed valid, c
2750: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 68 61 6e ontinue with han
2760: 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 65 dshake.. *. e
2770: 6d 70 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f mpty string.- no
2780: 20 63 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 change to certi
2790: 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f ficate validatio
27a0: 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 n. *. * Side eff
27b0: 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 ects:. *.The err
27c0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 field of the cu
27d0: 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 rrently operativ
27e0: 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 e State is set.
27f0: 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 *. to a string
2800: 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 describing the S
2810: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 SL negotiation f
2820: 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a ailure reason. *
2830: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2870: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
2880: 63 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c c int.VerifyCall
2890: 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 back(int ok, X50
28a0: 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 9_STORE_CTX *ctx
28b0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ) {. Tcl_Obj
28c0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 53 53 4c *cmdPtr;. SSL
28d0: 20 20 20 2a 73 73 6c 20 3d 20 28 53 53 4c 2a 29 *ssl = (SSL*)
28e0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 X509_STORE_CTX_g
28f0: 65 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20 et_ex_data(ctx,
2900: 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f SSL_get_ex_data_
2910: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 X509_STORE_CTX_i
2920: 64 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20 dx());. X509
2930: 20 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53 *cert..= X509_S
2940: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 TORE_CTX_get_cur
2950: 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a rent_cert(ctx);.
2960: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
2970: 50 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53 Ptr.= (State*)SS
2980: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 L_get_app_data(s
2990: 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 sl);. Tcl_Int
29a0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
29b0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
29c0: 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d int depth..=
29d0: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f X509_STORE_CTX_
29e0: 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 get_error_depth(
29f0: 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 ctx);. int er
2a00: 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f r..= X509_STORE_
2a10: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 CTX_get_error(ct
2a20: 78 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 x);.. dprintf
2a30: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 ("Called");.
2a40: 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 dprintf("VerifyC
2a50: 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 6f 6b allback: %d", ok
2a60: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
2a70: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 ePtr->vcmd == (T
2a80: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
2a90: 09 2f 2a 20 55 73 65 20 6f 6b 20 76 61 6c 75 65 ./* Use ok value
2aa0: 20 69 66 20 76 65 72 69 66 69 63 61 74 69 6f 6e if verification
2ab0: 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a is required */.
2ac0: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 .if (statePtr->v
2ad0: 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 flags & SSL_VERI
2ae0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
2af0: 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 ER_CERT) {..
2b00: 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c return ok;..} el
2b10: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e se {.. return
2b20: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 1;..}. } els
2b30: 65 20 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 e if (cert == NU
2b40: 4c 4c 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c LL || ssl == NUL
2b50: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a L) {..return 0;.
2b60: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
2b70: 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 tf("VerifyCallba
2b80: 63 6b 3a 20 65 76 61 6c 20 63 61 6c 6c 62 61 63 ck: eval callbac
2b90: 6b 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 k");.. /* Cre
2ba0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
2bb0: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 val */. cmdPt
2bc0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
2bd0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
2be0: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
2bf0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2c00: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2c10: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2c20: 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 Obj("verify", -1
2c30: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2c40: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2c50: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2c60: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f ..Tcl_NewStringO
2c70: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
2c80: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
2c90: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
2ca0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2cb0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2cc0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
2cd0: 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b wIntObj(depth));
2ce0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2cf0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2d00: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c terp, cmdPtr, Tl
2d10: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 s_NewX509Obj(int
2d20: 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 erp, cert));.
2d30: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2d40: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2d50: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
2d60: 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 wIntObj(ok));.
2d70: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2d80: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2d90: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f p, cmdPtr,..Tcl_
2da0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 NewStringObj((ch
2db0: 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f ar*)X509_verify_
2dc0: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e cert_error_strin
2dd0: 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 g(err), -1));..
2de0: 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f /* Prevent I/
2df0: 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b O while callback
2e00: 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 is in progress
2e10: 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 */. /* stateP
2e20: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 tr->flags |= TLS
2e30: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a _TCL_CALLBACK; *
2e40: 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 /.. /* Eval c
2e50: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
2e60: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 */. Tcl_IncrR
2e70: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
2e80: 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 . ok = EvalCa
2e90: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 llback(interp, s
2ea0: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 tatePtr, cmdPtr)
2eb0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 ;. Tcl_DecrRe
2ec0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
2ed0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 . dprintf("Ve
2ee0: 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 63 6f rifyCallback: co
2ef0: 6d 6d 61 6e 64 20 72 65 73 75 6c 74 20 3d 20 25 mmand result = %
2f00: 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 2f 2a d", ok);.. /*
2f10: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 statePtr->flags
2f20: 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 &= ~(TLS_TCL_CA
2f30: 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 LLBACK); */.
2f40: 72 65 74 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42 return(ok);./* B
2f50: 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 y default, leave
2f60: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75 6e verification un
2f70: 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a changed. */.}...
2f80: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 54 --------. *. * T
2fd0: 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 ls_Error --. *.
2fe0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
2ff0: 20 77 69 74 68 20 6c 69 73 74 20 6f 66 20 65 72 with list of er
3000: 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 rors.. *. * Side
3010: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 effects:. *.The
3020: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 err field of th
3030: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 e currently oper
3040: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 ative State is s
3050: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 et. *. to a str
3060: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 ing describing t
3070: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 he SSL negotiati
3080: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f on failure reaso
3090: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d n. *. *---------
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 ----------. */.v
30e0: 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 oid.Tls_Error(St
30f0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 ate *statePtr, c
3100: 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 har *msg) {.
3110: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
3120: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
3130: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
3140: 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 bj *cmdPtr, *lis
3150: 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e tPtr;. unsign
3160: 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 ed long err;.
3170: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20 3d statePtr->err =
3180: 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e msg;.. dprin
3190: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
31a0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
31b0: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 >callback == (Tc
31c0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 l_Obj*)NULL)..re
31d0: 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 turn;.. /* Cr
31e0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
31f0: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 eval */. cmdP
3200: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
3210: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
3220: 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 callback);. T
3230: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3240: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3250: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
3260: 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 tringObj("error"
3270: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
3280: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3290: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
32a0: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
32b0: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
32c0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
32d0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
32e0: 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 1));. if (msg
32f0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c != NULL) {..Tcl
3300: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3310: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3320: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
3330: 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 ingObj(msg, -1))
3340: 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ;.. } else if
3350: 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 ((msg = Tcl_Get
3360: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 StringFromObj(Tc
3370: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
3380: 6e 74 65 72 70 29 2c 20 28 54 63 6c 5f 53 69 7a nterp), (Tcl_Siz
3390: 65 20 2a 29 20 4e 55 4c 4c 29 29 20 21 3d 20 4e e *) NULL)) != N
33a0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 ULL) {..Tcl_List
33b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
33c0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
33d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
33e0: 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 j(msg, -1));..
33f0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 } else {..list
3400: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
3410: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 tObj(0, NULL);..
3420: 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20 45 52 while ((err = ER
3430: 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 20 21 R_get_error()) !
3440: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f = 0) {.. Tcl_
3450: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3460: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
3470: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tPtr, Tcl_NewStr
3480: 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f ingObj(ERR_reaso
3490: 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 n_error_string(e
34a0: 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 rr), -1));..}..T
34b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
34c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
34d0: 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 72 29 cmdPtr, listPtr)
34e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
34f0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
3500: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
3510: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
3520: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 dPtr);. EvalC
3530: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
3540: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
3550: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
3560: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
3570: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
35c0: 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 . * KeyLogCallba
35d0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 ck --. *. *.Writ
35e0: 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 20 64 e received key d
35f0: 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e ata to log file.
3600: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
3610: 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a cts:. *.none. *.
3620: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3660: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b -----. */.void K
3670: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f eyLogCallback(co
3680: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f nst SSL *ssl, co
3690: 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 nst char *line)
36a0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 {. char *str
36b0: 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c = getenv(SSLKEYL
36c0: 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c OGFILE);. FIL
36d0: 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 72 69 E *fd;.. dpri
36e0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
36f0: 20 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a 09 if (str) {..
3700: 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 fd = fopen(str,
3710: 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 "a");..fprintf(f
3720: 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b d, "%s\n",line);
3730: 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 ..fclose(fd);.
3740: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d }.}.../*. *---
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3790: 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 20 . *. * Password
37a0: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 Callback --. *.
37b0: 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 *.Called when a
37c0: 70 61 73 73 77 6f 72 64 20 66 6f 72 20 61 20 70 password for a p
37d0: 72 69 76 61 74 65 20 6b 65 79 20 6c 6f 61 64 69 rivate key loadi
37e0: 6e 67 2f 73 74 6f 72 69 6e 67 20 61 20 50 45 4d ng/storing a PEM
37f0: 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74 65 20 . *.certificate
3800: 77 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e with encryption.
3810: 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 20 Evals callback
3820: 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75 72 script and retur
3830: 6e 73 0a 20 2a 09 74 68 65 20 72 65 73 75 6c 74 ns. *.the result
3840: 20 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 64 as the password
3850: 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a string in buf..
3860: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
3870: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
3880: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
3890: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
38a0: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
38b0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73 Returns:. *.Pass
38c0: 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74 word size in byt
38d0: 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 es or -1 for an
38e0: 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d error.. *. *----
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3930: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 */.static int.P
3940: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 asswordCallback(
3950: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 char *buf, int s
3960: 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c ize, int rwflag,
3970: 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a void *udata) {.
3980: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
3990: 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 Ptr.= (State *)
39a0: 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 udata;. Tcl_I
39b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
39c0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
39d0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
39e0: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 mdPtr;. int c
39f0: 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ode;.. dprint
3a00: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
3a10: 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c 62 /* If no callb
3a20: 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c 74 ack, use default
3a30: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 callback */.
3a40: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
3a50: 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 assword == NULL)
3a60: 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c {..if (Tcl_Eval
3a70: 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a Ex(interp, "tls:
3a80: 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c 20 :password", -1,
3a90: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
3aa0: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 == TCL_OK) {..
3ab0: 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 28 char *ret = (
3ac0: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 char *) Tcl_GetS
3ad0: 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 tringResult(inte
3ae0: 72 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63 70 rp);.. strncp
3af0: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a y(buf, ret, (siz
3b00: 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 e_t) size);..
3b10: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72 return (int)str
3b20: 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c 73 len(ret);..} els
3b30: 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 e {.. return
3b40: 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 -1;..}. }..
3b50: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
3b60: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 and to eval */.
3b70: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
3b80: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
3b90: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
3ba0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3bb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3bc0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3bd0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
3be0: 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 "password", -1))
3bf0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3c00: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3c10: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3c20: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 cl_NewIntObj(rwf
3c30: 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c lag));. Tcl_L
3c40: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3c50: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
3c60: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 tr, Tcl_NewIntOb
3c70: 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54 j(size));.. T
3c80: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
3c90: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
3ca0: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 ;. Tcl_Preser
3cb0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
3cc0: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
3cd0: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
3ce0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
3cf0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
3d00: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
3d10: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
3d20: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
3d30: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
3d40: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
3d50: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
3d60: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
3d70: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
3d80: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
3d90: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
3da0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
3db0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
3dc0: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
3dd0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
3de0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
3df0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
3e00: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
3e10: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
3e20: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
3e30: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 ePtr);.. /* I
3e40: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 61 f successful, pa
3e50: 73 73 20 62 61 63 6b 20 70 61 73 73 77 6f 72 64 ss back password
3e60: 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72 75 6e string and trun
3e70: 63 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 cate if too long
3e80: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f 64 65 */. if (code
3e90: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 == TCL_OK) {..T
3ea0: 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 09 63 68 cl_Size len;..ch
3eb0: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 ar *ret = (char
3ec0: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 *) Tcl_GetString
3ed0: 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f FromObj(Tcl_GetO
3ee0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 bjResult(interp)
3ef0: 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 , &len);..if (le
3f00: 6e 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 n > (Tcl_Size) s
3f10: 69 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 ize-1) {.. le
3f20: 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 n = (Tcl_Size) s
3f30: 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 ize-1;..}..strnc
3f40: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 py(buf, ret, (si
3f50: 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 ze_t) len);..buf
3f60: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 [len] = '\0';..T
3f70: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
3f80: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
3f90: 0a 09 72 65 74 75 72 6e 28 28 69 6e 74 29 20 6c ..return((int) l
3fa0: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 en);. }. T
3fb0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
3fc0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
3fd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a . return -1;.
3fe0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
4030: 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 * Session Callb
4040: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 ack for Clients
4050: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
4060: 77 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 when a new sessi
4070: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 on is added to t
4080: 68 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 he cache. In TLS
4090: 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 1.3. *.this may
40a0: 20 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c be received mul
40b0: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 tiple times afte
40c0: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e r the handshake.
40d0: 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 For. *.earlier
40e0: 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 versions, this w
40f0: 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 ill be received
4100: 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 during the hands
4110: 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 hake.. *.This is
4120: 20 74 68 65 20 70 72 65 66 65 72 72 65 64 20 77 the preferred w
4130: 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 ay to obtain a r
4140: 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e esumable session
4150: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
4160: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
4170: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
4180: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
4190: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
41a0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
41b0: 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 *.0 = error whe
41c0: 72 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 re session will
41d0: 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 be immediately r
41e0: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 emoved from the
41f0: 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a internal cache..
4200: 20 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 *.1 = success w
4210: 68 65 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 here app retains
4220: 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 session in sess
4230: 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d ion cache, and m
4240: 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 ust call SSL_SES
4250: 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e SION_free() when
4260: 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d done.. *. *----
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
42b0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 */.static int.S
42c0: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 essionCallback(S
42d0: 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 SL *ssl, SSL_SES
42e0: 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b SION *session) {
42f0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
4300: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 ePtr = (State*)S
4310: 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 SL_get_app_data(
4320: 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 (SSL *)ssl);.
4330: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
4340: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
4350: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
4360: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
4370: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
4380: 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 char *ticket;.
4390: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
43a0: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 char *session_i
43b0: 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 d;. size_t le
43c0: 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 n2;. unsigned
43d0: 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 int ulen;..
43e0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
43f0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
4400: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
4410: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
4420: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
4430: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 TLSEXT_ERR_OK;.
4440: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 } else if (ss
4450: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 l == NULL) {..re
4460: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
4470: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
4480: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
4490: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
44a0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
44b0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
44c0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
44d0: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ack);. Tcl_Li
44e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
44f0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4500: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4510: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d Obj("session", -
4520: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
4530: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4540: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4550: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
4560: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
4570: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
4580: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
4590: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f ;.. /* Sessio
45a0: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 n id */. sess
45b0: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 ion_id = SSL_SES
45c0: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 SION_get_id(sess
45d0: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 ion, &ulen);.
45e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
45f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4600: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4610: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 wByteArrayObj(se
4620: 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 ssion_id, (Tcl_S
4630: 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 ize) ulen));..
4640: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 /* Session tic
4650: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 ket */. SSL_S
4660: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b ESSION_get0_tick
4670: 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 et(session, &tic
4680: 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 ket, &len2);.
4690: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
46a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
46b0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
46c0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 wByteArrayObj(ti
46d0: 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 cket, (Tcl_Size)
46e0: 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a len2));.. /*
46f0: 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 Lifetime - numb
4700: 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f er of seconds */
4710: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4720: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4730: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 terp, cmdPtr,..T
4740: 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c cl_NewLongObj((l
4750: 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e ong) SSL_SESSION
4760: 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 _get_ticket_life
4770: 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f time_hint(sessio
4780: 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 n)));.. /* Ev
4790: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
47a0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
47b0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
47c0: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c tr);. EvalCal
47d0: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
47e0: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b atePtr, cmdPtr);
47f0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
4800: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
4810: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c return 0;.}..
4820: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
4870: 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f ALPN Callback fo
4880: 72 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 r Servers and NP
4890: 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 N Callback for C
48a0: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 lients --. *. *.
48b0: 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c Perform protocol
48c0: 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 (http/1.1, h2,
48d0: 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 h3, etc.) select
48e0: 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 ion for the. *.i
48f0: 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 ncoming connecti
4900: 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 on. Called after
4910: 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 Hello and serve
4920: 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 r callbacks.. *.
4930: 57 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 Where 'out' is s
4940: 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
4950: 20 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 and 'in' is the
4960: 20 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 peer advertised
4970: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 list.. *. * Res
4980: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
4990: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
49a0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
49b0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
49c0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
49d0: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 des:. *.SSL_TLSE
49e0: 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 XT_ERR_OK: ALPN
49f0: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 protocol selecte
4a00: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f d. The connectio
4a10: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 n continues.. *.
4a20: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
4a30: 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 LERT_FATAL: Ther
4a40: 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 e was no overlap
4a50: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 between the cli
4a60: 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 ent's. *. sup
4a70: 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 plied list and t
4a80: 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 he server config
4a90: 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e uration. The con
4aa0: 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 nection will be
4ab0: 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f aborted.. *.SSL_
4ac0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
4ad0: 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 : ALPN protocol
4ae0: 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e not selected, e.
4af0: 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 g., because no A
4b00: 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f LPN. *. proto
4b10: 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 cols are configu
4b20: 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e red for this con
4b30: 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e nection. The con
4b40: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
4b50: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d s.. *. *--------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
4ba0: 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 static int.ALPNC
4bb0: 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c allback(SSL *ssl
4bc0: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 , const unsigned
4bd0: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 char **out, uns
4be0: 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c igned char *outl
4bf0: 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 en,..const unsig
4c00: 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e ned char *in, un
4c10: 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e signed int inlen
4c20: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 , void *arg) {.
4c30: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
4c40: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 tr = (State*)arg
4c50: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
4c60: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
4c70: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
4c80: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
4c90: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 ;. int code,
4ca0: 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 res;.. dprint
4cb0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
4cc0: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c if (ssl == NUL
4cd0: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c L || arg == NULL
4ce0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
4cf0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
4d00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
4d10: 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 Select protocol
4d20: 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 */. if (SSL_s
4d30: 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f elect_next_proto
4d40: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ((unsigned char
4d50: 2a 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c **) out, outlen,
4d60: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
4d70: 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f s, statePtr->pro
4d80: 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e tos_len,..in, in
4d90: 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f len) == OPENSSL_
4da0: 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 NPN_NEGOTIATED)
4db0: 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e {../* Match foun
4dc0: 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f d */..res = SSL_
4dd0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 TLSEXT_ERR_OK;.
4de0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 } else {../*
4df0: 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f OPENSSL_NPN_NO_O
4e00: 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 VERLAP = No over
4e10: 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 lap, so use firs
4e20: 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 t item from clie
4e30: 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 nt protocol list
4e40: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 */..res = SSL_T
4e50: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
4e60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
4e70: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
4e80: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
4e90: 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b ) {..return res;
4ea0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
4eb0: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
4ec0: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 eval */. cmd
4ed0: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
4ee0: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
4ef0: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f >vcmd);. Tcl_
4f00: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
4f10: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
4f20: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
4f30: 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 ngObj("alpn", -1
4f40: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
4f50: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
4f60: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
4f70: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
4f80: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 ingObj(Tcl_GetCh
4f90: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
4fa0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b tr->self), -1));
4fb0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4fc0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4fd0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
4fe0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 l_NewStringObj((
4ff0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 2a 6f const char *) *o
5000: 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 ut, -1));. Tc
5010: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
5020: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
5030: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f mdPtr, Tcl_NewBo
5040: 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 oleanObj(res ==
5050: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
5060: 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 K));.. /* Eva
5070: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
5080: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
5090: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
50a0: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 r);. if ((cod
50b0: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b e = EvalCallback
50c0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
50d0: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 r, cmdPtr)) > 1)
50e0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
50f0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
5100: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
5110: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 ode == 1) {..res
5120: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 = SSL_TLSEXT_ER
5130: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 R_OK;. } else
5140: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
5150: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 SEXT_ERR_ALERT_F
5160: 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ATAL;. }.
5170: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
5180: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 (cmdPtr);. re
5190: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a turn res;.}.../*
51a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
51b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 ------. *. * Adv
51f0: 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 ertise Protocols
5200: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 Callback for Ne
5210: 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f xt Protocol Nego
5220: 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e tiation (NPN) in
5230: 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a ServerHello --.
5240: 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 *. *.called whe
5250: 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e n a TLS server n
5260: 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73 eeds a list of s
5270: 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f upported protoco
5280: 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 ls for Next. *.P
5290: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 rotocol Negotiat
52a0: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ion.. *. * Resul
52b0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
52c0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
52d0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
52e0: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
52f0: 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 T_ERR_OK: NPN pr
5300: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e otocol selected.
5310: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
5320: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
5330: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
5340: 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c CK: NPN protocol
5350: 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54 not selected. T
5360: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
5370: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d ntinues.. *. *--
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53c0: 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 -. */.#ifdef USE
53d0: 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a _NPN.static int.
53e0: 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 NPNCallback(cons
53f0: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 t SSL *ssl, cons
5400: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
5410: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 **out, unsigned
5420: 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 int *outlen, voi
5430: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 d *arg) {. St
5440: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
5450: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 (State*)arg;..
5460: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
5470: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 d");.. if (ss
5480: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 l == NULL || arg
5490: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
54a0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
54b0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
54c0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 . /* Set prot
54d0: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 ocols list */.
54e0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
54f0: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 protos != NULL)
5500: 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 {..*out = stateP
5510: 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 tr->protos;..*ou
5520: 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d tlen = statePtr-
5530: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 >protos_len;.
5540: 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 } else {..*out
5550: 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e = NULL;..*outlen
5560: 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 = 0;..return SS
5570: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
5580: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 CK;. }. re
5590: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
55a0: 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 ERR_OK;.}.#endif
55b0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
5600: 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 * SNI Callback f
5610: 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a or Servers --. *
5620: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76 . *.Perform serv
5630: 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74 er-side SNI host
5640: 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 name selection a
5650: 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53 fter receiving S
5660: 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 NI extension. *.
5670: 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e in Client Hello.
5680: 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 Called after he
5690: 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 llo callback but
56a0: 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c before ALPN cal
56b0: 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 lback.. *. * Res
56c0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
56d0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
56e0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
56f0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
5700: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
5710: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 des:. *.SSL_TLSE
5720: 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 XT_ERR_OK: SNI h
5730: 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 ostname is accep
5740: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
5750: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
5760: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
5770: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e _ALERT_FATAL: SN
5780: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
5790: 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 t accepted. The
57a0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 connection. *.
57b0: 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 is aborted. De
57c0: 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 fault for alert
57d0: 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f is SSL_AD_UNRECO
57e0: 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 GNIZED_NAME.. *.
57f0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
5800: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e LERT_WARNING: SN
5810: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
5820: 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e t accepted, warn
5830: 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 ing alert. *.
5840: 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f sent (not suppo
5850: 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 rted in TLSv1.3)
5860: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
5870: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
5880: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
5890: 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d ACK: SNI hostnam
58a0: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 e is not accepte
58b0: 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 d and not acknow
58c0: 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 ledged,. *. e
58d0: 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e .g. if SNI has n
58e0: 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 ot been configur
58f0: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
5900: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
5910: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5950: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
5960: 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 c int.SNICallbac
5970: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
5980: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f , int *alert, vo
5990: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
59a0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
59b0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 (State*)arg;.
59c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
59d0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
59e0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
59f0: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
5a00: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b int code, res;
5a10: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
5a20: 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 *servername = NU
5a30: 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 LL;.. dprintf
5a40: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
5a50: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
5a60: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 || arg == NULL)
5a70: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
5a80: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
5a90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f . }.. /* O
5aa0: 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c nly works for TL
5ab0: 53 20 31 2e 32 20 61 6e 64 20 65 61 72 6c 69 65 S 1.2 and earlie
5ac0: 72 20 2a 2f 0a 20 20 20 20 73 65 72 76 65 72 6e r */. servern
5ad0: 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 ame = SSL_get_se
5ae0: 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c rvername(ssl, TL
5af0: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f SEXT_NAMETYPE_ho
5b00: 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 st_name);. if
5b10: 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c (!servername ||
5b20: 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d servername[0] =
5b30: 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65 74 75 72 = '\0') {..retur
5b40: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
5b50: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
5b60: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
5b70: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 >vcmd == (Tcl_Ob
5b80: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 j*)NULL) {..retu
5b90: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
5ba0: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 R_OK;. }..
5bb0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
5bc0: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
5bd0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
5be0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
5bf0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
5c00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5c10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5c20: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
5c30: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 wStringObj("sni"
5c40: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
5c50: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5c60: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5c70: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
5c80: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
5c90: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
5ca0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
5cb0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
5cc0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
5cd0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
5ce0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
5cf0: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 bj(servername ,
5d00: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 -1));.. /* Ev
5d10: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
5d20: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
5d30: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
5d40: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f tr);. if ((co
5d50: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 de = EvalCallbac
5d60: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
5d70: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 tr, cmdPtr)) > 1
5d80: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 ) {..res = SSL_T
5d90: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
5da0: 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 WARNING;..*alert
5db0: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f = SSL_AD_UNRECO
5dc0: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 GNIZED_NAME; /*
5dd0: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 Not supported by
5de0: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 TLS 1.3 */.
5df0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 } else if (code
5e00: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 1) {..res = S
5e10: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
5e20: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
5e30: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
5e40: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
5e50: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f ;..*alert = SSL_
5e60: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f AD_UNRECOGNIZED_
5e70: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 NAME; /* Not sup
5e80: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e ported by TLS 1.
5e90: 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 3 */. }. T
5ea0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
5eb0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 cmdPtr);. ret
5ec0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a urn res;.}.../*.
5ed0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f10: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 -----. *. * Clie
5f20: 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b ntHello Handshak
5f30: 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 e Callback for S
5f40: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 ervers --. *. *.
5f50: 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74 Used by server t
5f60: 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65 o examine the se
5f70: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 rver name indica
5f80: 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e tion (SNI) exten
5f90: 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 sion. *.provided
5fa0: 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69 by the client i
5fb0: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63 n order to selec
5fc0: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 t an appropriate
5fd0: 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a certificate to.
5fe0: 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 *.present, and
5ff0: 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 make other confi
6000: 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d guration adjustm
6010: 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f ents relevant to
6020: 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09 that server. *.
6030: 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e name and its con
6040: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 figuration. This
6050: 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69 includes swappi
6060: 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63 ng out the assoc
6070: 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 iated. *.SSL_CTX
6080: 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 pointer, modify
6090: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 ing the server's
60a0: 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74 list of permitt
60b0: 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c ed TLS versions,
60c0: 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65 . *.changing the
60d0: 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72 server's cipher
60e0: 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 list in respons
60f0: 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 e to the client'
6100: 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65 s cipher list, e
6110: 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 tc.. *.Called be
6120: 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 fore SNI and ALP
6130: 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a N callbacks.. *.
6140: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
6150: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
6160: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
6170: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
6180: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
6190: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
61a0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 L_CLIENT_HELLO_R
61b0: 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68 ETRY: suspend th
61c0: 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 e handshake, and
61d0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 the handshake f
61e0: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 unction will ret
61f0: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a urn immediately.
6200: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 *.SSL_CLIENT_HE
6210: 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 LLO_ERROR: failu
6220: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f re, terminate co
6230: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c nnection. Set al
6240: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 ert to error cod
6250: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 e.. *.SSL_CLIENT
6260: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 _HELLO_SUCCESS:
6270: 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d success. *. *---
6280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
62a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
62b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
62c0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
62d0: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53 HelloCallback(SS
62e0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
62f0: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
6300: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
6310: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
6320: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
6330: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
6340: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
6350: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
6360: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
6370: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 , res;. const
6380: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
6390: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
63a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 igned char *p;.
63b0: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 size_t len, r
63c0: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 emaining;.. d
63d0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
63e0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
63f0: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 Ptr->vcmd == (Tc
6400: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
6410: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6420: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b T_HELLO_SUCCESS;
6430: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
6440: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 ssl == (const SS
6450: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 L *)NULL || arg
6460: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 == (void *)NULL)
6470: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 {..return SSL_C
6480: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6490: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
64a0: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 Get names */.
64b0: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e if (!SSL_clien
64c0: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 t_hello_get0_ext
64d0: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 (ssl, TLSEXT_TYP
64e0: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 E_server_name, &
64f0: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c p, &remaining) |
6500: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 | remaining <= 2
6510: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 ) {..*alert = SS
6520: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f L_R_SSLV3_ALERT_
6530: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 ILLEGAL_PARAMETE
6540: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 R;..return SSL_C
6550: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6560: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6570: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e Extract the len
6580: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c gth of the suppl
6590: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 ied list of name
65a0: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 s. */. len =
65b0: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 (*(p++) << 8);.
65c0: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 len += *(p++)
65d0: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 ;. if (len +
65e0: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 2 != remaining)
65f0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
6600: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c R_SSLV3_ALERT_IL
6610: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b LEGAL_PARAMETER;
6620: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
6630: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
6640: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 . }. remai
6650: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 ning = len;..
6660: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 /* The list in
6670: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 practice only ha
6680: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 s a single eleme
6690: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 nt, so we only c
66a0: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 onsider the firs
66b0: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 t one. */. if
66c0: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 (remaining == 0
66d0: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 || *p++ != TLSE
66e0: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 XT_NAMETYPE_host
66f0: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 _name) {..*alert
6700: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
6710: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
6720: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c ROR;..return SSL
6730: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6740: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
6750: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 emaining--;..
6760: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 /* Now we can f
6770: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 inally pull out
6780: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 the byte array w
6790: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 ith the actual h
67a0: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 ostname. */.
67b0: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d if (remaining <=
67c0: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 2) {..*alert =
67d0: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
67e0: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 T_INTERNAL_ERROR
67f0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
6800: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
6810: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 ;. }. len
6820: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b = (*(p++) << 8);
6830: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b . len += *(p+
6840: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 +);. if (len
6850: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 + 2 > remaining)
6860: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
6870: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
6880: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 NTERNAL_ERROR;..
6890: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
68a0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
68b0: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
68c0: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 ng = len;. se
68d0: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 rvername = (cons
68e0: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 t char *)p;..
68f0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
6900: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
6910: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
6920: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
6930: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
6940: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
6950: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
6960: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
6970: 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c wStringObj("hell
6980: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 o", -1));. Tc
6990: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
69a0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
69b0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
69c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
69d0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
69e0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
69f0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
6a00: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
6a10: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
6a20: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
6a30: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c gObj(servername,
6a40: 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 (Tcl_Size) len)
6a50: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 );.. /* Eval
6a60: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
6a70: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
6a80: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
6a90: 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 ;. if ((code
6aa0: 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 = EvalCallback(i
6ab0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
6ac0: 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b cmdPtr)) > 1) {
6ad0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 ..res = SSL_CLIE
6ae0: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a NT_HELLO_RETRY;.
6af0: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f .*alert = SSL_R_
6b00: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 TLSV1_ALERT_USER
6b10: 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 _CANCELLED;.
6b20: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 } else if (code
6b30: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 1) {..res = S
6b40: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
6b50: 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 SUCCESS;. } e
6b60: 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c lse {..res = SSL
6b70: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6b80: 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 ROR;..*alert = S
6b90: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 SL_R_TLSV1_ALERT
6ba0: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b _INTERNAL_ERROR;
6bb0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
6bc0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
6bd0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
6be0: 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a res;.}.../******
6bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
6c00: 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 /* Commands
6c10: 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a */./********
6c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f ************/../
6c30: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c70: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 -------. *. * Ha
6c80: 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d ndshakeObjCmd --
6c90: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d . *. *.This comm
6ca0: 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 and is used to v
6cb0: 65 72 69 66 79 20 77 68 65 74 68 65 72 20 74 68 erify whether th
6cc0: 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63 e handshake is c
6cd0: 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f omplete. *.or no
6ce0: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 t.. *. * Results
6cf0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
6d00: 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 Tcl result. 1 me
6d10: 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f ans handshake co
6d20: 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 mplete, 0 means
6d30: 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 pending.. *. * S
6d40: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
6d50: 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 May force SSL ne
6d60: 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b gotiation to tak
6d70: 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d e place.. *. *--
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6dc0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
6dd0: 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 HandshakeObjCmd
6de0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
6df0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
6e00: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
6e10: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
6e20: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
6e30: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
6e40: 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 han; /* T
6e50: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 he channel to se
6e60: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a t a mode on. */.
6e70: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
6e80: 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 Ptr; /* c
6e90: 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 lient state for
6ea0: 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 ssl socket */.
6eb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 const char *er
6ec0: 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 rStr = NULL;.
6ed0: 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 int ret = 1;.
6ee0: 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 20 int err = 0;.
6ef0: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 (void) client
6f00: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e Data;.. dprin
6f10: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
6f20: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 if (objc != 2
6f30: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
6f40: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
6f50: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 objv, "channel"
6f60: 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 );..return(TCL_E
6f70: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 RROR);. }..
6f80: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
6f90: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d r();.. chan =
6fa0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
6fb0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
6fc0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
6fd0: 76 5b 31 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20 v[1], (Tcl_Size
6fe0: 2a 29 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b *) NULL), NULL);
6ff0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
7000: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
7010: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 ULL) {..return(T
7020: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
7030: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
7040: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
7050: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
7060: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
7070: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
7080: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
7090: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
70a0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
70b0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
70c0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
70d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
70e0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
70f0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
7100: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 ame(chan),..
7110: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
7120: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a hannel", NULL);.
7130: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
7140: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
7150: 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 43 "HANDSHAKE", "C
7160: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
7170: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
7180: 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f L);..return(TCL_
7190: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20 ERROR);. }.
71a0: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 statePtr = (St
71b0: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 ate *)Tcl_GetCha
71c0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
71d0: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 (chan);.. dpr
71e0: 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c intf("Calling Tl
71f0: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
7200: 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c ");. ret = Tl
7210: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
7220: 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c (statePtr, &err,
7230: 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 1);. dprintf
7240: 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e ("Tls_WaitForCon
7250: 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25 nect returned: %
7260: 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 i", ret);.. i
7270: 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 28 28 f (ret < 0 && ((
7280: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
7290: 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 & TLS_TCL_ASYNC)
72a0: 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41 && (err == EAGA
72b0: 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 IN))) {..dprintf
72c0: 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 ("Async set and
72d0: 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a err = EAGAIN");.
72e0: 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 .ret = 0;. }
72f0: 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20 30 else if (ret < 0
7300: 29 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 73 74 ) {..errStr = st
7310: 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 atePtr->err;..Tc
7320: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e l_ResetResult(in
7330: 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 terp);..Tcl_SetE
7340: 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 rrno(err);...if
7350: 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 (!errStr || (*er
7360: 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 rStr == 0)) {..
7370: 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f errStr = Tcl_
7380: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 PosixError(inter
7390: 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 p);..}...Tcl_App
73a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
73b0: 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69 , "handshake fai
73c0: 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 led: ", errStr,
73d0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
73e0: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
73f0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
7400: 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 46 "HANDSHAKE", "F
7410: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
7420: 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 NULL);..dprintf
7430: 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f ("Returning TCL_
7440: 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 ERROR with hands
7450: 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 hake failed: %s"
7460: 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 , errStr);..retu
7470: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
7480: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
7490: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 (err != 0) {..
74a0: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 dprintf("Got a
74b0: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 n error with a c
74c0: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 ompleted handsha
74d0: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 ke: err = %i", e
74e0: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 rr);..}..ret = 1
74f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
7500: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 intf("Returning
7510: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 TCL_OK with data
7520: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a \"%i\"", ret);.
7530: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
7540: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
7550: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 _NewIntObj(ret))
7560: 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c ;. return(TCL
7570: 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 _OK);.}..static
7580: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d const char *comm
7590: 61 6e 64 5f 6f 70 74 73 20 5b 5d 20 3d 20 7b 0a and_opts [] = {.
75a0: 20 20 20 20 22 2d 61 6c 70 6e 22 2c 20 22 2d 63 "-alpn", "-c
75b0: 61 64 69 72 22 2c 20 22 2d 63 61 66 69 6c 65 22 adir", "-cafile"
75c0: 2c 20 22 2d 63 65 72 74 22 2c 20 22 2d 63 65 72 , "-cert", "-cer
75d0: 74 66 69 6c 65 22 2c 20 22 2d 63 69 70 68 65 72 tfile", "-cipher
75e0: 22 2c 20 22 2d 63 69 70 68 65 72 73 22 2c 20 22 ", "-ciphers", "
75f0: 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 0a -ciphersuites",.
7600: 20 20 20 20 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 "-command",
7610: 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 22 2d 6b "-dhparams", "-k
7620: 65 79 22 2c 20 22 2d 6b 65 79 66 69 6c 65 22 2c ey", "-keyfile",
7630: 20 22 2d 6d 6f 64 65 6c 22 2c 20 22 2d 70 61 73 "-model", "-pas
7640: 73 77 6f 72 64 22 2c 20 22 2d 70 6f 73 74 5f 68 sword", "-post_h
7650: 61 6e 64 73 68 61 6b 65 22 2c 0a 20 20 20 20 22 andshake",. "
7660: 2d 72 65 71 75 65 73 74 22 2c 20 22 2d 72 65 71 -request", "-req
7670: 75 69 72 65 22 2c 20 22 2d 73 65 63 75 72 69 74 uire", "-securit
7680: 79 5f 6c 65 76 65 6c 22 2c 20 22 2d 73 65 72 76 y_level", "-serv
7690: 65 72 22 2c 20 22 2d 73 65 72 76 65 72 6e 61 6d er", "-servernam
76a0: 65 22 2c 20 22 2d 73 65 73 73 69 6f 6e 5f 69 64 e", "-session_id
76b0: 22 2c 20 22 2d 73 73 6c 32 22 2c 0a 20 20 20 20 ", "-ssl2",.
76c0: 22 2d 73 73 6c 33 22 2c 20 22 2d 74 6c 73 31 22 "-ssl3", "-tls1"
76d0: 2c 20 22 2d 74 6c 73 31 2e 31 22 2c 20 22 2d 74 , "-tls1.1", "-t
76e0: 6c 73 31 2e 32 22 2c 20 22 2d 74 6c 73 31 2e 33 ls1.2", "-tls1.3
76f0: 22 2c 20 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d ", "-validatecom
7700: 6d 61 6e 64 22 2c 20 22 2d 76 63 6d 64 22 2c 20 mand", "-vcmd",
7710: 4e 55 4c 4c 7d 3b 0a 0a 65 6e 75 6d 20 5f 63 6f NULL};..enum _co
7720: 6d 6d 61 6e 64 5f 6f 70 74 73 20 7b 0a 20 20 20 mmand_opts {.
7730: 20 5f 6f 70 74 5f 61 6c 70 6e 2c 20 5f 6f 70 74 _opt_alpn, _opt
7740: 5f 63 61 64 69 72 2c 20 5f 6f 70 74 5f 63 61 66 _cadir, _opt_caf
7750: 69 6c 65 2c 20 5f 6f 70 74 5f 63 65 72 74 2c 20 ile, _opt_cert,
7760: 5f 6f 70 74 5f 63 65 72 74 66 69 6c 65 2c 20 5f _opt_certfile, _
7770: 6f 70 74 5f 63 69 70 68 65 72 2c 20 5f 6f 70 74 opt_cipher, _opt
7780: 5f 63 69 70 68 65 72 73 2c 0a 20 20 20 20 5f 6f _ciphers,. _o
7790: 70 74 5f 63 69 70 68 65 72 73 75 69 74 65 2c 20 pt_ciphersuite,
77a0: 5f 6f 70 74 5f 63 6d 64 2c 20 5f 6f 70 74 5f 64 _opt_cmd, _opt_d
77b0: 68 70 61 72 61 6d 73 2c 20 5f 6f 70 74 5f 6b 65 hparams, _opt_ke
77c0: 79 2c 20 5f 6f 70 74 5f 6b 65 79 66 69 6c 65 2c y, _opt_keyfile,
77d0: 20 5f 6f 70 74 5f 6d 6f 64 65 6c 2c 20 5f 6f 70 _opt_model, _op
77e0: 74 5f 70 61 73 73 77 6f 72 64 2c 0a 20 20 20 20 t_password,.
77f0: 5f 6f 70 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 _opt_handshake,
7800: 5f 6f 70 74 5f 72 65 71 75 65 73 74 2c 20 5f 6f _opt_request, _o
7810: 70 74 5f 72 65 71 75 69 72 65 2c 20 5f 6f 70 74 pt_require, _opt
7820: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c _security_level,
7830: 20 5f 6f 70 74 5f 73 65 72 76 65 72 2c 20 5f 6f _opt_server, _o
7840: 70 74 5f 73 65 72 76 65 72 6e 61 6d 65 2c 0a 20 pt_servername,.
7850: 20 20 20 5f 6f 70 74 5f 73 65 73 73 69 6f 6e 5f _opt_session_
7860: 69 64 2c 20 5f 6f 70 74 5f 73 73 6c 32 2c 20 5f id, _opt_ssl2, _
7870: 6f 70 74 5f 73 73 6c 33 2c 20 5f 6f 70 74 5f 74 opt_ssl3, _opt_t
7880: 6c 73 31 2c 20 5f 6f 70 74 5f 74 6c 73 31 31 2c ls1, _opt_tls11,
7890: 20 5f 6f 70 74 5f 74 6c 73 31 32 2c 20 5f 6f 70 _opt_tls12, _op
78a0: 74 5f 74 6c 73 31 33 2c 0a 20 20 20 20 5f 6f 70 t_tls13,. _op
78b0: 74 5f 76 61 6c 69 64 61 74 65 2c 20 5f 6f 70 74 t_validate, _opt
78c0: 5f 76 63 6d 64 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d _vcmd.};../*. *-
78d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7910: 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f --. *. * ImportO
7920: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 bjCmd --. *. *.T
7930: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
7940: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 invoked to proc
7950: 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f ess the "ssl" co
7960: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 mmand. *. *.The
7970: 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 ssl command push
7980: 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e es SSL over a (n
7990: 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 ewly connected)
79a0: 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a tcp socket. *. *
79b0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
79c0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
79d0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
79e0: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d ffects:. *.May m
79f0: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 odify the behavi
7a00: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e or of an IO chan
7a10: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nel.. *. *------
7a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
7a60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 /.static int.Imp
7a70: 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 ortObjCmd(Client
7a80: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
7a90: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
7aa0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
7ab0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
7ac0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
7ad0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f Channel chan;../
7ae0: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
7af0: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 set a mode on.
7b00: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 */. State *st
7b10: 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 atePtr;../* clie
7b20: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c nt state for ssl
7b30: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 socket */. S
7b40: 53 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 20 20 SL_CTX *ctx.
7b50: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
7b60: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 4f 62 6a 09 Tcl_Obj *cmdObj.
7b70: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
7b80: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 Tcl_Obj *pas
7b90: 73 77 64 4f 62 6a 09 20 20 20 20 20 20 20 20 3d swdObj. =
7ba0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f NULL;. Tcl_O
7bb0: 62 6a 20 2a 76 63 6d 64 09 20 20 20 20 20 20 20 bj *vcmd.
7bc0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c = NULL;. Tcl
7bd0: 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 _DString upperCh
7be0: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
7bf0: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c , upperChannelBl
7c00: 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 ocking, upperCha
7c10: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 nnelEncoding, up
7c20: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 perChannelEOFCha
7c30: 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b 0a r;. int idx;.
7c40: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 66 6e 2c Tcl_Size fn,
7c50: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c len;. int fl
7c60: 61 67 73 09 09 20 20 20 20 20 20 20 20 3d 20 54 ags.. = T
7c70: 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 LS_TCL_INIT;.
7c80: 20 69 6e 74 20 73 65 72 76 65 72 09 09 20 20 20 int server..
7c90: 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20 = 0;./* is
7ca0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d connection incom
7cb0: 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f ing or outgoing?
7cc0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 */. char *ke
7cd0: 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 yfile. =
7ce0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
7cf0: 63 65 72 74 66 69 6c 65 09 20 20 20 20 20 20 20 certfile.
7d00: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 = NULL;. uns
7d10: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20 igned char *key
7d20: 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 .= NULL;. Tc
7d30: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 20 20 l_Size key_len
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d =
7d50: 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 0;. unsigned
7d60: 20 63 68 61 72 20 2a 63 65 72 74 20 20 20 20 20 char *cert
7d70: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
7d80: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 Tcl_Size cert_le
7d90: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 n
7da0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a = 0;. char *
7db0: 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20 ciphers.
7dc0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
7dd0: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 09 20 *ciphersuites.
7de0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
7df0: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 char *CAfile.
7e00: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
7e10: 20 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 09 char *CAdir.
7e20: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
7e30: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 . char *DHpar
7e40: 61 6d 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ams. = NU
7e50: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f LL;. char *mo
7e60: 64 65 6c 09 09 20 20 20 20 20 20 20 20 3d 20 4e del.. = N
7e70: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 ULL;. char *s
7e80: 65 72 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20 ervername.
7e90: 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 = NULL;./* hos
7ea0: 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72 tname for Server
7eb0: 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e Name Indication
7ec0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e */. const un
7ed0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 signed char *ses
7ee0: 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a sion_id = NULL;.
7ef0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 73 65 73 Tcl_Size ses
7f00: 73 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 s_len
7f10: 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 54 63 = 0;. Tc
7f20: 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 4f 62 6a 09 09 l_Obj *alpnObj..
7f30: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
7f40: 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d ssl2 = 0, ssl3 =
7f50: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 0;. int tls1
7f60: 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 = 1, tls1_1 = 1
7f70: 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c , tls1_2 = 1, tl
7f80: 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e s1_3 = 1;. in
7f90: 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 t proto = 0, lev
7fa0: 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 el = -1;. int
7fb0: 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 verify = 0, req
7fc0: 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 uire = 0, reques
7fd0: 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 t = 1, post_hand
7fe0: 73 68 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 28 shake = 0;. (
7ff0: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
8000: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
8010: 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 Called");..#if d
8020: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
8030: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
8040: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 SL_NO_TLS1).
8050: 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 tls1 = 0;.#endif
8060: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
8070: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
8080: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
8090: 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 S1_1). tls1_1
80a0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
80b0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
80c0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
80d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
80e0: 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 ). tls1_2 = 0
80f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
8100: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
8110: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
8120: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
8130: 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 tls1_3 = 0;.#e
8140: 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 ndif.. if (ob
8150: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 jc < 2) {..Tcl_W
8160: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
8170: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
8180: 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 annel ?options?"
8190: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
81a0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
81b0: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 ERR_clear_error
81c0: 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 ();.. chan =
81d0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
81e0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 nterp, Tcl_GetSt
81f0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
8200: 5b 31 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a [1], (Tcl_Size *
8210: 29 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a ) NULL), NULL);.
8220: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
8230: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
8240: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
8250: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
8260: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
8270: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
8280: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
8290: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
82a0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
82b0: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 el(chan);.. f
82c0: 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 or (idx = 2; idx
82d0: 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 < objc; idx++)
82e0: 7b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e {..if (Tcl_GetIn
82f0: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
8300: 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 6f p, objv[idx], co
8310: 6d 6d 61 6e 64 5f 6f 70 74 73 2c 20 22 6f 70 74 mmand_opts, "opt
8320: 69 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d ion", 0, &fn) !=
8330: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 TCL_OK) {..
8340: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
8350: 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 61 6c 69 64 61 ;..}.../* Valida
8360: 74 65 20 61 72 67 20 68 61 73 20 76 61 6c 75 65 te arg has value
8370: 20 2a 2f 0a 09 69 66 20 28 2b 2b 69 64 78 20 3e */..if (++idx >
8380: 3d 20 6f 62 6a 63 29 20 7b 0a 09 20 20 20 20 54 = objc) {.. T
8390: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
83a0: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 76 61 6c 75 interp, "No valu
83b0: 65 20 66 6f 72 20 6f 70 74 69 6f 6e 20 5c 22 22 e for option \""
83c0: 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66 , command_opts[f
83d0: 6e 5d 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20 n], "\"", (char
83e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 *) NULL);.. r
83f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8400: 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 6e 29 ..}...switch(fn)
8410: 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 61 6c {..case _opt_al
8420: 70 6e 3a 0a 09 20 20 20 20 61 6c 70 6e 4f 62 6a pn:.. alpnObj
8430: 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 = objv[idx];..
8440: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 break;..case
8450: 5f 6f 70 74 5f 63 61 64 69 72 3a 0a 09 20 20 20 _opt_cadir:..
8460: 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 GET_OPT_STRING(
8470: 6f 62 6a 76 5b 69 64 78 5d 2c 20 43 41 64 69 72 objv[idx], CAdir
8480: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 , NULL);.. br
8490: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f eak;..case _opt_
84a0: 63 61 66 69 6c 65 3a 0a 09 20 20 20 20 47 45 54 cafile:.. GET
84b0: 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 _OPT_STRING(objv
84c0: 5b 69 64 78 5d 2c 20 43 41 66 69 6c 65 2c 20 4e [idx], CAfile, N
84d0: 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b ULL);.. break
84e0: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 65 72 ;..case _opt_cer
84f0: 74 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f t:.. GET_OPT_
8500: 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b BYTE_ARRAY(objv[
8510: 69 64 78 5d 2c 20 63 65 72 74 2c 20 26 63 65 72 idx], cert, &cer
8520: 74 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 t_len);.. bre
8530: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 ak;..case _opt_c
8540: 65 72 74 66 69 6c 65 3a 0a 09 20 20 20 20 47 45 ertfile:.. GE
8550: 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a T_OPT_STRING(obj
8560: 76 5b 69 64 78 5d 2c 20 63 65 72 74 66 69 6c 65 v[idx], certfile
8570: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 , NULL);.. br
8580: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f eak;..case _opt_
8590: 63 69 70 68 65 72 3a 0a 09 63 61 73 65 20 5f 6f cipher:..case _o
85a0: 70 74 5f 63 69 70 68 65 72 73 3a 0a 09 20 20 20 pt_ciphers:..
85b0: 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 GET_OPT_STRING(
85c0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 69 70 68 65 objv[idx], ciphe
85d0: 72 73 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 rs, NULL);..
85e0: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 break;..case _op
85f0: 74 5f 63 69 70 68 65 72 73 75 69 74 65 3a 0a 09 t_ciphersuite:..
8600: 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 GET_OPT_STRI
8610: 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 69 NG(objv[idx], ci
8620: 70 68 65 72 73 75 69 74 65 73 2c 20 4e 55 4c 4c phersuites, NULL
8630: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 );.. break;..
8640: 63 61 73 65 20 5f 6f 70 74 5f 63 6d 64 3a 0a 09 case _opt_cmd:..
8650: 20 20 20 20 63 6d 64 4f 62 6a 20 3d 20 6f 62 6a cmdObj = obj
8660: 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 65 v[idx];.. bre
8670: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 64 ak;..case _opt_d
8680: 68 70 61 72 61 6d 73 3a 0a 09 20 20 20 20 47 45 hparams:.. GE
8690: 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a T_OPT_STRING(obj
86a0: 76 5b 69 64 78 5d 2c 20 44 48 70 61 72 61 6d 73 v[idx], DHparams
86b0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 , NULL);.. br
86c0: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f eak;..case _opt_
86d0: 6b 65 79 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 key:.. GET_OP
86e0: 54 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a T_BYTE_ARRAY(obj
86f0: 76 5b 69 64 78 5d 2c 20 6b 65 79 2c 20 26 6b 65 v[idx], key, &ke
8700: 79 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 y_len);.. bre
8710: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6b ak;..case _opt_k
8720: 65 79 66 69 6c 65 3a 0a 09 20 20 20 20 47 45 54 eyfile:.. GET
8730: 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 _OPT_STRING(objv
8740: 5b 69 64 78 5d 2c 20 6b 65 79 66 69 6c 65 2c 20 [idx], keyfile,
8750: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 NULL);.. brea
8760: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6d 6f k;..case _opt_mo
8770: 64 65 6c 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 del:.. GET_OP
8780: 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 T_STRING(objv[id
8790: 78 5d 2c 20 6d 6f 64 65 6c 2c 20 4e 55 4c 4c 29 x], model, NULL)
87a0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 ;.. break;..c
87b0: 61 73 65 20 5f 6f 70 74 5f 70 61 73 73 77 6f 72 ase _opt_passwor
87c0: 64 3a 0a 09 20 20 20 20 70 61 73 73 77 64 4f 62 d:.. passwdOb
87d0: 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 j = objv[idx];..
87e0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 break;..case
87f0: 20 5f 6f 70 74 5f 68 61 6e 64 73 68 61 6b 65 3a _opt_handshake:
8800: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 4f .. GET_OPT_BO
8810: 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 70 OL(objv[idx], &p
8820: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a ost_handshake);.
8830: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 . break;..cas
8840: 65 20 5f 6f 70 74 5f 72 65 71 75 65 73 74 3a 0a e _opt_request:.
8850: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 4f 4f . GET_OPT_BOO
8860: 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 72 65 L(objv[idx], &re
8870: 71 75 65 73 74 29 3b 0a 09 20 20 20 20 62 72 65 quest);.. bre
8880: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 72 ak;..case _opt_r
8890: 65 71 75 69 72 65 3a 0a 09 20 20 20 20 47 45 54 equire:.. GET
88a0: 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62 6a 76 5b 69 _OPT_BOOL(objv[i
88b0: 64 78 5d 2c 20 26 72 65 71 75 69 72 65 29 3b 0a dx], &require);.
88c0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 . break;..cas
88d0: 65 20 5f 6f 70 74 5f 73 65 63 75 72 69 74 79 5f e _opt_security_
88e0: 6c 65 76 65 6c 3a 0a 09 20 20 20 20 47 45 54 5f level:.. GET_
88f0: 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 OPT_INT(objv[idx
8900: 5d 2c 20 26 6c 65 76 65 6c 29 3b 0a 09 20 20 20 ], &level);..
8910: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f break;..case _o
8920: 70 74 5f 73 65 72 76 65 72 3a 0a 09 20 20 20 20 pt_server:..
8930: 47 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62 6a GET_OPT_BOOL(obj
8940: 76 5b 69 64 78 5d 2c 20 26 73 65 72 76 65 72 29 v[idx], &server)
8950: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 ;.. break;..c
8960: 61 73 65 20 5f 6f 70 74 5f 73 65 72 76 65 72 6e ase _opt_servern
8970: 61 6d 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 ame:.. GET_OP
8980: 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 T_STRING(objv[id
8990: 78 5d 2c 20 73 65 72 76 65 72 6e 61 6d 65 2c 20 x], servername,
89a0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 NULL);.. brea
89b0: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 65 k;..case _opt_se
89c0: 73 73 69 6f 6e 5f 69 64 3a 0a 09 20 20 20 20 47 ssion_id:.. G
89d0: 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41 ET_OPT_BYTE_ARRA
89e0: 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 73 65 73 Y(objv[idx], ses
89f0: 73 69 6f 6e 5f 69 64 2c 20 26 73 65 73 73 5f 6c sion_id, &sess_l
8a00: 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b en);.. break;
8a10: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 73 6c 32 ..case _opt_ssl2
8a20: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 49 :.. GET_OPT_I
8a30: 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 73 NT(objv[idx], &s
8a40: 73 6c 32 29 3b 0a 09 20 20 20 20 62 72 65 61 6b sl2);.. break
8a50: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 73 6c ;..case _opt_ssl
8a60: 33 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 3:.. GET_OPT_
8a70: 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 INT(objv[idx], &
8a80: 73 73 6c 33 29 3b 0a 09 20 20 20 20 62 72 65 61 ssl3);.. brea
8a90: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 74 6c k;..case _opt_tl
8aa0: 73 31 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 s1:.. GET_OPT
8ab0: 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 _INT(objv[idx],
8ac0: 26 74 6c 73 31 29 3b 0a 09 20 20 20 20 62 72 65 &tls1);.. bre
8ad0: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 74 ak;..case _opt_t
8ae0: 6c 73 31 31 3a 0a 09 20 20 20 20 47 45 54 5f 4f ls11:.. GET_O
8af0: 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d PT_INT(objv[idx]
8b00: 2c 20 26 74 6c 73 31 5f 31 29 3b 0a 09 20 20 20 , &tls1_1);..
8b10: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f break;..case _o
8b20: 70 74 5f 74 6c 73 31 32 3a 0a 09 20 20 20 20 47 pt_tls12:.. G
8b30: 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b ET_OPT_INT(objv[
8b40: 69 64 78 5d 2c 20 26 74 6c 73 31 5f 32 29 3b 0a idx], &tls1_2);.
8b50: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 . break;..cas
8b60: 65 20 5f 6f 70 74 5f 74 6c 73 31 33 3a 0a 09 20 e _opt_tls13:..
8b70: 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f GET_OPT_INT(o
8b80: 62 6a 76 5b 69 64 78 5d 2c 20 26 74 6c 73 31 5f bjv[idx], &tls1_
8b90: 33 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 3);.. break;.
8ba0: 09 63 61 73 65 20 5f 6f 70 74 5f 76 61 6c 69 64 .case _opt_valid
8bb0: 61 74 65 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f ate:..case _opt_
8bc0: 76 63 6d 64 3a 0a 09 20 20 20 20 76 63 6d 64 20 vcmd:.. vcmd
8bd0: 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 = objv[idx];..
8be0: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 break;..}.
8bf0: 7d 0a 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 }.. if (reque
8c00: 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53 st)..verify |= S
8c10: 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 SL_VERIFY_CLIENT
8c20: 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 _ONCE | SSL_VERI
8c30: 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 FY_PEER;. if
8c40: 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75 (request && requ
8c50: 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 ire).verify |= S
8c60: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 SL_VERIFY_FAIL_I
8c70: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a F_NO_PEER_CERT;.
8c80: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 if (request
8c90: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b && post_handshak
8ca0: 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c e).verify |= SSL
8cb0: 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e _VERIFY_POST_HAN
8cc0: 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 DSHAKE;. if (
8cd0: 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65 verify == 0)..ve
8ce0: 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 rify = SSL_VERIF
8cf0: 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f Y_NONE;.. pro
8d00: 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c to |= (ssl2 ? TL
8d10: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 S_PROTO_SSL2 : 0
8d20: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 );. proto |=
8d30: 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 (ssl3 ? TLS_PROT
8d40: 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 O_SSL3 : 0);.
8d50: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 proto |= (tls1
8d60: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 ? TLS_PROTO_TLS1
8d70: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f : 0);. proto
8d80: 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c |= (tls1_1 ? TL
8d90: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a S_PROTO_TLS1_1 :
8da0: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 0);. proto |
8db0: 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f = (tls1_2 ? TLS_
8dc0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 PROTO_TLS1_2 : 0
8dd0: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 );. proto |=
8de0: 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 (tls1_3 ? TLS_PR
8df0: 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b OTO_TLS1_3 : 0);
8e00: 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 .. /* reset t
8e10: 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 o NULL if blank
8e20: 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 string provided
8e30: 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 */. if (cert
8e40: 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 && !*cert)..
8e50: 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20 cert.
8e60: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
8e70: 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 (key && !*key)..
8e80: 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 key.
8e90: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
8ea0: 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 if (certfile &&
8eb0: 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 !*certfile)
8ec0: 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e certfile.= N
8ed0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 ULL;. if (key
8ee0: 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c file && !*keyfil
8ef0: 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 e)..keyfile.
8f00: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
8f10: 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21 if (ciphers && !
8f20: 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20 *ciphers).
8f30: 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20 ciphers.
8f40: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
8f50: 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26 (ciphersuites &
8f60: 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 & !*ciphersuites
8f70: 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20 ) ciphersuites
8f80: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
8f90: 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 (CAfile && !*CA
8fa0: 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 file). CA
8fb0: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e file. = N
8fc0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64 ULL;. if (CAd
8fd0: 69 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 20 ir && !*CAdir).
8fe0: 20 20 20 20 20 20 20 43 41 64 69 72 09 20 20 20 CAdir.
8ff0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
9000: 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 if (DHparams &&
9010: 20 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 !*DHparams).
9020: 20 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 DHparams
9030: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 = NULL;..
9040: 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 /* new SSL sta
9050: 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 te */. stateP
9060: 74 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 tr..= (State *)
9070: 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 ckalloc((unsigne
9080: 64 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 d) sizeof(State)
9090: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 );. memset(st
90a0: 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f atePtr, 0, sizeo
90b0: 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 f(State));..
90c0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 statePtr->flags.
90d0: 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 = flags;. sta
90e0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 tePtr->interp.=
90f0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 interp;. stat
9100: 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 ePtr->vflags.= v
9110: 65 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 erify;. state
9120: 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a Ptr->err.= "";..
9130: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 /* allocate
9140: 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 script */. if
9150: 20 28 63 6d 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c (cmdObj != NULL
9160: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f ) {..(void) Tcl_
9170: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
9180: 28 63 6d 64 4f 62 6a 2c 20 26 6c 65 6e 29 3b 0a (cmdObj, &len);.
9190: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 .if (len) {..
91a0: 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 statePtr->callb
91b0: 61 63 6b 20 3d 20 63 6d 64 4f 62 6a 3b 0a 09 20 ack = cmdObj;..
91c0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
91d0: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 unt(statePtr->ca
91e0: 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 llback);..}.
91f0: 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 }.. /* alloca
9200: 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 te password */.
9210: 20 20 20 69 66 20 28 70 61 73 73 77 64 4f 62 6a if (passwdObj
9220: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 28 76 6f != NULL) {..(vo
9230: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e id) Tcl_GetStrin
9240: 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 64 4f gFromObj(passwdO
9250: 62 6a 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 bj, &len);..if (
9260: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 len) {.. stat
9270: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d ePtr->password =
9280: 20 70 61 73 73 77 64 4f 62 6a 3b 0a 09 20 20 20 passwdObj;..
9290: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
92a0: 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 t(statePtr->pass
92b0: 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a word);..}. }.
92c0: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 . /* allocate
92d0: 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e validate comman
92e0: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d d */. if (vcm
92f0: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c d) {..(void) Tcl
9300: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
9310: 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 j(vcmd, &len);..
9320: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 if (len) {..
9330: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
9340: 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f vcmd;.. Tcl_
9350: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 IncrRefCount(sta
9360: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d tePtr->vcmd);..}
9370: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
9380: 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b model != NULL) {
9390: 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 ..int mode;../*
93a0: 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 Get the "model"
93b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e context */..chan
93c0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
93d0: 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c l(interp, model,
93e0: 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 &mode);..if (ch
93f0: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
9400: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 el) NULL) {..
9410: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
9420: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
9430: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
9440: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a ROR;..}.../*.. *
9450: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
9460: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
9470: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a most channel.. *
9480: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 /..chan = Tcl_Ge
9490: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
94a0: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 );..if (Tcl_GetC
94b0: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
94c0: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
94d0: 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 ype()) {.. Tc
94e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
94f0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
9500: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
9510: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
9520: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
9530: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
9540: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
9550: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
9560: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
9570: 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 T", "CHANNEL", "
9580: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
9590: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
95a0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
95b0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
95c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
95d0: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 R;..}..ctx = ((S
95e0: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 tate *)Tcl_GetCh
95f0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
9600: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 a(chan))->ctx;.
9610: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
9620: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 ((ctx = CTX_Init
9630: 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 (statePtr, serve
9640: 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c r, proto, keyfil
9650: 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 e, certfile, key
9660: 2c 20 63 65 72 74 2c 20 28 69 6e 74 29 20 6b 65 , cert, (int) ke
9670: 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 28 69 6e 74 y_len,.. (int
9680: 29 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69 ) cert_len, CAdi
9690: 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 r, CAfile, ciphe
96a0: 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 rs, ciphersuites
96b0: 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d , level, DHparam
96c0: 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 s)) == NULL) {..
96d0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
96e0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
96f0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
9700: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
9710: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
9720: 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 ctx = ctx;..
9730: 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 /*. * We nee
9740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 d to make sure t
9750: 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 hat the channel
9760: 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 works in binary
9770: 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 (for the. *
9780: 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 encryption not t
9790: 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 o get goofed up)
97a0: 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 .. * We only
97b0: 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 want to adjust
97c0: 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e the buffering in
97d0: 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 pre-v2 channels
97e0: 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 , where. * e
97f0: 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 ach channel in t
9800: 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 he stack maintai
9810: 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 ned its own buff
9820: 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ers.. */.
9830: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
9840: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 (&upperChannelTr
9850: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 anslation);.
9860: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
9870: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f &upperChannelBlo
9880: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f cking);. Tcl_
9890: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 DStringInit(&upp
98a0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
98b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
98c0: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
98d0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 nnelEncoding);.
98e0: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
98f0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
9900: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 chan, "-eofchar"
9910: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 , &upperChannelE
9920: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c OFChar);. Tcl
9930: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
9940: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
9950: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 "-encoding", &up
9960: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
9970: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ng);. Tcl_Get
9980: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
9990: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 terp, chan, "-tr
99a0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 anslation", &upp
99b0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
99c0: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 tion);. Tcl_G
99d0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
99e0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
99f0: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 blocking", &uppe
9a00: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
9a10: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
9a20: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
9a30: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e rp, chan, "-tran
9a40: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 slation", "binar
9a50: 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 y");. Tcl_Set
9a60: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
9a70: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c terp, chan, "-bl
9a80: 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 ocking", "true")
9a90: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 ;. dprintf("C
9aa0: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 onsuming Tcl cha
9ab0: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 nnel %s", Tcl_Ge
9ac0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
9ad0: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 n));. statePt
9ae0: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 r->self = Tcl_St
9af0: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 ackChannel(inter
9b00: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 p, Tls_ChannelTy
9b10: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 pe(), (ClientDat
9b20: 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54 a) statePtr,..(T
9b30: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 CL_READABLE | TC
9b40: 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 L_WRITABLE), cha
9b50: 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 n);. dprintf(
9b60: 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c "Created channel
9b70: 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f named %s", Tcl_
9b80: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
9b90: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b tatePtr->self));
9ba0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
9bb0: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f r->self == (Tcl_
9bc0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
9bd0: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 ../*.. * No use
9be0: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c of Tcl_Eventuall
9bf0: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f yFree because no
9c00: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 possible Tcl_Pr
9c10: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c eserve... */..Tl
9c20: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
9c30: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 statePtr);..retu
9c40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
9c50: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 }.. Tcl_Set
9c60: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
9c70: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e terp, statePtr->
9c80: 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 self, "-translat
9c90: 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e ion", Tcl_DStrin
9ca0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
9cb0: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 nnelTranslation)
9cc0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
9cd0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
9ce0: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
9cf0: 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c lf, "-encoding",
9d00: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 Tcl_DStringValu
9d10: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 e(&upperChannelE
9d20: 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 ncoding));. T
9d30: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
9d40: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ion(interp, stat
9d50: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f ePtr->self, "-eo
9d60: 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 fchar", Tcl_DStr
9d70: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 ingValue(&upperC
9d80: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b hannelEOFChar));
9d90: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
9da0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
9db0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
9dc0: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 , "-blocking", T
9dd0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
9de0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f &upperChannelBlo
9df0: 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a cking));.. /*
9e00: 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 . * SSL Init
9e10: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 ialization.
9e20: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
9e30: 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 >ssl = SSL_new(s
9e40: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 tatePtr->ctx);.
9e50: 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72 if (!statePtr
9e60: 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c ->ssl) {../* SSL
9e70: 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a library error *
9e80: 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 /..Tcl_AppendRes
9e90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 ult(interp, "cou
9ea0: 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 ldn't construct
9eb0: 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 ssl session: ",
9ec0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
9ed0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9ee0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
9ef0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
9f00: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
9f10: 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 "INIT", "FAILED
9f20: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
9f30: 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 );..Tls_Free((ch
9f40: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
9f50: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
9f60: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
9f70: 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 * Set host serve
9f80: 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 r name */. if
9f90: 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a (servername) {.
9fa0: 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 ./* Sets the ser
9fb0: 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 ver name indicat
9fc0: 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 ion (SNI) in Cli
9fd0: 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 entHello extensi
9fe0: 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 on */../* Per RF
9ff0: 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 C 6066, hostname
a000: 20 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f is a ASCII enco
a010: 64 65 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 ded string, thou
a020: 67 68 20 52 46 43 20 34 33 36 36 20 73 61 79 73 gh RFC 4366 says
a030: 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 UTF-8. */..if (
a040: 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f !SSL_set_tlsext_
a050: 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 host_name(stateP
a060: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e tr->ssl, servern
a070: 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29 ame) && require)
a080: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
a090: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
a0a0: 20 22 53 65 74 20 53 4e 49 20 65 78 74 65 6e 73 "Set SNI extens
a0b0: 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 ion failed: ", G
a0c0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
a0d0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
a0e0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
a0f0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
a100: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
a110: 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c "SNI", "FAILED",
a120: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
a130: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
a140: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
a150: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
a160: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
a170: 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 * Set hostname f
a180: 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 69 63 or peer certific
a190: 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 ate hostname ver
a1a0: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 ification in cli
a1b0: 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 ents... Don't
a1c0: 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 use SSL_set1_hos
a1d0: 74 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c t since it has l
a1e0: 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 imitations. */..
a1f0: 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f if (!SSL_add1_ho
a200: 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c st(statePtr->ssl
a210: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b , servername)) {
a220: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
a230: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
a240: 53 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 Set DNS hostname
a250: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f failed: ", GET_
a260: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
a270: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
a280: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
a290: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
a2a0: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f ", "IMPORT", "HO
a2b0: 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 STNAME", "FAILED
a2c0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
a2d0: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 );.. Tls_Free
a2e0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
a2f0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
a300: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
a310: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 }.. /* Res
a320: 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a ume session id *
a330: 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f /. if (sessio
a340: 6e 5f 69 64 20 26 26 20 73 65 73 73 5f 6c 65 6e n_id && sess_len
a350: 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f <= SSL_MAX_SID_
a360: 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f CTX_LENGTH) {../
a370: 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f * SSL_set_sessio
a380: 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c n() */..if (!SSL
a390: 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 _SESSION_set1_id
a3a0: 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 _context(SSL_get
a3b0: 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 _session(statePt
a3c0: 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e r->ssl), session
a3d0: 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 _id, (unsigned i
a3e0: 6e 74 29 20 73 65 73 73 5f 6c 65 6e 29 29 20 7b nt) sess_len)) {
a3f0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
a400: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
a410: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66 Resume session f
a420: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 ailed: ", GET_ER
a430: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
a440: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
a450: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 Tcl_SetErrorCod
a460: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
a470: 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 "IMPORT", "SESS
a480: 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 ION", "FAILED",
a490: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
a4a0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
a4b0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
a4c0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
a4d0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 L_ERROR;..}.
a4e0: 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 }.. /* Enable
a4f0: 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 Application-Lay
a500: 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f er Protocol Nego
a510: 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 tiation. Example
a520: 73 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c s are: http/1.0,
a530: 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 ..http/1.1, h2,
a540: 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 h3, ftp, imap, p
a550: 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 op3, xmpp-client
a560: 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d , xmpp-server, m
a570: 71 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a qtt, irc, etc. *
a580: 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 4f 62 /. if (alpnOb
a590: 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a j != NULL) {../*
a5a0: 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 6c Convert a TCL l
a5b0: 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f ist into a proto
a5c0: 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 col-list in wire
a5d0: 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 -format */..unsi
a5e0: 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f gned char *proto
a5f0: 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 s, *p;..unsigned
a600: 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 int protos_len
a610: 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 63 = 0;..Tcl_Size c
a620: 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 nt, i;..int j;..
a630: 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a Tcl_Obj **list;.
a640: 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 ..if (Tcl_ListOb
a650: 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 jGetElements(int
a660: 65 72 70 2c 20 61 6c 70 6e 4f 62 6a 2c 20 26 63 erp, alpnObj, &c
a670: 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43 nt, &list) != TC
a680: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 L_OK) {.. Tls
a690: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
a6a0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
a6b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
a6c0: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 ..}.../* Determi
a6d0: 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 ne the memory re
a6e0: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 quired for the p
a6f0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a rotocol-list */.
a700: 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c .for (i = 0; i <
a710: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 cnt; i++) {..
a720: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 Tcl_GetStringF
a730: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 romObj(list[i],
a740: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 &len);.. if (
a750: 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 len > 255) {...T
a760: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
a770: 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 interp, "ALPN pr
a780: 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f otocol names too
a790: 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 long", (char *)
a7a0: 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 NULL);...Tcl_Se
a7b0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
a7c0: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
a7d0: 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 T", "ALPN", "FAI
a7e0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
a7f0: 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 ULL);...Tls_Free
a800: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
a810: 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 tr);...return TC
a820: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
a830: 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 . protos_len
a840: 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e += 1 + (int) len
a850: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 ;..}.../* Build
a860: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f the complete pro
a870: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 tocol-list */..p
a880: 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 rotos = ckalloc(
a890: 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a protos_len);../*
a8a0: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 protocol-lists
a8b0: 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 consist of 8-bit
a8c0: 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 length-prefixed
a8d0: 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a , byte strings *
a8e0: 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70 /..for (j = 0, p
a8f0: 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 = protos; j < c
a900: 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 nt; j++) {..
a910: 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f char *str = Tcl_
a920: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
a930: 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b (list[j], &len);
a940: 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e .. *p++ = (un
a950: 73 69 67 6e 65 64 20 63 68 61 72 29 20 6c 65 6e signed char) len
a960: 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c ;.. memcpy(p,
a970: 20 73 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c str, (size_t) l
a980: 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c en);.. p += l
a990: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f en;..}.../* SSL_
a9a0: 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 set_alpn_protos
a9b0: 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 makes a copy of
a9c0: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 the protocol-lis
a9d0: 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 t */../* Note: T
a9e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 his functions re
a9f0: 76 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72 verses the retur
aa00: 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 n value conventi
aa10: 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 on */..if (SSL_s
aa20: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 et_alpn_protos(s
aa30: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 tatePtr->ssl, pr
aa40: 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e otos, protos_len
aa50: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
aa60: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
aa70: 70 2c 20 22 53 65 74 20 41 4c 50 4e 20 70 72 6f p, "Set ALPN pro
aa80: 74 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a 20 22 tocols failed: "
aa90: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
aaa0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
aab0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
aac0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
aad0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
aae0: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c ", "ALPN", "FAIL
aaf0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
ab00: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
ab10: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
ab20: 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 ePtr);.. ckfr
ab30: 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 ee(protos);..
ab40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
ab50: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 R;..}.../* Store
ab60: 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 protocols list
ab70: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 */..statePtr->pr
ab80: 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 otos = protos;..
ab90: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
aba0: 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 _len = protos_le
abb0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a n;. } else {.
abc0: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
abd0: 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 s = NULL;..state
abe0: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 Ptr->protos_len
abf0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 = 0;. }..
ac00: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 /*. * SSL Ca
ac10: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a llbacks. */.
ac20: 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f SSL_set_app_
ac30: 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 data(statePtr->s
ac40: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 sl, (void *)stat
ac50: 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 ePtr);./* point
ac60: 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 0a 20 back to us */..
ac70: 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 SSL_set_verif
ac80: 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c y(statePtr->ssl,
ac90: 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 verify, VerifyC
aca0: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 allback);. SS
acb0: 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 L_set_info_callb
acc0: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ack(statePtr->ss
acd0: 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 l, InfoCallback)
ace0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 ;.. /* Callba
acf0: 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 ck for observing
ad00: 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 protocol messag
ad10: 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 es */.#ifndef OP
ad20: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 ENSSL_NO_SSL_TRA
ad30: 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 CE. /* void S
ad40: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 SL_CTX_set_msg_c
ad50: 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 allback_arg(stat
ad60: 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 ePtr->ctx, (void
ad70: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 *)statePtr);.
ad80: 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 void SSL_CTX_s
ad90: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 et_msg_callback(
ada0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d statePtr->ctx, M
adb0: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b essageCallback);
adc0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f */. SSL_set_
add0: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 msg_callback_arg
ade0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
adf0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
ae00: 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d );. SSL_set_m
ae10: 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 sg_callback(stat
ae20: 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 ePtr->ssl, Messa
ae30: 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e geCallback);.#en
ae40: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 dif.. /* Crea
ae50: 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 te Tcl_Channel B
ae60: 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 IO Handler */.
ae70: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 statePtr->p_bi
ae80: 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 o.= BIO_new_tcl(
ae90: 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f statePtr, BIO_NO
aea0: 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 CLOSE);. stat
aeb0: 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f ePtr->bio.= BIO_
aec0: 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 new(BIO_f_ssl())
aed0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 ;.. if (serve
aee0: 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 r) {../* Server
aef0: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 callbacks */..SS
af00: 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 L_CTX_set_tlsext
af10: 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 _servername_arg(
af20: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 statePtr->ctx, (
af30: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
af40: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 ;..SSL_CTX_set_t
af50: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 lsext_servername
af60: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 _callback(stateP
af70: 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c tr->ctx, SNICall
af80: 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f back);..SSL_CTX_
af90: 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f set_client_hello
afa0: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
afb0: 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b x, HelloCallback
afc0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
afd0: 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50 tr);..if (stateP
afe0: 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 tr->protos != NU
aff0: 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 LL) {.. SSL_C
b000: 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 TX_set_alpn_sele
b010: 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e ct_cb(statePtr->
b020: 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 ctx, ALPNCallbac
b030: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 k, (void *)state
b040: 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45 Ptr);.#ifdef USE
b050: 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c _NPN.. if (tl
b060: 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 s1_2 == 0 && tls
b070: 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 1_3 == 0) {...SS
b080: 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 L_CTX_set_next_p
b090: 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64 rotos_advertised
b0a0: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
b0b0: 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 x, NPNCallback,
b0c0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
b0d0: 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 );.. }.#endif
b0e0: 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 ..}.../* Enable
b0f0: 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63 server to send c
b100: 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74 65 ert request afte
b110: 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 r handshake (TLS
b120: 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 1.3 only) */../
b130: 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 74 * A write operat
b140: 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c ion must take pl
b150: 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 74 ace for the Cert
b160: 69 66 69 63 61 74 65 20 52 65 71 75 65 73 74 20 ificate Request
b170: 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74 to be.. sent t
b180: 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 o the client, th
b190: 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 is can be done w
b1a0: 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 ith SSL_do_hands
b1b0: 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 hake(). */..if (
b1c0: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f request && post_
b1d0: 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c 73 handshake && tls
b1e0: 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 1_3) {.. SSL_
b1f0: 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f verify_client_po
b200: 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61 st_handshake(sta
b210: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a tePtr->ssl);..}.
b220: 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 ../* set automat
b230: 69 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 69 ic curve selecti
b240: 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 on */..SSL_set_e
b250: 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50 74 cdh_auto(statePt
b260: 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a r->ssl, 1);.../*
b270: 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65 Set server mode
b280: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 */..statePtr->f
b290: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f lags |= TLS_TCL_
b2a0: 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 SERVER;..SSL_set
b2b0: 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74 _accept_state(st
b2c0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
b2d0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 } else {../* C
b2e0: 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 lient callbacks
b2f0: 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 */.#ifdef USE_NP
b300: 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d N..if (statePtr-
b310: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 >protos != NULL
b320: 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 && tls1_2 == 0 &
b330: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b & tls1_3 == 0) {
b340: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
b350: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c t_next_proto_sel
b360: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d ect_cb(statePtr-
b370: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 >ctx, ALPNCallba
b380: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
b390: 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 ePtr);..}.#endif
b3a0: 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 .../* Session ca
b3b0: 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 ching */..SSL_CT
b3c0: 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 X_set_session_ca
b3d0: 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 che_mode(statePt
b3e0: 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 r->ctx, SSL_SESS
b3f0: 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 _CACHE_CLIENT |
b400: 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e SSL_SESS_CACHE_N
b410: 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 O_INTERNAL_STORE
b420: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 );..SSL_CTX_sess
b430: 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 _set_new_cb(stat
b440: 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 ePtr->ctx, Sessi
b450: 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f onCallback);.../
b460: 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 * Enable post ha
b470: 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69 ndshake Authenti
b480: 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e cation extension
b490: 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 . TLS 1.3 only,
b4a0: 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 not http/2. */..
b4b0: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 if (request && p
b4c0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b ost_handshake) {
b4d0: 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f .. SSL_set_po
b4e0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 st_handshake_aut
b4f0: 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c h(statePtr->ssl,
b500: 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 1);..}.../* Set
b510: 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a client mode */.
b520: 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 .SSL_set_connect
b530: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d _state(statePtr-
b540: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 >ssl);. }.
b550: 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 SSL_set_bio(sta
b560: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 tePtr->ssl, stat
b570: 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 ePtr->p_bio, sta
b580: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 tePtr->p_bio);.
b590: 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 BIO_set_ssl(s
b5a0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 tatePtr->bio, st
b5b0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f atePtr->ssl, BIO
b5c0: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 _NOCLOSE);..
b5d0: 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 /*. * End of
b5e0: 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a SSL Init. *
b5f0: 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 /. dprintf("R
b600: 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 eturning %s", Tc
b610: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
b620: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
b630: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 );. Tcl_SetRe
b640: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 sult(interp, (ch
b650: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 ar *) Tcl_GetCha
b660: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
b670: 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f r->self), TCL_VO
b680: 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 LATILE);.. re
b690: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
b6a0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
b6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
b6f0: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d UnimportObjCmd -
b700: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
b710: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
b720: 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 d to remove the
b730: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
b740: 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 filter.. *. * Re
b750: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
b760: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
b770: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
b780: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 cts:. *.May modi
b790: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 fy the behavior
b7a0: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c of an IO channel
b7b0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
b7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
b800: 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f tatic int.Unimpo
b810: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 rtObjCmd(ClientD
b820: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
b830: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
b840: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
b850: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
b860: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
b870: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
b880: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
b890: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
b8a0: 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 /. (void) cli
b8b0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 entData;.. dp
b8c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
b8d0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
b8e0: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 2) {..Tcl_Wron
b8f0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
b900: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
b910: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 el");..return TC
b920: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
b930: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
b940: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
b950: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 , Tcl_GetString(
b960: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b objv[1]), NULL);
b970: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
b980: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
b990: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
b9a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
b9b0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
b9c0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
b9d0: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
b9e0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
b9f0: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
ba00: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 nel(chan);..
ba10: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
ba20: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
ba30: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
ba40: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
ba50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
ba60: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
ba70: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
ba80: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
ba90: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
baa0: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 nel", NULL);..
bab0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
bac0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
bad0: 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 , "UNIMPORT", "C
bae0: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
baf0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
bb00: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
bb10: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
bb20: 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 if (Tcl_Unstac
bb30: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c kChannel(interp,
bb40: 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 chan) == TCL_ER
bb50: 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ROR) {..return T
bb60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
bb70: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
bb80: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
bb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bbd0: 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 . *. * CTX_Init
bbe0: 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 -- construct a S
bbf0: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a SL_CTX instance.
bc00: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
bc10: 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 *.A valid SSL_CT
bc20: 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 X instance or NU
bc30: 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 LL.. *. * Side e
bc40: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 ffects:. *.const
bc50: 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 ructs SSL contex
bc60: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d t (CTX). *. *---
bc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bcb0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f . */.static SSL_
bcc0: 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 CTX *.CTX_Init(S
bcd0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 tate *statePtr,
bce0: 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e int isServer, in
bcf0: 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b t proto, char *k
bd00: 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 eyfile, char *ce
bd10: 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 rtfile,. unsi
bd20: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 gned char *key,
bd30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 unsigned char *c
bd40: 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e ert, int key_len
bd50: 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 , int cert_len,
bd60: 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 20 char *CAdir,.
bd70: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 char *CAfile, c
bd80: 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 har *ciphers, ch
bd90: 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 ar *ciphersuites
bda0: 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 , int level, cha
bdb0: 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 r *DHparams) {.
bdc0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
bdd0: 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 nterp = statePtr
bde0: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 ->interp;. SS
bdf0: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c L_CTX *ctx = NUL
be00: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 L;. Tcl_DStri
be10: 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 ng ds;. Tcl_D
be20: 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 String ds1;.
be30: 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 int off = 0;.
be40: 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 int load_privat
be50: 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 e_key;. const
be60: 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 SSL_METHOD *met
be70: 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 hod;.. dprint
be80: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
be90: 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a if (!proto) {.
bea0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
beb0: 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 t(interp, "no va
bec0: 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c lid protocol sel
bed0: 65 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 ected", (char *)
bee0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
bef0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
bf00: 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 /* create SSL c
bf10: 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 ontext */.#if OP
bf20: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
bf30: 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 MBER >= 0x101000
bf40: 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 00L || defined(N
bf50: 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e O_SSL2) || defin
bf60: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
bf70: 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 L2). if (ENAB
bf80: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
bf90: 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 ROTO_SSL2)) {..T
bfa0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
bfb0: 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 interp, "SSL2 pr
bfc0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
bfd0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
bfe0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
bff0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
c000: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
c010: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
c020: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
c030: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 3). if (ENABL
c040: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
c050: 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 OTO_SSL3)) {..Tc
c060: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
c070: 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f nterp, "SSL3 pro
c080: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
c090: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ted", (char *) N
c0a0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
c0b0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
c0c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
c0d0: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 TLS1) || defined
c0e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
c0f0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
c100: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
c110: 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c TO_TLS1)) {..Tcl
c120: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
c130: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 terp, "TLS 1.0 p
c140: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
c150: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
c160: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
c170: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
c180: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
c190: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 O_TLS1_1) || def
c1a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
c1b0: 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 TLS1_1). if (
c1c0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
c1d0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 LS_PROTO_TLS1_1)
c1e0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
c1f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 esult(interp, "T
c200: 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 LS 1.1 protocol
c210: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
c220: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
c230: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
c240: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 }.#endif.#if d
c250: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
c260: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
c270: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a NSSL_NO_TLS1_2).
c280: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 if (ENABLED(
c290: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
c2a0: 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c _TLS1_2)) {..Tcl
c2b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
c2c0: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 terp, "TLS 1.2 p
c2d0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
c2e0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
c2f0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
c300: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
c310: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
c320: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 O_TLS1_3) || def
c330: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
c340: 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 TLS1_3). if (
c350: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
c360: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
c370: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
c380: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 esult(interp, "T
c390: 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 LS 1.3 protocol
c3a0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
c3b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
c3c0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
c3d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 }.#endif. i
c3e0: 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b f (proto == 0) {
c3f0: 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 ../* Use full ra
c400: 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f nge */..SSL_CTX_
c410: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 set_min_proto_ve
c420: 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 rsion(ctx, 0);..
c430: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f SSL_CTX_set_max_
c440: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
c450: 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 x, 0);. }..
c460: 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 switch (proto)
c470: 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 {.#if OPENSSL_V
c480: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
c490: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 0x10100000L && !
c4a0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
c4b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
c4c0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 NSSL_NO_SSL2).
c4d0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
c4e0: 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d _SSL2:..method =
c4f0: 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 isServer ? SSLv
c500: 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 2_server_method(
c510: 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 ) : SSLv2_client
c520: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
c530: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
c540: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
c550: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
c560: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 SSL_NO_SSL3) &&
c570: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
c580: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 _NO_SSL3_METHOD)
c590: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
c5a0: 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f OTO_SSL3:..metho
c5b0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 d = isServer ? S
c5c0: 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 SLv3_server_meth
c5d0: 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 od() : SSLv3_cli
c5e0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
c5f0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
c600: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
c610: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
c620: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 PENSSL_NO_TLS1)
c630: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
c640: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 SSL_NO_TLS1_METH
c650: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 OD). case TLS
c660: 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 _PROTO_TLS1:..me
c670: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
c680: 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d ? TLSv1_server_m
c690: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f ethod() : TLSv1_
c6a0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
c6b0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
c6c0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
c6d0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
c6e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
c6f0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
c700: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
c710: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_1_METHOD).
c720: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
c730: 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 TLS1_1:..method
c740: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 = isServer ? TLS
c750: 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 v1_1_server_meth
c760: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 od() : TLSv1_1_c
c770: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
c780: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
c790: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
c7a0: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
c7b0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
c7c0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
c7d0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
c7e0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_2_METHOD).
c7f0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
c800: 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d LS1_2:..method =
c810: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
c820: 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 1_2_server_metho
c830: 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c d() : TLSv1_2_cl
c840: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
c850: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
c860: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
c870: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
c880: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
c890: 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 1_3). case TL
c8a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a S_PROTO_TLS1_3:.
c8b0: 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 ./* Use the gene
c8c0: 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 ric method and c
c8d0: 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 onstraint range
c8e0: 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 after context is
c8f0: 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 created */..met
c900: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
c910: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 TLS_server_meth
c920: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e od() : TLS_clien
c930: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
c940: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 ak;.#endif. d
c950: 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f efault:../* Nego
c960: 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 tiate highest av
c970: 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 ailable SSL/TLS
c980: 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 version */..meth
c990: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
c9a0: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f TLS_server_metho
c9b0: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 d() : TLS_client
c9c0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f _method();.#if O
c9d0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
c9e0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
c9f0: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 00L && !defined(
ca00: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 NO_SSL2) && !def
ca10: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
ca20: 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 SSL2)..off |= (E
ca30: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
ca40: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 S_PROTO_SSL2)
ca50: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
ca60: 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 SSLv2);.#endif.#
ca70: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 if !defined(NO_S
ca80: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
ca90: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
caa0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
cab0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
cac0: 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 OTO_SSL3) ? 0
cad0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 : SSL_OP_NO_SSLv
cae0: 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 3);.#endif.#if !
caf0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
cb00: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
cb10: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f NSSL_NO_TLS1)..o
cb20: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
cb30: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
cb40: 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 TLS1) ? 0 : SS
cb50: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a L_OP_NO_TLSv1);.
cb60: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
cb70: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 ned(NO_TLS1_1) &
cb80: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
cb90: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f SL_NO_TLS1_1)..o
cba0: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
cbb0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
cbc0: 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 TLS1_1) ? 0 : SS
cbd0: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 L_OP_NO_TLSv1_1)
cbe0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
cbf0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
cc00: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
cc10: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a NSSL_NO_TLS1_2).
cc20: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
cc30: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
cc40: 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 O_TLS1_2) ? 0 :
cc50: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f SSL_OP_NO_TLSv1_
cc60: 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 2);.#endif.#if !
cc70: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
cc80: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
cc90: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
cca0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
ccb0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
ccc0: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 OTO_TLS1_3) ? 0
ccd0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
cce0: 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 1_3);.#endif..br
ccf0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 eak;. }..
cd00: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
cd10: 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 );.. ctx = SS
cd20: 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 L_CTX_new(method
cd30: 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 );. if (!ctx)
cd40: 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 {..return(NULL)
cd50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
cd60: 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f (getenv(SSLKEYLO
cd70: 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 GFILE)) {..SSL_C
cd80: 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 TX_set_keylog_ca
cd90: 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c llback(ctx, KeyL
cda0: 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 ogCallback);.
cdb0: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 }..#if !defined
cdc0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 (NO_TLS1_3) && !
cdd0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
cde0: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 NO_TLS1_3). i
cdf0: 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f f (proto == TLS_
ce00: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a PROTO_TLS1_3) {.
ce10: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e .SSL_CTX_set_min
ce20: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
ce30: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 tx, TLS1_3_VERSI
ce40: 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 ON);..SSL_CTX_se
ce50: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 t_max_proto_vers
ce60: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
ce70: 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a VERSION);. }.
ce80: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 #endif.. /* F
ce90: 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 orce cipher sele
cea0: 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 ction order by s
ceb0: 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 erver */. if
cec0: 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 (!isServer) {..S
ced0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
cee0: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 ns(ctx, SSL_OP_C
cef0: 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 IPHER_SERVER_PRE
cf00: 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a FERENCE);. }.
cf10: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
cf20: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
cf30: 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 10100000L. Op
cf40: 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c enSSL_add_all_al
cf50: 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c gorithms(); /* L
cf60: 6f 61 64 20 63 69 70 68 65 72 73 20 61 6e 64 20 oad ciphers and
cf70: 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69 digests */.#endi
cf80: 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 f.. SSL_CTX_s
cf90: 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c et_app_data(ctx,
cfa0: 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b (void*)interp);
cfb0: 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 ./* remember the
cfc0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a interpreter */.
cfd0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
cfe0: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c options(ctx, SSL
cff0: 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c _OP_ALL);./* all
d000: 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f SSL bug workaro
d010: 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f unds */. SSL_
d020: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
d030: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 ctx, SSL_OP_NO_C
d040: 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 OMPRESSION);./*
d050: 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 disable compress
d060: 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 ion even if supp
d070: 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c orted */. SSL
d080: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
d090: 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 (ctx, off);../*
d0a0: 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c disable protocol
d0b0: 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 versions */.#if
d0c0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
d0d0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
d0e0: 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 1000L. SSL_CT
d0f0: 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 X_set_mode(ctx,
d100: 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 SSL_MODE_AUTO_RE
d110: 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 TRY);./* handle
d120: 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 new handshakes i
d130: 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e n background. On
d140: 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f by default in O
d150: 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f penSSL 1.1.1. */
d160: 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f .#endif. SSL_
d170: 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 CTX_sess_set_cac
d180: 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 he_size(ctx, 128
d190: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 );.. /* Set u
d1a0: 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 ser defined ciph
d1b0: 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 ers, cipher suit
d1c0: 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 es, and security
d1d0: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 level */. if
d1e0: 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 ((ciphers != NU
d1f0: 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f LL) && !SSL_CTX_
d200: 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 set_cipher_list(
d210: 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b ctx, ciphers)) {
d220: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
d230: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 lt(interp, "Set
d240: 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 ciphers failed:
d250: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 No valid ciphers
d260: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
d270: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
d280: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e (ctx);..return N
d290: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
d2a0: 66 20 28 28 63 69 70 68 65 72 73 75 69 74 65 73 f ((ciphersuites
d2b0: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 != NULL) && !SS
d2c0: 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 L_CTX_set_cipher
d2d0: 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 suites(ctx, ciph
d2e0: 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 ersuites)) {..Tc
d2f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d300: 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 nterp, "Set ciph
d310: 65 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 er suites failed
d320: 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 : No valid ciphe
d330: 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 rs", (char *) NU
d340: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 LL);..SSL_CTX_fr
d350: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e ee(ctx);..return
d360: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
d370: 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 /* Set securit
d380: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 y level */. i
d390: 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 f (level > -1 &&
d3a0: 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f level < 6) {../
d3b0: 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 * SSL_set_securi
d3c0: 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c ty_level */..SSL
d3d0: 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 _CTX_set_securit
d3e0: 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 y_level(ctx, lev
d3f0: 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 el);. }..
d400: 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c /* set some call
d410: 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c backs */. SSL
d420: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 _CTX_set_default
d430: 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 _passwd_cb(ctx,
d440: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b PasswordCallback
d450: 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 );. SSL_CTX_s
d460: 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 et_default_passw
d470: 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 d_cb_userdata(ct
d480: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 x, (void *)state
d490: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 Ptr);.. /* re
d4a0: 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c ad a Diffie-Hell
d4b0: 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 man parameters f
d4c0: 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 ile, or use the
d4d0: 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a built-in one */.
d4e0: 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e #ifdef OPENSSL_N
d4f0: 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 O_DH. if (DHp
d500: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b arams != NULL) {
d510: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
d520: 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 lt(interp, "DH p
d530: 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 arameter support
d540: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c not available",
d550: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d560: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
d570: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
d580: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 L;. }.#else.
d590: 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 {..DH* dh;..i
d5a0: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e f (DHparams != N
d5b0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 ULL) {.. BIO
d5c0: 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 *bio;.. Tcl_D
d5d0: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b StringInit(&ds);
d5e0: 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f .. bio = BIO_
d5f0: 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 new_file(F2N(DHp
d600: 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 arams, &ds), "r"
d610: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f );.. if (!bio
d620: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
d630: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 gFree(&ds);...Tc
d640: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d650: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f nterp, "Could no
d660: 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 t find DH parame
d670: 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 ters file", (cha
d680: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
d690: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
d6a0: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
d6b0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 . }... dh
d6c0: 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 = PEM_read_bio_D
d6d0: 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c Hparams(bio, NUL
d6e0: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a L, NULL, NULL);.
d6f0: 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 . BIO_free(bi
d700: 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 o);.. Tcl_DSt
d710: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
d720: 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 if (!dh) {..
d730: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
d740: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 t(interp, "Could
d750: 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 not read DH par
d760: 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c ameters from fil
d770: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c e", (char *) NUL
d780: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
d790: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
d7a0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 n NULL;.. }..
d7b0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
d7c0: 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b tmp_dh(ctx, dh);
d7d0: 0a 09 20 20 20 20 44 48 5f 66 72 65 65 28 64 68 .. DH_free(dh
d7e0: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 );...} else {..
d7f0: 20 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b /* Use well k
d800: 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 74 65 nown DH paramete
d810: 72 73 20 74 68 61 74 20 68 61 76 65 20 62 75 69 rs that have bui
d820: 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 69 6e lt-in support in
d830: 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 OpenSSL */..
d840: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 if (!SSL_CTX_se
d850: 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 t_dh_auto(ctx, 1
d860: 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e )) {...Tcl_Appen
d870: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
d880: 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c "Could not enabl
d890: 65 20 73 65 74 20 44 48 20 61 75 74 6f 3a 20 22 e set DH auto: "
d8a0: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
d8b0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
d8c0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
d8d0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
d8e0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 n NULL;.. }..
d8f0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a }. }.#endif..
d900: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 /* set our c
d910: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 ertificate */.
d920: 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b load_private_k
d930: 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 ey = 0;. if (
d940: 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c certfile != NULL
d950: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 ) {..load_privat
d960: 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c e_key = 1;...Tcl
d970: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 _DStringInit(&ds
d980: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 );...if (SSL_CTX
d990: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 _use_certificate
d9a0: 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 _file(ctx, F2N(c
d9b0: 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 ertfile, &ds), S
d9c0: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 SL_FILETYPE_PEM)
d9d0: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 <= 0) {.. Tc
d9e0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
d9f0: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 s);.. Tcl_App
da00: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
da10: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 , "unable to set
da20: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c certificate fil
da30: 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 e ", certfile, "
da40: 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 : ",...GET_ERR_R
da50: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
da60: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 ) NULL);.. SS
da70: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
da80: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
da90: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 L;..}. } else
daa0: 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c if (cert != NUL
dab0: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 L) {..load_priva
dac0: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 te_key = 1;..if
dad0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 (SSL_CTX_use_cer
dae0: 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 tificate_ASN1(ct
daf0: 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 x, cert_len, cer
db00: 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 t) <= 0) {..
db10: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
db20: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 &ds);.. Tcl_A
db30: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
db40: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
db50: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 et certificate:
db60: 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 ",...GET_ERR_REA
db70: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
db80: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
db90: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
dba0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
dbb0: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ..}. } else {
dbc0: 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 ..certfile = (ch
dbd0: 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 ar*)X509_get_def
dbe0: 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 ault_cert_file()
dbf0: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f ;...if (SSL_CTX_
dc00: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f use_certificate_
dc10: 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 file(ctx, certfi
dc20: 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 le, SSL_FILETYPE
dc30: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 _PEM) <= 0) {.#i
dc40: 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 f 0.. Tcl_DSt
dc50: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
dc60: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
dc70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e sult(interp, "un
dc80: 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 able to use defa
dc90: 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20 ult certificate
dca0: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 file ", certfile
dcb0: 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 , ": ",...GET_ER
dcc0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
dcd0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
dce0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
dcf0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
dd00: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a NULL;.#endif..}.
dd10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 }.. /* se
dd20: 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 t our private ke
dd30: 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 y */. if (loa
dd40: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b d_private_key) {
dd50: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d ..if (keyfile ==
dd60: 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 NULL && key ==
dd70: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 NULL) {.. key
dd80: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b file = certfile;
dd90: 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c ..}...if (keyfil
dda0: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 e != NULL) {..
ddb0: 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 /* get the pri
ddc0: 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 vate key associa
ddd0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 ted with this ce
dde0: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 rtificate */..
ddf0: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d if (keyfile ==
de00: 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 NULL) {...keyfi
de10: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 le = certfile;..
de20: 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 }... if (
de30: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 SSL_CTX_use_Priv
de40: 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c ateKey_file(ctx,
de50: 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 F2N(keyfile, &d
de60: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 s), SSL_FILETYPE
de70: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 _PEM) <= 0) {...
de80: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
de90: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 &ds);.../* flush
dea0: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 the passphrase
deb0: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c which might be l
dec0: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c eft in the resul
ded0: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 t */...Tcl_SetRe
dee0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c sult(interp, NUL
def0: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a L, TCL_STATIC);.
df00: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
df10: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 lt(interp, "unab
df20: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 le to set public
df30: 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 key file ", key
df40: 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 20 20 20 file, " ",...
df50: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
df60: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
df70: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 );...SSL_CTX_fre
df80: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e e(ctx);...return
df90: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 NULL;.. }..
dfa0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
dfb0: 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 ee(&ds);...} els
dfc0: 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c e if (key != NUL
dfd0: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 L) {.. if (SS
dfe0: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 L_CTX_use_Privat
dff0: 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b eKey_ASN1(EVP_PK
e000: 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 EY_RSA, ctx, key
e010: 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 ,key_len) <= 0)
e020: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 {...Tcl_DStringF
e030: 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 ree(&ds);.../* f
e040: 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 lush the passphr
e050: 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 ase which might
e060: 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 be left in the r
e070: 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 esult */...Tcl_S
e080: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
e090: 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 NULL, TCL_STATI
e0a0: 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 C);...Tcl_Append
e0b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
e0c0: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 unable to set pu
e0d0: 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 45 54 blic key: ", GET
e0e0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
e0f0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
e100: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
e110: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c x);...return NUL
e120: 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a L;.. }..}../*
e130: 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 Now we know tha
e140: 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 t a key and cert
e150: 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 have been set a
e160: 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 gainst.. * the S
e170: 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 SL context */..i
e180: 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 f (!SSL_CTX_chec
e190: 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 k_private_key(ct
e1a0: 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 x)) {.. Tcl_A
e1b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
e1c0: 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79 rp, "private key
e1d0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 does not match
e1e0: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
e1f0: 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 public key",....
e200: 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 (char *) NU
e210: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
e220: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
e230: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 return NULL;..
e240: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
e250: 53 65 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e Set verification
e260: 20 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f CAs */. Tcl_
e270: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
e280: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
e290: 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 gInit(&ds1);.
e2a0: 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 /* There is one
e2b0: 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f default directo
e2c0: 72 79 2c 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 ry, one default
e2d0: 66 69 6c 65 2c 20 61 6e 64 20 6f 6e 65 20 64 65 file, and one de
e2e0: 66 61 75 6c 74 20 73 74 6f 72 65 2e 0a 09 54 68 fault store...Th
e2f0: 65 20 64 65 66 61 75 6c 74 20 43 41 20 63 65 72 e default CA cer
e300: 74 69 66 69 63 61 74 65 73 20 64 69 72 65 63 74 tificates direct
e310: 6f 72 79 20 28 61 6e 64 20 64 65 66 61 75 6c 74 ory (and default
e320: 20 73 74 6f 72 65 29 20 69 73 20 69 6e 20 74 68 store) is in th
e330: 65 20 4f 70 65 6e 53 53 4c 0a 09 63 65 72 74 73 e OpenSSL..certs
e340: 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20 63 directory. It c
e350: 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e an be overridden
e360: 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 by the SSL_CERT
e370: 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68 _DIR env var. Th
e380: 65 0a 09 64 65 66 61 75 6c 74 20 43 41 20 63 65 e..default CA ce
e390: 72 74 69 66 69 63 61 74 65 73 20 66 69 6c 65 20 rtificates file
e3a0: 69 73 20 63 61 6c 6c 65 64 20 63 65 72 74 2e 70 is called cert.p
e3b0: 65 6d 20 69 6e 20 74 68 65 20 64 65 66 61 75 6c em in the defaul
e3c0: 74 20 4f 70 65 6e 53 53 4c 0a 09 64 69 72 65 63 t OpenSSL..direc
e3d0: 74 6f 72 79 2e 20 49 74 20 63 61 6e 20 62 65 20 tory. It can be
e3e0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 overridden by th
e3f0: 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 e SSL_CERT_FILE
e400: 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 09 2f 2a 20 env var. */../*
e410: 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f int SSL_CTX_set_
e420: 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 64 default_verify_d
e430: 69 72 28 53 53 4c 5f 43 54 58 20 2a 63 74 78 29 ir(SSL_CTX *ctx)
e440: 20 61 6e 64 20 69 6e 74 20 53 53 4c 5f 43 54 58 and int SSL_CTX
e450: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 _set_default_ver
e460: 69 66 79 5f 66 69 6c 65 28 53 53 4c 5f 43 54 58 ify_file(SSL_CTX
e470: 20 2a 63 74 78 29 20 2a 2f 0a 20 20 20 20 69 66 *ctx) */. if
e480: 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f (!SSL_CTX_load_
e490: 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 verify_locations
e4a0: 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 (ctx, F2N(CAfile
e4b0: 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 64 69 , &ds), F2N(CAdi
e4c0: 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 r, &ds1)) ||..!S
e4d0: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 SL_CTX_set_defau
e4e0: 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 lt_verify_paths(
e4f0: 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 ctx)) {.#if 0..T
e500: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
e510: 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e ds);..Tcl_DStrin
e520: 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a gFree(&ds1);../*
e530: 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 Don't currently
e540: 20 63 61 72 65 20 69 66 20 74 68 69 73 20 66 61 care if this fa
e550: 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 ils */..Tcl_Appe
e560: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
e570: 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76 65 "SSL default ve
e580: 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c 20 47 rify paths: ", G
e590: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
e5a0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
e5b0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
e5c0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
e5d0: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a L;.#endif. }.
e5e0: 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f . /* https://
e5f0: 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f sourceforge.net/
e600: 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a p/tls/bugs/57/ *
e610: 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 /. /* XXX:TOD
e620: 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 O: Let the user
e630: 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 supply values he
e640: 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f re instead of so
e650: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 mething that exi
e660: 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 sts on the files
e670: 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 ystem */. if
e680: 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 (CAfile != NULL)
e690: 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 {..STACK_OF(X50
e6a0: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 9_NAME) *certNam
e6b0: 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c es = SSL_load_cl
e6c0: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e ient_CA_file(F2N
e6d0: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a (CAfile, &ds));.
e6e0: 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 .if (certNames !
e6f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 = NULL) {.. S
e700: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
e710: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 t_CA_list(ctx, c
e720: 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 ertNames);..}.
e730: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
e740: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 ringFree(&ds);.
e750: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
e760: 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65 ee(&ds1);. re
e770: 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a turn ctx;.}.../*
e780: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
e790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e7c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 ------. *. * Sta
e7d0: 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 tusObjCmd -- ret
e7e0: 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 urn certificate
e7f0: 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 for connected pe
e800: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
e810: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
e820: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
e830: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
e840: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
e850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e890: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
e8a0: 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 t.StatusObjCmd(C
e8b0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
e8c0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
e8d0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
e8e0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
e8f0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
e900: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
e910: 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 ;. X509 *peer
e920: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f ;. Tcl_Obj *o
e930: 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 bjPtr;. Tcl_C
e940: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 hannel chan;.
e950: 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 char *channelNa
e960: 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 me, *ciphers;.
e970: 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 int mode;.
e980: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
e990: 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 har *proto;.
e9a0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e unsigned int len
e9b0: 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 ;. int nid, r
e9c0: 65 73 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 es;. (void) c
e9d0: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 lientData;..
e9e0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
e9f0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
ea00: 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 < 2 || objc > 3
ea10: 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 || (objc == 3 &
ea20: 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 & !strcmp(Tcl_Ge
ea30: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 tString(objv[1])
ea40: 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a , "-local"))) {.
ea50: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
ea60: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
ea70: 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 v, "?-local? cha
ea80: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 nnel");..return
ea90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
eaa0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 .. /* Get cha
eab0: 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 nnel Id */. c
eac0: 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c hannelName = Tcl
ead0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
eae0: 6a 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 j(objv[(objc ==
eaf0: 32 20 3f 20 31 20 3a 20 32 29 5d 2c 20 28 54 63 2 ? 1 : 2)], (Tc
eb00: 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 3b l_Size *) NULL);
eb10: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
eb20: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
eb30: 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 p, channelName,
eb40: 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 &mode);. if (
eb50: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
eb60: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
eb70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
eb80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
eb90: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
eba0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
ebb0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
ebc0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
ebd0: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
ebe0: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 ;. if (Tcl_Ge
ebf0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
ec00: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
ec10: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f lType()) {..Tcl_
ec20: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
ec30: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
ec40: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
ec50: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
ec60: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c ..."\": not a TL
ec70: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c S channel", NULL
ec80: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
ec90: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
eca0: 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43 S", "STATUS", "C
ecb0: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
ecc0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
ecd0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
ece0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
ecf0: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
ed00: 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 te *) Tcl_GetCha
ed10: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
ed20: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 (chan);.. /*
ed30: 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 Get certificate
ed40: 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 for peer or self
ed50: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */. if (objc
ed60: 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d == 2) {..peer =
ed70: 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 SSL_get_peer_ce
ed80: 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 rtificate(stateP
ed90: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 tr->ssl);. }
eda0: 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 else {..peer = S
edb0: 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 SL_get_certifica
edc0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
edd0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
ede0: 20 47 65 74 20 58 35 30 39 20 63 65 72 74 69 66 Get X509 certif
edf0: 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 icate info */.
ee00: 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f if (peer) {..o
ee10: 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 bjPtr = Tls_NewX
ee20: 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 509Obj(interp, p
ee30: 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 eer);..if (objc
ee40: 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30 == 2) {.. X50
ee50: 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20 9_free(peer);..
ee60: 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a peer = NULL;.
ee70: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a .}. } else {.
ee80: 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 .objPtr = Tcl_Ne
ee90: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
eea0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
eeb0: 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 Peer name */.
eec0: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
eed0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 terp, objPtr, "p
eee0: 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 eername", SSL_ge
eef0: 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74 t0_peername(stat
ef00: 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b ePtr->ssl), -1);
ef10: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 . LAPPEND_INT
ef20: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
ef30: 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 "sbits", SSL_ge
ef40: 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 t_cipher_bits(st
ef50: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c atePtr->ssl, NUL
ef60: 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 L));.. cipher
ef70: 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 s = (char*)SSL_g
ef80: 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 et_cipher(stateP
ef90: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 tr->ssl);. LA
efa0: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
efb0: 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 , objPtr, "ciphe
efc0: 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29 r", ciphers, -1)
efd0: 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 ;.. /* Verify
efe0: 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66 the X509 certif
eff0: 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20 icate presented
f000: 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 by the peer */.
f010: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
f020: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
f030: 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 verifyResult",..
f040: 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 X509_verify_cert
f050: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 _error_string(SS
f060: 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 L_get_verify_res
f070: 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ult(statePtr->ss
f080: 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f l)), -1);.. /
f090: 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f * Verify mode */
f0a0: 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f . mode = SSL_
f0b0: 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 get_verify_mode(
f0c0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
f0d0: 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20 if (mode &&
f0e0: 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 SSL_VERIFY_NONE)
f0f0: 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 {..LAPPEND_STR(
f100: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f110: 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e "verifyMode", "n
f120: 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d one", -1);. }
f130: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a else {..Tcl_Obj
f140: 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 *listObjPtr = T
f150: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
f160: 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 NULL);..if (mod
f170: 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f e && SSL_VERIFY_
f180: 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c PEER) {.. Tcl
f190: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
f1a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 ement(interp, li
f1b0: 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 stObjPtr, Tcl_Ne
f1c0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 wStringObj("peer
f1d0: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 ", -1));..}..if
f1e0: 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 (mode && SSL_VER
f1f0: 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 IFY_FAIL_IF_NO_P
f200: 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 EER_CERT) {..
f210: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
f220: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f230: 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 , listObjPtr, Tc
f240: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
f250: 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 fail if no peer
f260: 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a cert", -1));..}.
f270: 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c .if (mode && SSL
f280: 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f _VERIFY_CLIENT_O
f290: 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f NCE) {.. Tcl_
f2a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
f2b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
f2c0: 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
f2d0: 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e StringObj("clien
f2e0: 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 t once", -1));..
f2f0: 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 }..if (mode && S
f300: 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 SL_VERIFY_POST_H
f310: 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 ANDSHAKE) {..
f320: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
f330: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
f340: 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 , listObjPtr, Tc
f350: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
f360: 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c post handshake",
f370: 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 -1));..}..LAPPE
f380: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f ND_OBJ(interp, o
f390: 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f bjPtr, "verifyMo
f3a0: 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 de", listObjPtr)
f3b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 . }.. /* V
f3c0: 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68 erify mode depth
f3d0: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f */. LAPPEND_
f3e0: 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
f3f0: 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68 tr, "verifyDepth
f400: 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 ", SSL_get_verif
f410: 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72 y_depth(statePtr
f420: 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a ->ssl));.. /*
f430: 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 Report the sele
f440: 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 cted protocol as
f450: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 a result of the
f460: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a negotiation */.
f470: 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 SSL_get0_alp
f480: 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 n_selected(state
f490: 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f Ptr->ssl, &proto
f4a0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 , &len);. LAP
f4b0: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
f4c0: 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c objPtr, "alpn",
f4d0: 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 (char *)proto,
f4e0: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b (Tcl_Size) len);
f4f0: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
f500: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f510: 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c "protocol", SSL
f520: 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 _get_version(sta
f530: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 tePtr->ssl), -1)
f540: 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 ;.. /* Valid
f550: 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e for non-RSA sign
f560: 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e ature and TLS 1.
f570: 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 3 */. if (obj
f580: 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d c == 2) {..res =
f590: 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 SSL_get_peer_si
f5a0: 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 gnature_nid(stat
f5b0: 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 ePtr->ssl, &nid)
f5c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
f5d0: 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 res = SSL_get_si
f5e0: 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 gnature_nid(stat
f5f0: 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 ePtr->ssl, &nid)
f600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
f610: 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d !res) {nid = 0;}
f620: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
f630: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
f640: 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 "signatureHashA
f650: 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e lgorithm", OBJ_n
f660: 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b id2ln(nid), -1);
f670: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d .. if (objc =
f680: 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 = 2) {..res = SS
f690: 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 L_get_peer_signa
f6a0: 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 ture_type_nid(st
f6b0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
f6c0: 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b d);. } else {
f6d0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f ..res = SSL_get_
f6e0: 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e signature_type_n
f6f0: 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c id(statePtr->ssl
f700: 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 , &nid);. }.
f710: 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 if (!res) {ni
f720: 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 d = 0;}. LAPP
f730: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
f740: 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 objPtr, "signatu
f750: 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 reType", OBJ_nid
f760: 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 2ln(nid), -1);..
f770: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
f780: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
f790: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
f7a0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
f7b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
f7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f7f0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e -----. *. * Conn
f800: 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 ectionInfoObjCmd
f810: 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 -- return conne
f820: 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 ction info from
f830: 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 OpenSSL.. *. * R
f840: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 esults:. *.A lis
f850: 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 t of connection
f860: 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d info. *. *-----
f870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
f8b0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 */..static int C
f8c0: 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a onnectionInfoObj
f8d0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
f8e0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
f8f0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
f900: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
f910: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
f920: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
f930: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
f940: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
f950: 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 mode on */.
f960: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
f970: 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 ../* client stat
f980: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 e for ssl socket
f990: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
f9a0: 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 *objPtr, *listPt
f9b0: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c r;. const SSL
f9c0: 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 *ssl;. const
f9d0: 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 SSL_CIPHER *cip
f9e0: 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 her;. const S
f9f0: 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 SL_SESSION *sess
fa00: 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 ion;. const E
fa10: 56 50 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 28 VP_MD *md;. (
fa20: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
fa30: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
fa40: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
fa50: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
fa60: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
fa70: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 nel");..return(T
fa80: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
fa90: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c .. chan = Tcl
faa0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
fab0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e rp, Tcl_GetStrin
fac0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d gFromObj(objv[1]
fad0: 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e , (Tcl_Size *) N
fae0: 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 ULL), NULL);.
faf0: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
fb00: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
fb10: 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 {..return(TCL_E
fb20: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 RROR);. }..
fb30: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 /* Make sure t
fb40: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
fb50: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
fb60: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 */. chan = T
fb70: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
fb80: 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 (chan);. if (
fb90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
fba0: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
fbb0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
fbc0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
fbd0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 lt(interp, "bad
fbe0: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c channel \"", Tcl
fbf0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
fc00: 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a chan),.. "\":
fc10: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
fc20: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c el", NULL);..Tcl
fc30: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
fc40: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f terp, "TLS", "CO
fc50: 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e NNECTION", "CHAN
fc60: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c NEL", "INVALID",
fc70: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
fc80: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
fc90: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
fca0: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
fcb0: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
fcc0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 ;.. /* Connec
fcd0: 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 tion info */.
fce0: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
fcf0: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
fd00: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
fd10: 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d chan);. ssl =
fd20: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a statePtr->ssl;.
fd30: 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e if (ssl != N
fd40: 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 ULL) {../* conne
fd50: 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 ction state */..
fd60: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
fd70: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 rp, objPtr, "sta
fd80: 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 te", SSL_state_s
fd90: 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c tring_long(ssl),
fda0: 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 -1);.../* Get S
fdb0: 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65 72 NI requested ser
fdc0: 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 ver name */..LAP
fdd0: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
fde0: 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 objPtr, "server
fdf0: 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 name", SSL_get_s
fe00: 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 ervername(ssl, T
fe10: 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 LSEXT_NAMETYPE_h
fe20: 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a ost_name), -1);.
fe30: 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f ../* Get protoco
fe40: 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 l */..LAPPEND_ST
fe50: 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
fe60: 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 , "protocol", SS
fe70: 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 L_get_version(ss
fe80: 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 l), -1);.../* Re
fe90: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f negotiation allo
fea0: 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f wed */..LAPPEND_
feb0: 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
fec0: 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 Ptr, "renegotiat
fed0: 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 ion_allowed", SS
fee0: 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e L_get_secure_ren
fef0: 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f egotiation_suppo
ff00: 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c 29 29 rt((SSL *) ssl))
ff10: 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 ;.../* Get secur
ff20: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 ity level */..LA
ff30: 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
ff40: 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72 , objPtr, "secur
ff50: 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f ity_level", SSL_
ff60: 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 get_security_lev
ff70: 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 el(ssl));.../* S
ff80: 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 ession info */..
ff90: 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
ffa0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
ffb0: 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 ssion_reused", S
ffc0: 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 SL_session_reuse
ffd0: 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 d(ssl));.../* Is
ffe0: 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a server info */.
fff0: 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
10000 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 terp, objPtr, "i
10010 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 s_server", SSL_i
10020 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a s_server(ssl));.
10030 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a ../* Is DTLS */.
10040 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
10050 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 terp, objPtr, "i
10060 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f s_dtls", SSL_is_
10070 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 20 dtls(ssl));.
10080 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72 }.. /* Cipher
10090 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 info */. cip
100a0 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 her = SSL_get_cu
100b0 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c rrent_cipher(ssl
100c0 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 );. if (ciphe
100d0 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 r != NULL) {..ch
100e0 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d ar buf[BUFSIZ] =
100f0 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c {0};..int bits,
10100 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 alg_bits;.../*
10110 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 Cipher name */..
10120 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
10130 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
10140 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 her", SSL_CIPHER
10150 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 _get_name(cipher
10160 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 ), -1);.../* RFC
10170 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 name of cipher
10180 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
10190 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
101a0 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c "standard_name",
101b0 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e SSL_CIPHER_stan
101c0 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 dard_name(cipher
101d0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 ), -1);.../* Ope
101e0 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 nSSL name of cip
101f0 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
10200 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
10210 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d tr, "openssl_nam
10220 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 e", OPENSSL_ciph
10230 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 er_name(SSL_CIPH
10240 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 ER_standard_name
10250 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
10260 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 ../* number of s
10270 65 63 72 65 74 20 62 69 74 73 20 75 73 65 64 20 ecret bits used
10280 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 for cipher */..b
10290 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 its = SSL_CIPHER
102a0 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 _get_bits(cipher
102b0 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c , &alg_bits);..L
102c0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
102d0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 p, objPtr, "secr
102e0 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b et_bits", bits);
102f0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
10300 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 terp, objPtr, "a
10310 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 lgorithm_bits",
10320 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 alg_bits);../* a
10330 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 lg_bits is actua
10340 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 l key secret bit
10350 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 61 s. If use bits a
10360 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 nd secret (algor
10370 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 ithm) bits diffe
10380 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 r,.. the rest
10390 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20 of the bits are
103a0 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 fixed, i.e. for
103b0 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 limited export c
103c0 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 iphers (bits < 5
103d0 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 6) */.../* Indic
103e0 61 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54 ates which SSL/T
103f0 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 LS protocol vers
10400 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65 ion first define
10410 64 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a d the cipher */.
10420 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
10430 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 erp, objPtr, "mi
10440 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f n_version", SSL_
10450 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 CIPHER_get_versi
10460 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b on(cipher), -1);
10470 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 .../* Cipher NID
10480 2c 20 64 69 67 65 73 74 20 4e 49 44 20 28 6e 6f , digest NID (no
10490 6e 65 20 66 6f 72 20 41 45 41 44 20 63 69 70 68 ne for AEAD ciph
104a0 65 72 20 73 75 69 74 65 73 29 2c 20 4b 65 79 20 er suites), Key
104b0 45 78 63 68 61 6e 67 65 20 4e 49 44 2c 20 61 6e Exchange NID, an
104c0 64 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e d authentication
104d0 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 NID */..LAPPEND
104e0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
104f0 50 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22 Ptr, "cipherNID"
10500 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 , (char *)OBJ_ni
10510 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f d2ln(SSL_CIPHER_
10520 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 get_cipher_nid(c
10530 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c ipher)), -1);..L
10540 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
10550 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 p, objPtr, "dige
10560 73 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 stNID", (char *)
10570 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 OBJ_nid2ln(SSL_C
10580 49 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74 IPHER_get_digest
10590 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d _nid(cipher)), -
105a0 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 1);..LAPPEND_STR
105b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
105c0 20 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44 "keyExchangeNID
105d0 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e ", (char *)OBJ_n
105e0 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 id2ln(SSL_CIPHER
105f0 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 _get_kx_nid(ciph
10600 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 er)), -1);..LAPP
10610 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10620 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74 objPtr, "authent
10630 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 icationNID", (ch
10640 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 ar *)OBJ_nid2ln(
10650 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 SSL_CIPHER_get_a
10660 75 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29 uth_nid(cipher))
10670 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 , -1);.../* mess
10680 61 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 age authenticati
10690 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72 on code - Cipher
106a0 20 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47 is AEAD (e.g. G
106b0 43 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50 CM or ChaCha20/P
106c0 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 oly1305) or not
106d0 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 */../* Authentic
106e0 61 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 ated Encryption
106f0 77 69 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 with associated
10700 64 61 74 61 20 28 41 45 41 44 29 20 63 68 65 63 data (AEAD) chec
10710 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f k */..LAPPEND_BO
10720 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 OL(interp, objPt
10730 72 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65 r, "cipher_is_ae
10740 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f ad", SSL_CIPHER_
10750 69 73 5f 61 65 61 64 28 63 69 70 68 65 72 29 29 is_aead(cipher))
10760 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 ;.../* Get OpenS
10770 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 SL-specific ID,
10780 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 not IANA ID */..
10790 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
107a0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
107b0 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 her_id", (int) S
107c0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 SL_CIPHER_get_id
107d0 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 (cipher));.../*
107e0 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64 Two-byte ID used
107f0 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74 in the TLS prot
10800 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65 ocol of the give
10810 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 n cipher */..LAP
10820 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
10830 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 objPtr, "protoc
10840 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 ol_id", (int) SS
10850 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f L_CIPHER_get_pro
10860 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 tocol_id(cipher)
10870 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 );.../* Textual
10880 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 description of t
10890 68 65 20 63 69 70 68 65 72 2e 20 49 6e 63 6c 75 he cipher. Inclu
108a0 64 65 73 3a 20 63 69 70 68 65 72 20 6e 61 6d 65 des: cipher name
108b0 2c 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 , protocol versi
108c0 6f 6e 2c 20 6b 65 79 0a 09 20 20 20 65 78 63 68 on, key.. exch
108d0 61 6e 67 65 2c 20 61 75 74 68 65 6e 74 69 63 61 ange, authentica
108e0 74 69 6f 6e 2c 20 73 79 6d 6d 65 74 72 69 63 20 tion, symmetric
108f0 65 6e 63 72 79 70 74 69 6f 6e 20 6d 65 74 68 6f encryption metho
10900 64 2c 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 d, message authe
10910 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2a ntication code *
10920 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 /..if (SSL_CIPHE
10930 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 R_description(ci
10940 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f pher, buf, sizeo
10950 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 f(buf)) != NULL)
10960 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f {.. LAPPEND_
10970 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
10980 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e tr, "description
10990 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a ", buf, -1);..}.
109a0 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65 64 ../* Digest used
109b0 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c 2f during the SSL/
109c0 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77 68 TLS handshake wh
109d0 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69 70 en using the cip
109e0 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 her. */..md = SS
109f0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61 6e L_CIPHER_get_han
10a00 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63 69 dshake_digest(ci
10a10 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f pher);..LAPPEND_
10a20 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
10a30 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f 64 tr, "handshake_d
10a40 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29 igest", (char *)
10a50 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c EVP_MD_name(md),
10a60 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 -1);. }..
10a70 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f /* Session info
10a80 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 */. session
10a90 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f = SSL_get_sessio
10aa0 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 n(ssl);. if (
10ab0 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 session != NULL)
10ac0 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e {..const unsign
10ad0 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
10ae0 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 ..size_t len2;..
10af0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 unsigned int ule
10b00 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e n;..const unsign
10b10 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
10b20 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e _id, *proto;..un
10b30 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 signed char buff
10b40 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 er[SSL_MAX_MASTE
10b50 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a R_KEY_LENGTH];..
10b60 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 ./* Report the s
10b70 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
10b80 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 as a result of
10b90 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 the ALPN negotia
10ba0 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 tion */..SSL_SES
10bb0 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 SION_get0_alpn_s
10bc0 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c elected(session,
10bd0 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b &proto, &len2);
10be0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
10bf0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 terp, objPtr, "a
10c00 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 lpn", (char *) p
10c10 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 roto, (Tcl_Size)
10c20 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 len2);.../* Rep
10c30 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 ort the selected
10c40 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 protocol as a r
10c50 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e esult of the NPN
10c60 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a negotiation */.
10c70 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 #ifdef USE_NPN..
10c80 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 SSL_get0_next_pr
10c90 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 oto_negotiated(s
10ca0 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 sl, &proto, &ule
10cb0 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 n);..LAPPEND_STR
10cc0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10cd0 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 "npn", (char *)
10ce0 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a proto, (Tcl_Siz
10cf0 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 e) ulen);.#endif
10d00 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 .../* Resumable
10d10 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 session */..LAPP
10d20 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
10d30 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 objPtr, "resuma
10d40 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f ble", SSL_SESSIO
10d50 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 N_is_resumable(s
10d60 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 ession));.../* S
10d70 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d ession start tim
10d80 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 e (seconds since
10d90 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 epoch) */..LAPP
10da0 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c END_LONG(interp,
10db0 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f objPtr, "start_
10dc0 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 time", SSL_SESSI
10dd0 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 ON_get_time(sess
10de0 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 ion));.../* Time
10df0 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f out value - SSL_
10e00 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 CTX_get_timeout
10e10 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a (in seconds) */.
10e20 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e .LAPPEND_LONG(in
10e30 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 terp, objPtr, "t
10e40 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 imeout", SSL_SES
10e50 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 SION_get_timeout
10e60 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a (session));.../*
10e70 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c Session id - TL
10e80 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 Sv1.2 and below
10e90 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e only */..session
10ea0 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f _id = SSL_SESSIO
10eb0 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e N_get_id(session
10ec0 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 , &ulen);..LAPPE
10ed0 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 ND_BARRAY(interp
10ee0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 , objPtr, "sessi
10ef0 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f on_id", session_
10f00 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 id, (Tcl_Size) u
10f10 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 len);.../* Sessi
10f20 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 on context */..s
10f30 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f ession_id = SSL_
10f40 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f SESSION_get0_id_
10f50 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c context(session,
10f60 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e &ulen);..LAPPEN
10f70 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c D_BARRAY(interp,
10f80 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
10f90 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 n_context", sess
10fa0 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a ion_id, (Tcl_Siz
10fb0 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 e) ulen);.../* S
10fc0 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 ession ticket -
10fd0 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 client only */..
10fe0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
10ff0 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c _ticket(session,
11000 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 &ticket, &len2)
11010 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 ;..LAPPEND_BARRA
11020 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 Y(interp, objPtr
11030 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 , "session_ticke
11040 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c t", ticket, (Tcl
11050 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 _Size) len2);...
11060 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 /* Session ticke
11070 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 t lifetime hint
11080 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a (in seconds) */.
11090 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e .LAPPEND_LONG(in
110a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c terp, objPtr, "l
110b0 69 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 ifetime", SSL_SE
110c0 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 SSION_get_ticket
110d0 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 _lifetime_hint(s
110e0 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 ession));.../* T
110f0 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a icket app data *
11100 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 /.#if OPENSSL_VE
11110 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
11120 78 33 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f x30000000L..SSL_
11130 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 SESSION_get0_tic
11140 6b 65 74 5f 61 70 70 64 61 74 61 28 28 53 53 4c ket_appdata((SSL
11150 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 73 _SESSION *) sess
11160 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c ion, &ticket, &l
11170 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 en2);..LAPPEND_B
11180 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 ARRAY(interp, ob
11190 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 jPtr, "ticket_ap
111a0 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c p_data", ticket,
111b0 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
111c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47 );.#endif.../* G
111d0 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f et master key */
111e0 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 ..len2 = SSL_SES
111f0 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f SION_get_master_
11200 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 key(session, buf
11210 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 fer, SSL_MAX_MAS
11220 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b TER_KEY_LENGTH);
11230 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
11240 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11250 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 "master_key", b
11260 75 66 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 uffer, (Tcl_Size
11270 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f ) len2);.../* Co
11280 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a mpression id */.
11290 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 .unsigned int id
112a0 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
112b0 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 et_compress_id(s
112c0 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e ession);..LAPPEN
112d0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
112e0 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 jPtr, "compressi
112f0 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 on_id", id == 1
11300 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 ? "zlib" : "none
11310 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 ", -1);. }..
11320 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f /* Compressio
11330 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 n info */. if
11340 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b (ssl != NULL) {
11350 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c .#ifdef HAVE_SSL
11360 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f _COMPRESSION..co
11370 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 nst COMP_METHOD
11380 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 *comp, *expn;..c
11390 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 omp = SSL_get_cu
113a0 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f rrent_compressio
113b0 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 n(ssl);..expn =
113c0 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f SSL_get_current_
113d0 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a expansion(ssl);.
113e0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
113f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
11400 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d ompression", com
11410 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 p ? SSL_COMP_get
11420 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e _name(comp) : "n
11430 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 one", -1);..LAPP
11440 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11450 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 objPtr, "expansi
11460 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f on", expn ? SSL_
11470 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 COMP_get_name(ex
11480 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 pn) : "none", -1
11490 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e );.#else..LAPPEN
114a0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
114b0 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 jPtr, "compressi
114c0 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 on", "none", -1)
114d0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
114e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
114f0 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e expansion", "non
11500 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a e", -1);.#endif.
11510 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
11520 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 rver info */.
11530 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 {..long mode =
11540 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 SSL_CTX_get_sess
11550 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 ion_cache_mode(s
11560 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 tatePtr->ctx);..
11570 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 char *msg;...if
11580 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 (mode & SSL_SESS
11590 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 _CACHE_OFF) {..
115a0 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a msg = "off";.
115b0 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 .} else if (mode
115c0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
115d0 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 E_CLIENT) {..
115e0 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b msg = "client";
115f0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 ..} else if (mod
11600 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 e & SSL_SESS_CAC
11610 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 HE_SERVER) {..
11620 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22 msg = "server"
11630 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f ;..} else if (mo
11640 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 de & SSL_SESS_CA
11650 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 CHE_BOTH) {..
11660 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 msg = "both";..
11670 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 } else {.. ms
11680 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 g = "unknown";..
11690 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 }..LAPPEND_STR(i
116a0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
116b0 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f session_cache_mo
116c0 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 de", msg, -1);.
116d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 }.. /* CA
116e0 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 List */. /* I
116f0 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20 F not a server,
11700 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30 same as SSL_get0
11710 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 _peer_CA_list. I
11720 66 20 73 65 72 76 65 72 20 73 61 6d 65 20 61 73 f server same as
11730 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 SSL_CTX_get_cli
11740 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 ent_CA_list */.
11750 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c listPtr = Tcl
11760 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
11770 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f ULL);. STACK_
11780 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 OF(X509_NAME) *c
11790 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 a_list;. if (
117a0 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 (ca_list = SSL_g
117b0 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 et_client_CA_lis
117c0 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 t(ssl)) != NULL)
117d0 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b {..char buffer[
117e0 42 55 46 53 49 5a 5d 3b 0a 0a 09 66 6f 72 20 28 BUFSIZ];...for (
117f0 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 int i = 0; i < s
11800 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 k_X509_NAME_num(
11810 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b ca_list); i++) {
11820 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 .. X509_NAME
11830 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f *name = sk_X509_
11840 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 NAME_value(ca_li
11850 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 st, i);.. if
11860 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f (name) {...X509_
11870 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d NAME_oneline(nam
11880 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 e, buffer, BUFSI
11890 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 Z);...Tcl_ListOb
118a0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
118b0 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 nterp, listPtr,
118c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
118d0 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 (buffer, -1));..
118e0 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 }..}. }.
118f0 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 LAPPEND_OBJ(i
11900 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11910 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 72 caList", listPtr
11920 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 );. LAPPEND_I
11930 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
11940 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 r, "caListCount"
11950 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e , sk_X509_NAME_n
11960 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 0a um(ca_list));...
11970 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
11980 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
11990 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
119a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
119b0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
119c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
119d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
119e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
119f0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 -----. *. * Misc
11a00 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 ObjCmd -- misc c
11a10 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 ommands. *. * Re
11a20 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
11a30 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
11a40 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
11a50 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
11a60 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
11a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11aa0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
11ab0 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 c int.MiscObjCmd
11ac0 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
11ad0 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
11ae0 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
11af0 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
11b00 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
11b10 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 static const
11b20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b char *commands [
11b30 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 ] = { "req", "st
11b40 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 rreq", NULL };.
11b50 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 enum command
11b60 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 { C_REQ, C_STRRE
11b70 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 Q, C_DUMMY };.
11b80 20 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a Tcl_Size cmd;.
11b90 20 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 int isStr;.
11ba0 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 char buffer[1
11bb0 36 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 6384];. (void
11bc0 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
11bd0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
11be0 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
11bf0 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f bjc < 2) {..Tcl_
11c00 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
11c10 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 erp, 1, objv, "s
11c20 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f ubcommand ?args?
11c30 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
11c40 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
11c50 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 if (Tcl_GetInde
11c60 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c xFromObj(interp,
11c70 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e objv[1], comman
11c80 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 ds, "command", 0
11c90 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f , &cmd) != TCL_O
11ca0 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
11cb0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
11cc0 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 ERR_clear_err
11cd0 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 or();.. isStr
11ce0 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 = (cmd == C_STR
11cf0 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 REQ);. switch
11d00 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 ((enum command)
11d10 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f cmd) {..case C_
11d20 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 REQ:..case C_STR
11d30 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f REQ: {.. EVP_
11d40 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b PKEY *pkey=NULL;
11d50 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 .. X509 *cert
11d60 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 =NULL;.. X509
11d70 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c _NAME *name=NULL
11d80 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a ;.. Tcl_Obj *
11d90 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63 6c *listv;.. Tcl
11da0 5f 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 _Size listc;..
11db0 20 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 int i;... B
11dc0 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 IO *out=NULL;...
11dd0 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 char *k_C=""
11de0 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 ,*k_ST="",*k_L="
11df0 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d ",*k_O="",*k_OU=
11e00 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 "",*k_CN="",*k_E
11e10 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 mail="";.. ch
11e20 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f ar *keyout,*pemo
11e30 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e ut,*str;.. in
11e40 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c t keysize,serial
11e50 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 =0,days=365;..#i
11e60 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
11e70 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
11e80 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 00000L.. BIGN
11e90 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a UM *bne = NULL;.
11ea0 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 . RSA *rsa =
11eb0 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 NULL;.#else..
11ec0 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 EVP_PKEY_CTX *c
11ed0 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 tx = NULL;.#endi
11ee0 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a f... if ((obj
11ef0 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 c<5) || (objc>6)
11f00 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e ) {...Tcl_WrongN
11f10 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 umArgs(interp, 2
11f20 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 , objv, "keysize
11f30 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c keyfile certfil
11f40 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 e ?info?");...re
11f50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
11f60 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 . }... if
11f70 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
11f80 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
11f90 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 2], &keysize) !=
11fa0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 TCL_OK) {...ret
11fb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
11fc0 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 }.. keyou
11fd0 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 t=Tcl_GetString(
11fe0 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 objv[3]);.. p
11ff0 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 emout=Tcl_GetStr
12000 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 ing(objv[4]);..
12010 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a if (isStr) {.
12020 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 ..Tcl_SetVar(int
12030 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 erp,keyout,"",0)
12040 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 ;...Tcl_SetVar(i
12050 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c nterp,pemout,"",
12060 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 0);.. }...
12070 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a if (objc>=6) {.
12080 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 ..if (Tcl_ListOb
12090 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 jGetElements(int
120a0 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c erp, objv[5], &l
120b0 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d istc, &listv) !=
120c0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 TCL_OK) {...
120d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
120e0 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c R;...}....if ((l
120f0 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a istc%2) != 0) {.
12100 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 .. Tcl_SetRes
12110 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f ult(interp,"Info
12120 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 rmation list mus
12130 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 t have even numb
12140 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 er of arguments"
12150 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 ,NULL);... re
12160 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
12170 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 ..}...for (i=0;
12180 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b i<listc; i+=2) {
12190 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 ... str=Tcl_G
121a0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
121b0 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 ]);... if (st
121c0 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 rcmp(str,"days")
121d0 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 ==0) {....if (Tc
121e0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 l_GetIntFromObj(
121f0 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 interp,listv[i+1
12200 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b ],&days)!=TCL_OK
12210 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 ).... return
12220 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
12230 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
12240 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 mp(str,"serial")
12250 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 ==0) {....if (Tc
12260 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 l_GetIntFromObj(
12270 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 interp,listv[i+1
12280 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f ],&serial)!=TCL_
12290 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 OK).... retur
122a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 n TCL_ERROR;...
122b0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
122c0 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 rcmp(str,"C")==0
122d0 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 ) {....k_C=Tcl_G
122e0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
122f0 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
12300 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
12310 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 r,"ST")==0) {...
12320 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 .k_ST=Tcl_GetStr
12330 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
12340 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
12350 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 (strcmp(str,"L"
12360 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 )==0) {....k_L=T
12370 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
12380 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
12390 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
123a0 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b p(str,"O")==0) {
123b0 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 ....k_O=Tcl_GetS
123c0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
123d0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
123e0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
123f0 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f OU")==0) {....k_
12400 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 OU=Tcl_GetString
12410 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
12420 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
12430 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d trcmp(str,"CN")=
12440 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 =0) {....k_CN=Tc
12450 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
12460 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
12470 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
12480 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 (str,"Email")==0
12490 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 ) {....k_Email=T
124a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
124b0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
124c0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f } else {....Tcl_
124d0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
124e0 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 ,"Unknown parame
124f0 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 ter",NULL);....r
12500 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
12510 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 ... }...}..
12520 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c }..#if OPENSSL
12530 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
12540 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 < 0x30000000L..
12550 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 bne = BN_new(
12560 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 );.. rsa = RS
12570 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b A_new();.. pk
12580 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 ey = EVP_PKEY_ne
12590 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e w();.. if (bn
125a0 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 e == NULL || rsa
125b0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 == NULL || pkey
125c0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f == NULL || !BN_
125d0 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 set_word(bne,RSA
125e0 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 _F4) ||...!RSA_g
125f0 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 enerate_key_ex(r
12600 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 sa, keysize, bne
12610 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f , NULL) || !EVP_
12620 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 PKEY_assign_RSA(
12630 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 pkey, rsa)) {...
12640 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
12650 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 ey);.../* RSA_fr
12660 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 ee(rsa); freed b
12670 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 y EVP_PKEY_free
12680 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 */...BN_free(bne
12690 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b );.#else.. pk
126a0 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e ey = EVP_RSA_gen
126b0 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 ((unsigned int)
126c0 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 keysize);.. c
126d0 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 tx = EVP_PKEY_CT
126e0 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 X_new(pkey,NULL)
126f0 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 ;.. if (pkey
12700 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d == NULL || ctx =
12710 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 = NULL || !EVP_P
12720 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 KEY_keygen_init(
12730 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 ctx) ||...!EVP_P
12740 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f KEY_CTX_set_rsa_
12750 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c keygen_bits(ctx,
12760 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 keysize) || !EV
12770 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 P_PKEY_keygen(ct
12780 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 x, &pkey)) {...E
12790 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 VP_PKEY_free(pke
127a0 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 y);...EVP_PKEY_C
127b0 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 TX_free(ctx);.#e
127c0 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 ndif...Tcl_SetRe
127d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 sult(interp,"Err
127e0 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 or generating pr
127f0 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 ivate key",NULL)
12800 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;...return TCL_E
12810 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 RROR;.. } els
12820 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 e {...if (isStr)
12830 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
12840 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 _new(BIO_s_mem()
12850 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 );... PEM_wri
12860 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 te_bio_PrivateKe
12870 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c y(out,pkey,NULL,
12880 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c NULL,0,NULL,NULL
12890 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 );... i=BIO_r
128a0 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 ead(out,buffer,s
128b0 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 izeof(buffer)-1)
128c0 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 ;... i=(i<0)
128d0 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 ? 0 : i;... b
128e0 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 uffer[i]='\0';..
128f0 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 . Tcl_SetVar(
12900 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 interp,keyout,bu
12910 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 ffer,0);... B
12920 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 IO_flush(out);..
12930 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 . BIO_free(ou
12940 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 t);...} else {..
12950 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
12960 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a (BIO_s_file());.
12970 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f .. BIO_write_
12980 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 filename(out,key
12990 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f out);... PEM_
129a0 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 write_bio_Privat
129b0 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 eKey(out,pkey,NU
129c0 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e LL,NULL,0,NULL,N
129d0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 ULL);... /* P
129e0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 EM_write_bio_RSA
129f0 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 PrivateKey(out,
12a00 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c rsa, NULL, NULL,
12a10 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0, NULL, NULL);
12a20 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 */... BIO_fr
12a30 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 ee_all(out);.. .
12a40 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 }....if ((cert=X
12a50 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 509_new())==NULL
12a60 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 ) {... Tcl_Se
12a70 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
12a80 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 Error generating
12a90 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71 certificate req
12aa0 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 uest",NULL);...
12ab0 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 EVP_PKEY_free
12ac0 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e (pkey);.#if OPEN
12ad0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
12ae0 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
12af0 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 ... BN_free(b
12b00 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 ne);.#endif...
12b10 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 return(TCL_ERR
12b20 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 OR);...}....X509
12b30 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 _set_version(cer
12b40 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 t,2);...ASN1_INT
12b50 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 EGER_set(X509_ge
12b60 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 t_serialNumber(c
12b70 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 ert),serial);...
12b80 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 X509_gmtime_adj(
12b90 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 X509_getm_notBef
12ba0 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 ore(cert),0);...
12bb0 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 X509_gmtime_adj(
12bc0 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 X509_getm_notAft
12bd0 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 er(cert),(long)6
12be0 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 0*60*24*days);..
12bf0 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 .X509_set_pubkey
12c00 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 (cert,pkey);....
12c10 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 name=X509_get_su
12c20 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 bject_name(cert)
12c30 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 ;....X509_NAME_a
12c40 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
12c50 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 name,"C", MBSTRI
12c60 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
12c70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
12c80 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b k_C, -1, -1, 0);
12c90 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
12ca0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
12cb0 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e me,"ST", MBSTRIN
12cc0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
12cd0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
12ce0 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _ST, -1, -1, 0);
12cf0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
12d00 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
12d10 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 me,"L", MBSTRING
12d20 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
12d30 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
12d40 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 L, -1, -1, 0);..
12d50 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
12d60 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
12d70 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 ,"O", MBSTRING_A
12d80 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
12d90 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c ned char *) k_O,
12da0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
12db0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
12dc0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
12dd0 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 OU", MBSTRING_AS
12de0 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
12df0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c ed char *) k_OU,
12e00 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
12e10 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
12e20 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
12e30 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 CN", MBSTRING_AS
12e40 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
12e50 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c ed char *) k_CN,
12e60 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
12e70 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
12e80 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
12e90 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 Email", MBSTRING
12ea0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
12eb0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
12ec0 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 Email, -1, -1, 0
12ed0 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 );....X509_set_s
12ee0 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 ubject_name(cert
12ef0 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 ,name);....if (!
12f00 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 X509_sign(cert,p
12f10 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 key,EVP_sha256()
12f20 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f )) {... X509_
12f30 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 free(cert);...
12f40 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 EVP_PKEY_free(
12f50 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 pkey);.#if OPENS
12f60 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
12f70 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
12f80 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e .. BN_free(bn
12f90 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 e);.#endif...
12fa0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
12fb0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 nterp,"Error sig
12fc0 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 ning certificate
12fd0 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 ",NULL);... r
12fe0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
12ff0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 ...}....if (isSt
13000 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 r) {... out=B
13010 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d IO_new(BIO_s_mem
13020 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ());... PEM_w
13030 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 rite_bio_X509(ou
13040 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 t,cert);... i
13050 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 =BIO_read(out,bu
13060 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 ffer,sizeof(buff
13070 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d er)-1);... i=
13080 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 (i<0) ? 0 : i;..
13090 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 . buffer[i]='
130a0 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 \0';... Tcl_S
130b0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d etVar(interp,pem
130c0 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 out,buffer,0);..
130d0 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f . BIO_flush(o
130e0 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 ut);... BIO_f
130f0 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c ree(out);...} el
13100 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 se {... out=B
13110 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c IO_new(BIO_s_fil
13120 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f e());... BIO_
13130 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f write_filename(o
13140 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 ut,pemout);...
13150 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
13160 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a X509(out,cert);.
13170 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 .. BIO_free_a
13180 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 ll(out);...}....
13190 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b X509_free(cert);
131a0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
131b0 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e (pkey);.#if OPEN
131c0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
131d0 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
131e0 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b ...BN_free(bne);
131f0 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 .#endif.. }..
13200 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 }..break;. de
13210 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 fault:..break;.
13220 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
13230 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a TCL_OK;.}.../***
13240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13250 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 */./* Init
13260 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a */./*****
13270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
13280 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
13290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
132a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
132b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
132c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
132d0 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a Tls_Free --. *.
132e0 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
132f0 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e e cleans up when
13300 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
13310 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 sed channel. *.i
13320 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 s closed and its
13330 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
13340 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 falls below 1.
13350 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
13360 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .none. *. * Side
13370 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 effects:. *.Fre
13380 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 es all the state
13390 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
133a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
133b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
133c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
133d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
133e0 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 id.Tls_Free(char
133f0 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 *blockPtr) {.
13400 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
13410 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f r = (State *)blo
13420 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 ckPtr;.. dpri
13430 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
13440 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 Tls_Clean(st
13450 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 atePtr);. ckf
13460 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d ree(blockPtr);.}
13470 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
13480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
134a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
134b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
134c0 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 * Tls_Clean --.
134d0 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
134e0 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 ure cleans up wh
134f0 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 en a SSL socket
13500 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a based channel. *
13510 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 .is closed and i
13520 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 ts reference cou
13530 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 nt falls below 1
13540 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 . This should.
13550 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 *.be called sync
13560 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 hronously by the
13570 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 CloseProc, not
13580 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 in the. *.Eventu
13590 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 allyFree callbac
135a0 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 k.. *. * Results
135b0 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.none. *. *
135c0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
135d0 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 .Frees all the s
135e0 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d tate. *. *------
135f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
13630 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e /.void Tls_Clean
13640 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 (State *statePtr
13650 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ) {. dprintf(
13660 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
13670 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 /*. * we're
13680 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 assuming here th
13690 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d at we're single-
136a0 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f threaded. */
136b0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
136c0 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c r->timer != (Tcl
136d0 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c _TimerToken) NUL
136e0 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 L) {..Tcl_Delete
136f0 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 TimerHandler(sta
13700 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 tePtr->timer);..
13710 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
13720 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 = NULL;. }..
13730 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
13740 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 >protos) {..ckfr
13750 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f ee(statePtr->pro
13760 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d tos);..statePtr-
13770 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a >protos = NULL;.
13780 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
13790 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 atePtr->bio) {..
137a0 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c /* This will cal
137b0 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 l SSL_shutdown.
137c0 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 Bug 1414045 */..
137d0 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 dprintf("BIO_fre
137e0 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 e_all(%p)", stat
137f0 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f ePtr->bio);..BIO
13800 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 _free_all(stateP
13810 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 tr->bio);..state
13820 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b Ptr->bio = NULL;
13830 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
13840 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a tatePtr->ssl) {.
13850 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 .dprintf("SSL_fr
13860 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 ee(%p)", statePt
13870 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 r->ssl);..SSL_fr
13880 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ee(statePtr->ssl
13890 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 );..statePtr->ss
138a0 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a l = NULL;. }.
138b0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
138c0 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 ->ctx) {..SSL_CT
138d0 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d X_free(statePtr-
138e0 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 >ctx);..statePtr
138f0 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->ctx = NULL;.
13900 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
13910 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 ePtr->callback)
13920 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f {..Tcl_DecrRefCo
13930 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 unt(statePtr->ca
13940 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 llback);..stateP
13950 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e tr->callback = N
13960 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
13970 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 f (statePtr->pas
13980 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 sword) {..Tcl_De
13990 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
139a0 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a Ptr->password);.
139b0 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 .statePtr->passw
139c0 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ord = NULL;.
139d0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
139e0 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c tr->vcmd) {..Tcl
139f0 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _DecrRefCount(st
13a00 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 atePtr->vcmd);..
13a10 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
13a20 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
13a30 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 dprintf("Retur
13a40 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 23 69 66 20 ning");.}...#if
13a50 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
13a60 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 N > 8.#define MI
13a70 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a N_VERSION "9.0".
13a80 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 #else.#define MI
13a90 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a N_VERSION "8.5".
13aa0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d #endif../*. *---
13ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13af0 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 . *. * Tls_Init
13b00 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 --. *. *.This is
13b10 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 a package initi
13b20 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 alization proced
13b30 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 ure, which is ca
13b40 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 lled. *.by Tcl w
13b50 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 hen this package
13b60 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 is to be added
13b70 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 to an interprete
13b80 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 r.. *. * Results
13b90 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 : Ssl configure
13ba0 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a d and loaded. *.
13bb0 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
13bc0 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 . *. create the
13bd0 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 ssl command, ini
13be0 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 tialize ssl cont
13bf0 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ext. *. *-------
13c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
13c40 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 .DLLEXPORT int T
13c50 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 ls_Init(Tcl_Inte
13c60 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 rp *interp) {.
13c70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 const char tls
13c80 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 TclInitScript[]
13c90 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c = {.#include "tl
13ca0 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 s.tcl.h"..0x00.
13cb0 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e };.. dprin
13cc0 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 tf("Called");..#
13cd0 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 ifdef USE_TCL_ST
13ce0 55 42 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f UBS. if (Tcl_
13cf0 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 InitStubs(interp
13d00 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 , MIN_VERSION, 0
13d10 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 ) == NULL) {..re
13d20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
13d30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 }.#endif.
13d40 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 if (Tcl_PkgRequ
13d50 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c ire(interp, "Tcl
13d60 22 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 ", MIN_VERSION,
13d70 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 0) == NULL) {..r
13d80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
13d90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
13da0 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d TlsLibInit(0) !=
13db0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f TCL_OK) {..Tcl_
13dc0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
13dd0 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 erp, "could not
13de0 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c initialize SSL l
13df0 69 62 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a ibrary", (char *
13e00 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
13e10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
13e20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 }.. Tcl_Creat
13e30 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
13e40 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 rp, "tls::connec
13e50 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f tion", Connectio
13e60 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c nInfoObjCmd, (Cl
13e70 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
13e80 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
13e90 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
13ea0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
13eb0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
13ec0 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 ls::handshake",
13ed0 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c HandshakeObjCmd,
13ee0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
13ef0 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
13f00 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
13f10 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
13f20 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
13f30 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c , "tls::import",
13f40 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 ImportObjCmd, (
13f50 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
13f60 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
13f70 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
13f80 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
13f90 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
13fa0 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 "tls::misc", Mis
13fb0 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 cObjCmd, (Client
13fc0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c Data) NULL, (Tcl
13fd0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
13fe0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
13ff0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
14000 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
14010 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 unimport", Unimp
14020 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 ortObjCmd, (Clie
14030 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
14040 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
14050 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
14060 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
14070 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
14080 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 ::status", Statu
14090 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 sObjCmd, (Client
140a0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c Data) NULL, (Tcl
140b0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
140c0 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 6c ) NULL);.. Tl
140d0 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73 s_DigestCommands
140e0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 6c (interp);. Tl
140f0 73 5f 45 6e 63 72 79 70 74 43 6f 6d 6d 61 6e 64 s_EncryptCommand
14100 73 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 s(interp);. T
14110 6c 73 5f 49 6e 66 6f 43 6f 6d 6d 61 6e 64 73 28 ls_InfoCommands(
14120 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 6c 73 interp);. Tls
14130 5f 4b 44 46 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 _KDFCommands(int
14140 65 72 70 29 3b 0a 20 20 20 20 54 6c 73 5f 52 61 erp);. Tls_Ra
14150 6e 64 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 ndCommands(inter
14160 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 p);.. if (int
14170 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c erp) {..Tcl_Eval
14180 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 (interp, tlsTclI
14190 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 20 20 nitScript);.
141a0 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 }.. return Tc
141b0 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 l_PkgProvide(int
141c0 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d erp, PACKAGE_NAM
141d0 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 E, PACKAGE_VERSI
141e0 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d ON);.}../*. *---
141f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14220 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 ---*. *. *.Tls_S
14230 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a afeInit --. *. *
14240 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
14250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14270 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 -*. *.Standard p
14280 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65 rocedure require
14290 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 d by 'load'.. *.
142a0 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 Initializes this
142b0 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 extension for a
142c0 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 safe interprete
142d0 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d r.. *.----------
142e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
142f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14300 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 ------*. *. *.Si
14310 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 de effects:. *..
14320 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 As of 'Tls_Init'
14330 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 . *. *.Result:.
14340 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *..A standard Tc
14350 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a l error code.. *
14360 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
14370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 ---------*. */.D
143a0 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 LLEXPORT int Tls
143b0 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e _SafeInit(Tcl_In
143c0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a terp *interp) {.
143d0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
143e0 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 led");. retur
143f0 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 n(Tls_Init(inter
14400 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d p));.}../*. *---
14410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14440 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 ---*. *. *.TlsLi
14450 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d bInit --. *. *.-
14460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
14490 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 . *.Initializes
144a0 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 SSL library once
144b0 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e per application
144c0 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
144d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144f0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 ----*. *. *.Side
14500 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e effects:. *..in
14510 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 itializes SSL li
14520 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 brary. *. *.Resu
14530 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a lt:. *..none. *.
14540 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
14550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14570 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 --------*. */.st
14580 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 atic int TlsLibI
14590 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 nit(int uninitia
145a0 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 lize) {. stat
145b0 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a ic int initializ
145c0 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 ed = 0;. int
145d0 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b status = TCL_OK;
145e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
145f0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
14600 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
14610 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 EADS). size_t
14620 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 num_locks;.#end
14630 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e if.. if (unin
14640 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 itialize) {..if
14650 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b (!initialized) {
14660 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 .. dprintf("A
14670 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 sked to uninitia
14680 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 lize, but we are
14690 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 not initialized
146a0 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e ");... return
146b0 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 (TCL_OK);..}...d
146c0 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f printf("Asked to
146d0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b uninitialize");
146e0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
146f0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
14700 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
14710 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 READS)..Tcl_Mute
14720 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b xLock(&init_mx);
14730 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a ...if (locks) {.
14740 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 . free(locks)
14750 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e ;.. locks = N
14760 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 ULL;.. locksC
14770 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e ount = 0;..}.#en
14780 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 dif..initialized
14790 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e = 0;..#if defin
147a0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
147b0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
147c0 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c CL_THREADS)..Tcl
147d0 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e _MutexUnlock(&in
147e0 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a it_mx);.#endif..
147f0 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b .return(TCL_OK);
14800 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
14810 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
14820 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c dprintf("Called,
14830 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 but using cache
14840 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 d value");..retu
14850 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 20 rn(status);.
14860 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 }.. dprintf("
14870 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 Called");..#if d
14880 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
14890 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
148a0 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
148b0 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 Tcl_MutexLoc
148c0 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e k(&init_mx);.#en
148d0 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 dif. initiali
148e0 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 zed = 1;..#if de
148f0 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
14900 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
14910 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 d(TCL_THREADS).
14920 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 num_locks = 1
14930 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 ;. locksCount
14940 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 = (int) num_loc
14950 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 ks;. locks =
14960 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c malloc(sizeof(*l
14970 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b ocks) * num_lock
14980 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c s);. memset(l
14990 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 ocks, 0, sizeof(
149a0 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f *locks) * num_lo
149b0 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 cks);.#endif..
149c0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 /* Initialize
149d0 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 BOTH libcrypto a
149e0 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 nd libssl. */.
149f0 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 OPENSSL_init_s
14a00 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f sl(OPENSSL_INIT_
14a10 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 LOAD_SSL_STRINGS
14a20 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f | OPENSSL_INIT_
14a30 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 LOAD_CRYPTO_STRI
14a40 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 NGS..| OPENSSL_I
14a50 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 NIT_ADD_ALL_CIPH
14a60 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e ERS | OPENSSL_IN
14a70 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 IT_ADD_ALL_DIGES
14a80 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 TS, NULL);..
14a90 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c BIO_new_tcl(NULL
14aa0 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 , 0);..#if 0.
14ab0 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 /*. * XXX:T
14ac0 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 ODO: Remove this
14ad0 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 code and replac
14ae0 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63 e it with a chec
14af0 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f k. * for eno
14b00 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 ugh entropy and
14b10 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 do not try to cr
14b20 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 eate our own.
14b30 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74 * terrible ent
14b40 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ropy. */.
14b50 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20 /*. * Seed
14b60 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 the random numbe
14b70 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 r generator in t
14b80 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a he SSL library,.
14b90 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65 * using the
14ba0 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 do/while constr
14bb0 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 uct because of t
14bc0 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 he bug note in t
14bd0 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 he. * OpenSS
14be0 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f L FAQ at http://
14bf0 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f www.openssl.org/
14c00 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c support/faq.html
14c10 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 #USER1. *.
14c20 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66 * The crux of
14c30 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 the problem is
14c40 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64 that Solaris 7 d
14c50 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 oes not have a.
14c60 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f * /dev/rando
14c70 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f m or /dev/urando
14c80 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 m device so it c
14c90 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f annot gather eno
14ca0 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f ugh. * entro
14cb0 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 py from the RAND
14cc0 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 _seed() when TLS
14cd0 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 initializes and
14ce0 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 refuses. *
14cf0 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 to go further. E
14d00 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 arlier versions
14d10 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 of OpenSSL carri
14d20 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 ed on regardless
14d30 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 .. */. sr
14d40 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e and((unsigned in
14d50 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 t) time((time_t
14d60 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 *) NULL));. d
14d70 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b o {..for (i = 0;
14d80 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a i < 16; i++) {.
14d90 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d . rnd_seed[i]
14da0 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 = 1 + (char) (2
14db0 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 55.0 * rand()/(R
14dc0 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 AND_MAX+1.0));..
14dd0 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 }..RAND_seed(rnd
14de0 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e _seed, sizeof(rn
14df0 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 d_seed));. }
14e00 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 while (RAND_stat
14e10 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 us() != 1);.#end
14e20 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 if..#if defined(
14e30 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
14e40 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
14e50 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c THREADS). Tcl
14e60 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e _MutexUnlock(&in
14e70 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a it_mx);.#endif..
14e80 20 20 20 20 72 65 74 75 72 6e 28 73 74 61 74 75 return(statu
14e90 73 29 3b 0a 7d 0a s);.}.